Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion AndroidHttpClient and SocketTimeoutException on some configuration

Received: by 10.59.0.194 with SMTP id ba2mr638030ved.19.1352221776909;
        Tue, 06 Nov 2012 09:09:36 -0800 (PST)
X-BeenThere: android-developers@googlegroups.com
Received: by 10.220.107.208 with SMTP id c16ls666278vcp.3.gmail; Tue, 06 Nov
 2012 09:06:33 -0800 (PST)
Received: by 10.52.91.109 with SMTP id cd13mr376238vdb.15.1352221593910;
        Tue, 06 Nov 2012 09:06:33 -0800 (PST)
Date: Tue, 6 Nov 2012 09:06:33 -0800 (PST)
From: Streets Of Boston <flyingdutc...@gmail.com>
To: android-developers@googlegroups.com
Message-Id: <136efadd-072c-4f90-89aa-2d2e19dbc9d7@googlegroups.com>
In-Reply-To: <b2fbf3ee-3f14-439c-a215-964fee234501@googlegroups.com>
References: <5fecbfd9-c4c2-4dec-a618-57131660106f@googlegroups.com>
 <d951389b-f307-4474-91da-459da0e906d6@googlegroups.com>
 <02e75bdc-33f5-4114-9c24-40f61de1ff5e@googlegroups.com>
 <CAON6sPqgs+abn_9hp=PD2+hn2ThZz6MDupH9FnAP-av1J_bDuA@mail.gmail.com>
 <14664fb0-22a7-4251-bc28-1cae3c4d438f@googlegroups.com>
 <CAON6sPopvFwFDcxVRjp8qZi=EsR59uRO4GfKfk2uFxFGNMwr3g@mail.gmail.com>
 <505dcbe6-2287-491b-9385-9f9ca4ff3a28@googlegroups.com>
 <b2fbf3ee-3f14-439c-a215-964fee234501@googlegroups.com>
Subject: Re: [android-developers] Re: AndroidHttpClient and
 SocketTimeoutException on some configuration
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_701_15038727.1352221593441"

------=_Part_701_15038727.1352221593441
Content-Type: multipart/alternative; 
	boundary="----=_Part_702_23918214.1352221593441"

------=_Part_702_23918214.1352221593441
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

Hi Thomas,

Here is the full-source of my HttpClientUtils.java. Use its static 'get' 
method to obtain an HttpClient. Try to use it and see it it works in your 
case.

Here is how you could use the HttpClientUtils class (it is thread safe and 
uses pooled connections):
HttpClient client = null;
HttpGet    request = null;
HttpResponse response = null;
try {
client = *HttpClientUtils.get(context)*;
request = new HttpGet(url);
response = client.execute(request);
someMethodThatParsesTheResponse(response);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
finally {
*HttpClientUtils.release(response, request, client)*;
}



Here is the HttpClientUtils source code:
=========================
package somepackage;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.net.SocketException;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import javax.net.ssl.SSLHandshakeException;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.RequestWrapper;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.BasicHttpProcessor;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;

import android.content.ContentResolver;
import android.content.Context;
import android.net.SSLCertificateSocketFactory;
import android.net.SSLSessionCache;
import android.util.Log;


/**
 * This class handle HttpClient instances. You can get one and use it to 
release 
 * the resources associated with the HttpClient.
 * @author Anton Spaans
 *
 */
public abstract class HttpClientUtils {
private static final String USER_AGENT = "Android Blio";
private static AndroidHttpClient androidHttpClient = null;
 private static final ThreadLocal<ReleaseHolder> RELEASE_HOLDER = 
new ThreadLocal<ReleaseHolder>() {
@Override
protected ReleaseHolder initialValue() {
return new ReleaseHolder();
}
};
 /**
 * This method returns a HttpClient that can be used to download info or 
update info 
 * on web-services.
 * The HttpClient should be treated as 'read-only': Don't start modifying 
its settings
 * and properties, since this client could be cached and used by multiple 
threads at 
 * the same time.
 * @param context.
 * @return An HttpClient
 */
public static synchronized HttpClient get(Context context) {
if (androidHttpClient == null) {
androidHttpClient = AndroidHttpClient.newInstance(USER_AGENT, context);
}
 return androidHttpClient;
}
 /**
 * Save a response to be released/closed later.
 * The actual release of it will be done when {@link #releaseNow()} is 
called.
 * @param response
 */
public static void releaseLater(HttpResponse response) {
RELEASE_HOLDER.get().response = response;
}
 /**
 * Save a htttp-request to be released/closed later.
 * The actual release of it will be done when {@link #releaseNow()} is 
called.
 * @param method
 */
public static void releaseLater(HttpRequestBase method) {
RELEASE_HOLDER.get().method = method;
}

/**
 * Save an HttpClient to be released/closed later.
 * The actual release of it will be done when {@link #releaseNow()} is 
called.
 * @param client
 */
public static void releaseLater(HttpClient client) {
RELEASE_HOLDER.get().client = client;
}
 /**
 * Release any previously saved response, method or client.
 */
public static void releaseNow() {
RELEASE_HOLDER.get().cleanUp();
}

/**
 * Aborts current request. 
 * Call this only on a failure or cancellation.
 */
public static void abort() {
HttpRequestBase method = RELEASE_HOLDER.get().method;
if (method != null) {
if (!method.isAborted()) {
method.abort();
}
RELEASE_HOLDER.get().method = null;
}
}
 /**
 * Release/close the give response, method and client used in the latest 
http-request execution.
 * @param response
 * @param method
 * @param client
 */
public static void release(HttpResponse response, HttpRequestBase method, 
HttpClient client) {
if (response != null) {
HttpEntity entity = response.getEntity();
if (entity != null) {
try { entity.consumeContent(); } catch (IOException e) { }
}
}
// if (method != null) {
// method.abort();
// }
//      Commented out: The client is being re-used. Don't close it after a 
request. 
// if (client != null && client instanceof AndroidHttpClient) {
// ((AndroidHttpClient)client).close();
// }
}
 private static class ReleaseHolder  {
HttpResponse response;
HttpRequestBase method;
HttpClient client;
 public void cleanUp() {
release(response, method, client);
response = null;
method = null;
client = null;
}
}
 /**
 * Retries on failing Http connections. The default handler didn't deal 
with SocketExceptions at 
 * all... and those are the ones we get most.
 * 
 * @author Anton Spaans
 */
private static class RetryHandler implements HttpRequestRetryHandler {
@Override
public boolean retryRequest(IOException exception, int executionCount, 
HttpContext context) {
        if (exception == null) {
            throw new IllegalArgumentException("Exception parameter may not 
be null");
        }
        
        if (context == null) {
            throw new IllegalArgumentException("HTTP context may not be 
null");
        }
        
        if (executionCount > 3) {
            return false;
        }
        
        if (exception instanceof NoHttpResponseException) {
            // Retry if the server dropped connection on us
            return true;
        }
        
if (exception instanceof SocketException) {
// Retry if the server closed socket on us
return true;
}
        if (exception instanceof InterruptedIOException) {
            // Timeout
            return false;
        }
        
        if (exception instanceof UnknownHostException) {
            // Unknown host
            return false;
        }
        
        if (exception instanceof SSLHandshakeException) {
            // SSL handshake exception
            return false;
        }
        
        Boolean b = 
(Boolean)context.getAttribute(ExecutionContext.HTTP_REQ_SENT);
        boolean sent = (b != null && b.booleanValue());
        if (!sent) {
            // Retry if the request has not been sent fully or
            // if it's OK to retry methods that have been sent
            return true;
        }

        HttpRequest request = (HttpRequest) 
context.getAttribute(ExecutionContext.HTTP_REQUEST);
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
if (idempotent) {
// Retry if the request is considered idempotent
return true;
}

// otherwise do not retry
        return false;
}
} 
 /**
 * Modified from Google/Android as follows:
 * - When a request happens on the UI-thread, don't throw an exception. 
Just log it.
 *  - Added a RetryHandler to handle SocketExceptions.
 *  
 *  
 * Subclass of the Apache {@link DefaultHttpClient} that is configured with
 * reasonable default settings and registered schemes for Android, and
 * also lets the user add {@link HttpRequestInterceptor} classes.
 * Don't create this directly, use the {@link #newInstance} factory method.
 *
 * <p>This client processes cookies but does not retain them by default.
 * To retain cookies, simply add a cookie store to the HttpContext:</p>
 *
 * <pre>context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);</pre>
 */
public static final class AndroidHttpClient implements HttpClient {

    // Gzip of data shorter than this probably won't be worthwhile
    public static long DEFAULT_SYNC_MIN_GZIP_BYTES = 256;

    // Default connection and socket timeout of 60 seconds.  Tweak to taste.
    private static final int SOCKET_OPERATION_TIMEOUT = 60 * 1000;

    private static final String TAG = "AndroidHttpClient";

    
// Removed ANR warning from logs. Documented in TRAC. 
    
    /** Interceptor throws an exception if the executing thread is blocked 
*/
    private static final HttpRequestInterceptor sThreadCheckInterceptor = 
new HttpRequestInterceptor() {
        public void process(HttpRequest request, HttpContext context) {
            // Prevent the HttpRequest from being sent on the main thread
//            if (Looper.myLooper() != null && Looper.myLooper() == 
Looper.getMainLooper() ) {
//     Log.w("ANR", "!!! Risk for ANR !!!", new Exception("HttpClient is 
being used on the main UI thread."));
//            }
        }
    };

    /**
     * Create a new HttpClient with reasonable defaults (which you can 
update).
     *
     * @param userAgent to report in your HTTP requests
     * @param context to use for caching SSL sessions (may be null for no 
caching)
     * @return AndroidHttpClient for you to use for all your requests.
     */
    public static AndroidHttpClient newInstance(String userAgent, Context 
context) {
        HttpParams params = new BasicHttpParams();

        // Turn off stale checking.  Our connections break all the time 
anyway,
        // and it's not worth it to pay the penalty of checking every time.
        HttpConnectionParams.setStaleCheckingEnabled(params, false);

        HttpConnectionParams.setConnectionTimeout(params, 
SOCKET_OPERATION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(params, SOCKET_OPERATION_TIMEOUT);
        HttpConnectionParams.setSocketBufferSize(params, 8192);

        // Don't handle redirects -- return them to the caller.  Our code
        // often wants to re-POST after a redirect, which we must do 
ourselves.
        HttpClientParams.setRedirecting(params, false);

        // Use a session cache for SSL sockets
        SSLSessionCache sessionCache = context == null ? null : new 
SSLSessionCache(context);

        // Set the specified user agent and register standard protocols.
        HttpProtocolParams.setUserAgent(params, userAgent);
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", 
PlainSocketFactory.getSocketFactory(), 80));
        schemeRegistry.register(new Scheme("https", 
SSLCertificateSocketFactory.getHttpSocketFactory(SOCKET_OPERATION_TIMEOUT, 
sessionCache), 443));

        ClientConnectionManager manager = new 
ThreadSafeClientConnManager(params, schemeRegistry);

        // We use a factory method to modify superclass initialization
        // parameters without the funny call-a-static-method dance.
        return new AndroidHttpClient(manager, params);
    }

    /**
     * Create a new HttpClient with reasonable defaults (which you can 
update).
     * @param userAgent to report in your HTTP requests.
     * @return AndroidHttpClient for you to use for all your requests.
     */
    public static AndroidHttpClient newInstance(String userAgent) {
        return newInstance(userAgent, null /* session cache */);
    }

    private final HttpClient delegate;

    private RuntimeException mLeakedException = new IllegalStateException(
            "AndroidHttpClient created and never closed");

    private final HttpRequestRetryHandler retryHandler = new RetryHandler();
    
    private AndroidHttpClient(ClientConnectionManager ccm, HttpParams 
params) {
        DefaultHttpClient httpClient = new DefaultHttpClient(ccm, params) {
            @Override
            protected BasicHttpProcessor createHttpProcessor() {
                // Add interceptor to prevent making requests from main 
thread.
                BasicHttpProcessor processor = super.createHttpProcessor();
                processor.addRequestInterceptor(sThreadCheckInterceptor);
                processor.addRequestInterceptor(new CurlLogger());

                return processor;
            }

            @Override
            protected HttpContext createHttpContext() {
                // Same as DefaultHttpClient.createHttpContext() minus the
                // cookie store.
                HttpContext context = new BasicHttpContext();
                context.setAttribute(
                        ClientContext.AUTHSCHEME_REGISTRY,
                        getAuthSchemes());
                context.setAttribute(
                        ClientContext.COOKIESPEC_REGISTRY,
                        getCookieSpecs());
                context.setAttribute(
                        ClientContext.CREDS_PROVIDER,
                        getCredentialsProvider());
                return context;
            }
        };
        
        httpClient.setHttpRequestRetryHandler(retryHandler);
        
        this.delegate = httpClient;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        if (mLeakedException != null) {
            Log.e(TAG, "Leak found", mLeakedException);
            mLeakedException = null;
        }
    }

    /**
     * Modifies a request to indicate to the server that we would like a
     * gzipped response.  (Uses the "Accept-Encoding" HTTP header.)
     * @param request the request to modify
     * @see #getUngzippedContent
     */
    public static void modifyRequestToAcceptGzipResponse(HttpRequest 
request) {
        request.addHeader("Accept-Encoding", "gzip");
    }

    /**
     * Gets the input stream from a response entity.  If the entity is 
gzipped
     * then this will get a stream over the uncompressed data.
     *
     * @param entity the entity whose content should be read
     * @return the input stream to read from
     * @throws IOException
     */
    public static InputStream getUngzippedContent(HttpEntity entity)
            throws IOException {
        InputStream responseStream = entity.getContent();
        if (responseStream == null) return responseStream;
        Header header = entity.getContentEncoding();
        if (header == null) return responseStream;
        String contentEncoding = header.getValue();
        if (contentEncoding == null) return responseStream;
        if (contentEncoding.contains("gzip")) responseStream
                = new GZIPInputStream(responseStream);
        return responseStream;
    }

    /**
     * Release resources associated with this client.  You must call this,
     * or significant resources (sockets and memory) may be leaked.
     */
    public void close() {
        if (mLeakedException != null) {
            getConnectionManager().shutdown();
            mLeakedException = null;
        }
    }

    public HttpParams getParams() {
        return delegate.getParams();
    }

    public ClientConnectionManager getConnectionManager() {
        return delegate.getConnectionManager();
    }

    public HttpResponse execute(HttpUriRequest request) throws IOException {
        try {
return delegate.execute(request);
} catch (IOException e) {
try { request.abort(); } catch (Exception ee) {}
throw e;
}
    }

    public HttpResponse execute(HttpUriRequest request, HttpContext context)
            throws IOException {
        try {
        return delegate.execute(request, context);
} catch (IOException e) {
try { request.abort(); } catch (Exception ee) {}
throw e;
}
    }

    public HttpResponse execute(HttpHost target, HttpRequest request)
            throws IOException {
        return delegate.execute(target, request);
    }

    public HttpResponse execute(HttpHost target, HttpRequest request,
            HttpContext context) throws IOException {
        return delegate.execute(target, request, context);
    }

    public <T> T execute(HttpUriRequest request, 
            ResponseHandler<? extends T> responseHandler)
            throws IOException, ClientProtocolException {
        try {
        return delegate.execute(request, responseHandler);
} catch (IOException e) {
try { request.abort(); } catch (Exception ee) {}
throw e;
}
    }

    public <T> T execute(HttpUriRequest request,
            ResponseHandler<? extends T> responseHandler, HttpContext 
context)
            throws IOException, ClientProtocolException {
        try {
        return delegate.execute(request, responseHandler, context);
} catch (IOException e) {
try { request.abort(); } catch (Exception ee) {}
throw e;
}
    }

    public <T> T execute(HttpHost target, HttpRequest request,
            ResponseHandler<? extends T> responseHandler) throws 
IOException,
            ClientProtocolException {
        return delegate.execute(target, request, responseHandler);
    }

    public <T> T execute(HttpHost target, HttpRequest request,
            ResponseHandler<? extends T> responseHandler, HttpContext 
context)
            throws IOException, ClientProtocolException {
        return delegate.execute(target, request, responseHandler, context);
    }

    /**
     * Compress data to send to server.
     * Creates a Http Entity holding the gzipped data.
     * The data will not be compressed if it is too short.
     * @param data The bytes to compress
     * @return Entity holding the data
     */
    public static AbstractHttpEntity getCompressedEntity(byte data[], 
ContentResolver resolver)
            throws IOException {
        AbstractHttpEntity entity;
        if (data.length < getMinGzipSize(resolver)) {
            entity = new ByteArrayEntity(data);
        } else {
            ByteArrayOutputStream arr = new ByteArrayOutputStream();
            OutputStream zipper = new GZIPOutputStream(arr);
            zipper.write(data);
            zipper.close();
            entity = new ByteArrayEntity(arr.toByteArray());
            entity.setContentEncoding("gzip");
        }
        return entity;
    }

    /**
     * Retrieves the minimum size for compressing data.
     * Shorter data will not be compressed.
     */
    public static long getMinGzipSize(ContentResolver resolver) {
        return DEFAULT_SYNC_MIN_GZIP_BYTES;  // For now, this is just a 
constant.
    }

    /* cURL logging support. */

/**
     * Logging tag and level.
     */
    private static class LoggingConfiguration {

        private final String tag;
        private final int level;

        private LoggingConfiguration(String tag, int level) {
            this.tag = tag;
            this.level = level;
        }

        /**
         * Returns true if logging is turned on for this configuration.
         */
        private boolean isLoggable() {
            return Log.isLoggable(tag, level);
        }

        /**
         * Prints a message using this configuration.
         */
        private void println(String message) {
            Log.println(level, tag, message);
        }
    }

    /** cURL logging configuration. */
    private volatile LoggingConfiguration curlConfiguration;

    /**
     * Enables cURL request logging for this client.
     *
     * @param name to log messages with
     * @param level at which to log messages (see {@link android.util.Log})
     */
    public void enableCurlLogging(String name, int level) {
        if (name == null) {
            throw new NullPointerException("name");
        }
        if (level < Log.VERBOSE || level > Log.ASSERT) {
            throw new IllegalArgumentException("Level is out of range ["
                + Log.VERBOSE + ".." + Log.ASSERT + "]");    
        }

        curlConfiguration = new LoggingConfiguration(name, level);
    }

    /**
     * Disables cURL logging for this client.
     */
    public void disableCurlLogging() {
        curlConfiguration = null;
    }

    /**
     * Logs cURL commands equivalent to requests.
     */
    private class CurlLogger implements HttpRequestInterceptor {
        public void process(HttpRequest request, HttpContext context)
                throws HttpException, IOException {
            LoggingConfiguration configuration = curlConfiguration;
            if (configuration != null
                    && configuration.isLoggable()
                    && request instanceof HttpUriRequest) {
                // Never print auth token -- we used to check ro.secure=0 to
                // enable that, but can't do that in unbundled code.
                configuration.println(toCurl((HttpUriRequest) request, 
false));
            }
        }
    }

    /**
     * Generates a cURL command equivalent to the given request.
     */
    private static String toCurl(HttpUriRequest request, boolean 
logAuthToken) throws IOException {
        StringBuilder builder = new StringBuilder();

        builder.append("curl ");

        for (Header header: request.getAllHeaders()) {
            if (!logAuthToken
                    && (header.getName().equals("Authorization") ||
                        header.getName().equals("Cookie"))) {
                continue;
            }
            builder.append("--header \"");
            builder.append(header.toString().trim());
            builder.append("\" ");
        }

        URI uri = request.getURI();

        // If this is a wrapped request, use the URI from the original
        // request instead. getURI() on the wrapper seems to return a
        // relative URI. We want an absolute URI.
        if (request instanceof RequestWrapper) {
            HttpRequest original = ((RequestWrapper) request).getOriginal();
            if (original instanceof HttpUriRequest) {
                uri = ((HttpUriRequest) original).getURI();
            }
        }

        builder.append("\"");
        builder.append(uri);
        builder.append("\"");

        if (request instanceof HttpEntityEnclosingRequest) {
            HttpEntityEnclosingRequest entityRequest =
                    (HttpEntityEnclosingRequest) request;
            HttpEntity entity = entityRequest.getEntity();
            if (entity != null && entity.isRepeatable()) {
                if (entity.getContentLength() < 1024) {
                    ByteArrayOutputStream stream = new 
ByteArrayOutputStream();
                    entity.writeTo(stream);
                    String entityString = stream.toString();

                    // TODO: Check the content type, too.
                    builder.append(" --data-ascii \"")
                            .append(entityString)
                            .append("\"");
                } else {
                    builder.append(" [TOO MUCH DATA TO INCLUDE]");
                }
            }
        }

        return builder.toString();
    }
}
}
=========================


On Tuesday, November 6, 2012 11:05:43 AM UTC-5, Thomas Bouron wrote:
>
> Ok so I made a few tests and:
>
>    1. The solution provided by Street of boston doesn't work, at least 
>    fior me. It seems that the RetryHandler is never called and I cannot figure 
>    out why
>    2. I saw nothing unusual with tcpdump, so I think it is not a DNS 
>    lookup issue
>    3. Funny thing, the REST server returns me a JSON response and I 
>    discovered that for those with a size less than 8KB, my code works fine! 
>    Why? That is the question!
>
>
> On Tuesday, November 6, 2012 4:17:19 PM UTC+1, Thomas Bouron wrote:
>>
>> Thanks guys, I'll try that keep you updated.
>>
>> On Tuesday, November 6, 2012 3:58:32 PM UTC+1, Nikolay Elenkov wrote:
>>>
>>> On Tue, Nov 6, 2012 at 11:36 PM, Thomas Bouron <tbo...@gmail.com> 
>>> wrote: 
>>> > Here is my code with AndroidHttpClient: 
>>> > 
>>> ... 
>>> > 
>>> > And my code with HttpURLConnection: 
>>> > 
>>> > 
>>>
>>> Looks OK, so most probably it's some network issue. Use tcpdump, etc. in 
>>> you 
>>> work environment to see exactly what is going on, and if it is indeed 
>>> a DNS issue 
>>> (although what you are getting there might be unrelated). Also try to 
>>> find out what 
>>> is common between the users that are having the issue (same area, 
>>> carrier, 
>>> device, Android version, etc.) 
>>>
>>> HTH 
>>>
>>
------=_Part_702_23918214.1352221593441
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Thomas,<div><br></div><div>Here is the full-source of my HttpClientUtils=
.java. Use its static 'get' method to obtain an HttpClient. Try to use it a=
nd see it it works in your case.</div><div><br></div><div>Here is how you c=
ould use the HttpClientUtils class (it is thread safe and uses pooled conne=
ctions):<br><div><font face=3D"courier new, monospace">HttpClient client =
=3D null;</font></div><div><font face=3D"courier new, monospace">HttpGet &n=
bsp; &nbsp;request =3D null;</font></div><div><font face=3D"courier new, mo=
nospace">HttpResponse response =3D null;</font></div><div><font face=3D"cou=
rier new, monospace">try {</font></div><div><font face=3D"courier new, mono=
space"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>c=
lient =3D <b>HttpClientUtils.get(context)</b>;</font></div><div><font face=
=3D"courier new, monospace"><span class=3D"Apple-tab-span" style=3D"white-s=
pace:pre">=09</span>request =3D new HttpGet(url);</font></div><div><font fa=
ce=3D"courier new, monospace"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09</span>response =3D client.execute(request);</font></div><di=
v><font face=3D"courier new, monospace"><span class=3D"Apple-tab-span" styl=
e=3D"white-space:pre">=09</span>someMethodThatParsesTheResponse(response);<=
/font></div><div><font face=3D"courier new, monospace">} catch (ClientProto=
colException e) {</font></div><div><font face=3D"courier new, monospace"><s=
pan class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>// TODO Au=
to-generated catch block</font></div><div><font face=3D"courier new, monosp=
ace">} catch (IOException e) {</font></div><div><font face=3D"courier new, =
monospace"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</sp=
an>// TODO Auto-generated catch block</font></div><div><font face=3D"courie=
r new, monospace">}</font></div><div><font face=3D"courier new, monospace">=
finally {</font></div><div><font face=3D"courier new, monospace"><span clas=
s=3D"Apple-tab-span" style=3D"white-space:pre">=09</span><b>HttpClientUtils=
.release(response, request, client)</b>;</font></div><div><font face=3D"cou=
rier new, monospace">}</font></div></div><div><br></div><div><br></div><div=
><br></div><div>Here is the HttpClientUtils source code:</div><div>=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D</div>=
<div><font face=3D"courier new, monospace" size=3D"1">package somepackage;<=
br></font></div><div><font face=3D"courier new, monospace" size=3D"1"><br><=
/font></div><div><font face=3D"courier new, monospace" size=3D"1">import ja=
va.io.ByteArrayOutputStream;</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1">import java.io.IOException;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1">import java.io.InputStream;</font></=
div><div><font face=3D"courier new, monospace" size=3D"1">import java.io.In=
terruptedIOException;</font></div><div><font face=3D"courier new, monospace=
" size=3D"1">import java.io.OutputStream;</font></div><div><font face=3D"co=
urier new, monospace" size=3D"1">import java.net.SocketException;</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1">import java.net.UR=
I;</font></div><div><font face=3D"courier new, monospace" size=3D"1">import=
 java.net.UnknownHostException;</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1">import java.util.zip.GZIPInputStream;</font></div><d=
iv><font face=3D"courier new, monospace" size=3D"1">import java.util.zip.GZ=
IPOutputStream;</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><br></font></div><div><font face=3D"courier new, monospace" size=3D"=
1">import javax.net.ssl.SSLHandshakeException;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><br></font></div><div><font face=3D"=
courier new, monospace" size=3D"1">import org.apache.http.Header;</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1">import org.apache.=
http.HttpEntity;</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1">import org.apache.http.HttpEntityEnclosingRequest;</font></div><div=
><font face=3D"courier new, monospace" size=3D"1">import org.apache.http.Ht=
tpException;</font></div><div><font face=3D"courier new, monospace" size=3D=
"1">import org.apache.http.HttpHost;</font></div><div><font face=3D"courier=
 new, monospace" size=3D"1">import org.apache.http.HttpRequest;</font></div=
><div><font face=3D"courier new, monospace" size=3D"1">import org.apache.ht=
tp.HttpRequestInterceptor;</font></div><div><font face=3D"courier new, mono=
space" size=3D"1">import org.apache.http.HttpResponse;</font></div><div><fo=
nt face=3D"courier new, monospace" size=3D"1">import org.apache.http.NoHttp=
ResponseException;</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1">import org.apache.http.client.ClientProtocolException;</font></di=
v><div><font face=3D"courier new, monospace" size=3D"1">import org.apache.h=
ttp.client.HttpClient;</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1">import org.apache.http.client.HttpRequestRetryHandler;</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1">import org.apac=
he.http.client.ResponseHandler;</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1">import org.apache.http.client.methods.HttpRequestBas=
e;</font></div><div><font face=3D"courier new, monospace" size=3D"1">import=
 org.apache.http.client.methods.HttpUriRequest;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1">import org.apache.http.client.params=
.HttpClientParams;</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1">import org.apache.http.client.protocol.ClientContext;</font></div=
><div><font face=3D"courier new, monospace" size=3D"1">import org.apache.ht=
tp.conn.ClientConnectionManager;</font></div><div><font face=3D"courier new=
, monospace" size=3D"1">import org.apache.http.conn.scheme.PlainSocketFacto=
ry;</font></div><div><font face=3D"courier new, monospace" size=3D"1">impor=
t org.apache.http.conn.scheme.Scheme;</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1">import org.apache.http.conn.scheme.SchemeRegis=
try;</font></div><div><font face=3D"courier new, monospace" size=3D"1">impo=
rt org.apache.http.entity.AbstractHttpEntity;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1">import org.apache.http.entity.ByteAr=
rayEntity;</font></div><div><font face=3D"courier new, monospace" size=3D"1=
">import org.apache.http.impl.client.DefaultHttpClient;</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1">import org.apache.http.impl.=
client.RequestWrapper;</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1">import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnMa=
nager;</font></div><div><font face=3D"courier new, monospace" size=3D"1">im=
port org.apache.http.params.BasicHttpParams;</font></div><div><font face=3D=
"courier new, monospace" size=3D"1">import org.apache.http.params.HttpConne=
ctionParams;</font></div><div><font face=3D"courier new, monospace" size=3D=
"1">import org.apache.http.params.HttpParams;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1">import org.apache.http.params.HttpPr=
otocolParams;</font></div><div><font face=3D"courier new, monospace" size=
=3D"1">import org.apache.http.protocol.BasicHttpContext;</font></div><div><=
font face=3D"courier new, monospace" size=3D"1">import org.apache.http.prot=
ocol.BasicHttpProcessor;</font></div><div><font face=3D"courier new, monosp=
ace" size=3D"1">import org.apache.http.protocol.ExecutionContext;</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1">import org.apache.=
http.protocol.HttpContext;</font></div><div><font face=3D"courier new, mono=
space" size=3D"1"><br></font></div><div><font face=3D"courier new, monospac=
e" size=3D"1">import android.content.ContentResolver;</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1">import android.content.Context=
;</font></div><div><font face=3D"courier new, monospace" size=3D"1">import =
android.net.SSLCertificateSocketFactory;</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1">import android.net.SSLSessionCache;</font><=
/div><div><font face=3D"courier new, monospace" size=3D"1">import android.u=
til.Log;</font></div><div><font face=3D"courier new, monospace" size=3D"1">=
<br></font></div><div><font face=3D"courier new, monospace" size=3D"1"><br>=
</font></div><div><font face=3D"courier new, monospace" size=3D"1">/**</fon=
t></div><div><font face=3D"courier new, monospace" size=3D"1">&nbsp;* This =
class handle HttpClient instances. You can get one and use it to release&nb=
sp;</font></div><div><font face=3D"courier new, monospace" size=3D"1">&nbsp=
;* the resources associated with the HttpClient.</font></div><div><font fac=
e=3D"courier new, monospace" size=3D"1">&nbsp;* @author Anton Spaans</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1">&nbsp;*</font><=
/div><div><font face=3D"courier new, monospace" size=3D"1">&nbsp;*/</font><=
/div><div><font face=3D"courier new, monospace" size=3D"1">public abstract =
class HttpClientUtils {</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span>private static final String USER_AGENT =3D "Android Blio";</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"App=
le-tab-span" style=3D"white-space:pre">=09</span>private static AndroidHttp=
Client androidHttpClient =3D null;</font></div><div><span class=3D"Apple-ta=
b-span" style=3D"white-space:pre"><font face=3D"courier new, monospace" siz=
e=3D"1">=09</font></span></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n>private static final ThreadLocal&lt;ReleaseHolder&gt; RELEASE_HOLDER =3D&=
nbsp;</font></div><div><font face=3D"courier new, monospace" size=3D"1"><sp=
an class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>new Thre=
adLocal&lt;ReleaseHolder&gt;() {</font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09=09=09</span>@Override</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09=09=09</span>protected ReleaseHolder initialValue() {</font></div><=
div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-t=
ab-span" style=3D"white-space:pre">=09=09=09=09</span>return new ReleaseHol=
der();</font></div><div><font face=3D"courier new, monospace" size=3D"1"><s=
pan class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09</span>}</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>};</font></div><=
div><span class=3D"Apple-tab-span" style=3D"white-space:pre"><font face=3D"=
courier new, monospace" size=3D"1">=09</font></span></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span>/**</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09</span> * This method returns a HttpClient that can be used to d=
ownload info or update info&nbsp;</font></div><div><font face=3D"courier ne=
w, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spac=
e:pre">=09</span> * on web-services.</font></div><div><font face=3D"courier=
 new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-s=
pace:pre">=09</span> * The HttpClient should be treated as 'read-only': Don=
't start modifying its settings</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span> * and properties, since this client could be cached and use=
d by multiple threads at&nbsp;</font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09</span> * the same time.</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span> * @param context.</font></div><div><font face=3D"courier ne=
w, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spac=
e:pre">=09</span> * @return An HttpClient</font></div><div><font face=3D"co=
urier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"wh=
ite-space:pre">=09</span> */</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span>public static synchronized HttpClient get(Context context) {</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>if (androidHttpC=
lient =3D=3D null) {</font></div><div><font face=3D"courier new, monospace"=
 size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=
=09</span>androidHttpClient =3D AndroidHttpClient.newInstance(USER_AGENT, c=
ontext);</font></div><div><font face=3D"courier new, monospace" size=3D"1">=
<span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>}</fo=
nt></div><div><span class=3D"Apple-tab-span" style=3D"white-space:pre"><fon=
t face=3D"courier new, monospace" size=3D"1">=09=09</font></span></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09=09</span>return androidHttpClient;</fon=
t></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>}</font></div><div>=
<span class=3D"Apple-tab-span" style=3D"white-space:pre"><font face=3D"cour=
ier new, monospace" size=3D"1">=09</font></span></div><div><font face=3D"co=
urier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"wh=
ite-space:pre">=09</span>/**</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> * Save a response to be released/closed later.</font></div><di=
v><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab=
-span" style=3D"white-space:pre">=09</span> * The actual release of it will=
 be done when {@link #releaseNow()} is called.</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> * @param response</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09</span> */</font></div><div><font face=3D"courier=
 new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-s=
pace:pre">=09</span>public static void releaseLater(HttpResponse response) =
{</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span c=
lass=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>RELEASE_HOLD=
ER.get().response =3D response;</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span>}</font></div><div><span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre"><font face=3D"courier new, monospace" size=3D"1">=09</font>=
</span></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>/**</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09</span> * Save a htttp-request to be=
 released/closed later.</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> * The actual release of it will be done when {@link #releaseNow()} =
is called.</font></div><div><font face=3D"courier new, monospace" size=3D"1=
"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> * @pa=
ram method</font></div><div><font face=3D"courier new, monospace" size=3D"1=
"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> */</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>public static void =
releaseLater(HttpRequestBase method) {</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09=09</span>RELEASE_HOLDER.get().method =3D method;</font></di=
v><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre">=09</span>}</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><br></font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span>/**</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09</span> * Save an HttpClient to be released/closed later.</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"=
Apple-tab-span" style=3D"white-space:pre">=09</span> * The actual release o=
f it will be done when {@link #releaseNow()} is called.</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span> * @param client</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span> */</font></div><div><font face=3D"c=
ourier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre">=09</span>public static void releaseLater(HttpClient client=
) {</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>RELEASE_HO=
LDER.get().client =3D client;</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span>}</font></div><div><span class=3D"Apple-tab-span" style=3D"whi=
te-space:pre"><font face=3D"courier new, monospace" size=3D"1">=09</font></=
span></div><div><font face=3D"courier new, monospace" size=3D"1"><span clas=
s=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>/**</font></div><d=
iv><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-ta=
b-span" style=3D"white-space:pre">=09</span> * Release any previously saved=
 response, method or client.</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> */</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>p=
ublic static void releaseNow() {</font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09=09</span>RELEASE_HOLDER.get().cleanUp();</font></div><div><font f=
ace=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" st=
yle=3D"white-space:pre">=09</span>}</font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><br></font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span>/**</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> * Aborts current request.&nbsp;</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09</span> * Call this only on a failure or cancellation.</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"App=
le-tab-span" style=3D"white-space:pre">=09</span> */</font></div><div><font=
 face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" =
style=3D"white-space:pre">=09</span>public static void abort() {</font></di=
v><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre">=09=09</span>HttpRequestBase method =
=3D RELEASE_HOLDER.get().method;</font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09=09</span>if (method !=3D null) {</font></div><div><font face=3D"c=
ourier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre">=09=09=09</span>if (!method.isAborted()) {</font></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09=09=09=09</span>method.abort();</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09=09=09</span>}</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre">=09=09=09</span>RELEASE_HOLDER.get().method =
=3D null;</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>}</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>}</font></div><div>=
<span class=3D"Apple-tab-span" style=3D"white-space:pre"><font face=3D"cour=
ier new, monospace" size=3D"1">=09</font></span></div><div><font face=3D"co=
urier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"wh=
ite-space:pre">=09</span>/**</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> * Release/close the give response, method and client used in t=
he latest http-request execution.</font></div><div><font face=3D"courier ne=
w, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spac=
e:pre">=09</span> * @param response</font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-sp=
ace:pre">=09</span> * @param method</font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-sp=
ace:pre">=09</span> * @param client</font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-sp=
ace:pre">=09</span> */</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span>public static void release(HttpResponse response, HttpRequestBase met=
hod, HttpClient client) {</font></div><div><font face=3D"courier new, monos=
pace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09=09</span>if (response !=3D null) {</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09=09=09</span>HttpEntity entity =3D response.getEntity();</fo=
nt></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09</span>if (entity !=
=3D null) {</font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09=09</s=
pan>try { entity.consumeContent(); } catch (IOException e) { }</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09=09=09</span>}</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09=09</span>}</font></div><div><span class=3D"A=
pple-tab-span" style=3D"white-space:pre"><font face=3D"courier new, monospa=
ce" size=3D"1">=09=09</font></span></div><div><font face=3D"courier new, mo=
nospace" size=3D"1">//<span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09=09</span>if (method !=3D null) {</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1">//<span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre">=09=09=09</span>method.abort();</font></div><div><font face=
=3D"courier new, monospace" size=3D"1">//<span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09=09</span>}</font></div><div><span class=3D"Apple=
-tab-span" style=3D"white-space:pre"><font face=3D"courier new, monospace" =
size=3D"1">=09=09</font></span></div><div><font face=3D"courier new, monosp=
ace" size=3D"1">// &nbsp; &nbsp; &nbsp;Commented out: The client is being r=
e-used. Don't close it after a request.<span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09=09</span></font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1">//<span class=3D"Apple-tab-span" style=3D"white-s=
pace:pre">=09=09</span>if (client !=3D null &amp;&amp; client instanceof An=
droidHttpClient) {</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1">//<span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=
=09</span>((AndroidHttpClient)client).close();</font></div><div><font face=
=3D"courier new, monospace" size=3D"1">//<span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09=09</span>}</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span>}</font></div><div><span class=3D"Apple-tab-span" styl=
e=3D"white-space:pre"><font face=3D"courier new, monospace" size=3D"1">=09<=
/font></span></div><div><font face=3D"courier new, monospace" size=3D"1"><s=
pan class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>private st=
atic class ReleaseHolder &nbsp;{</font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09=09</span>HttpResponse response;</font></div><div><font face=3D"co=
urier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"wh=
ite-space:pre">=09=09</span>HttpRequestBase method;</font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" s=
tyle=3D"white-space:pre">=09=09</span>HttpClient client;</font></div><div><=
span class=3D"Apple-tab-span" style=3D"white-space:pre"><font face=3D"couri=
er new, monospace" size=3D"1">=09=09</font></span></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09=09</span>public void cleanUp() {</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09=09=09</span>release(response, method, client=
);</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09</span>response=
 =3D null;</font></div><div><font face=3D"courier new, monospace" size=3D"1=
"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09</span>=
method =3D null;</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09<=
/span>client =3D null;</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
=09</span>}</font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>}</fo=
nt></div><div><span class=3D"Apple-tab-span" style=3D"white-space:pre"><fon=
t face=3D"courier new, monospace" size=3D"1">=09</font></span></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span>/**</font></div><div><font face=3D"c=
ourier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre">=09</span> * Retries on failing Http connections. The defau=
lt handler didn't deal with SocketExceptions at&nbsp;</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> * all... and those are the ones we ge=
t most.</font></div><div><font face=3D"courier new, monospace" size=3D"1"><=
span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> *&nbsp;<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> * @author Anton =
Spaans</font></div><div><font face=3D"courier new, monospace" size=3D"1"><s=
pan class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> */</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"=
Apple-tab-span" style=3D"white-space:pre">=09</span>private static class Re=
tryHandler implements HttpRequestRetryHandler {</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09=09</span>@Override</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09=09</span>public boolean retryRequest(IOException excep=
tion, int executionCount, HttpContext context) {</font></div><div><font fac=
e=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" styl=
e=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (exception =
=3D=3D null) {</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalArgumentException=
("Exception parameter may not be null");</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whi=
te-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"App=
le-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbs=
p;if (context =3D=3D null) {</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalArgu=
mentException("HTTP context may not be null");</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><d=
iv><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-ta=
b-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp;if (executionCount &gt; 3) {</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false=
;</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span c=
lass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; =
&nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;</font></div><div><font face=3D"courier new, mon=
ospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre"=
>=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (exception instanceof NoHttpRespo=
nseException) {</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Retry if the server dropped con=
nection on us</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp;</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09</span>if (exc=
eption instanceof SocketException) {</font></div><div><font face=3D"courier=
 new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-s=
pace:pre">=09=09=09=09</span>// Retry if the server closed socket on us</fo=
nt></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09=09</span>return tru=
e;</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09</span>}</font>=
</div><div><span class=3D"Apple-tab-span" style=3D"white-space:pre"><font f=
ace=3D"courier new, monospace" size=3D"1">=09=09=09</font></span></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (e=
xception instanceof InterruptedIOException) {</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//=
 Timeout</font></div><div><font face=3D"courier new, monospace" size=3D"1">=
<span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><d=
iv><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-ta=
b-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp;if (exception instanceof UnknownHostException) {</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp;// Unknown host</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false;</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}=
</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &=
nbsp; &nbsp;</font></div><div><font face=3D"courier new, monospace" size=3D=
"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nb=
sp; &nbsp; &nbsp; &nbsp;if (exception instanceof SSLHandshakeException) {</=
font></div><div><font face=3D"courier new, monospace" size=3D"1"><span clas=
s=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp;// SSL handshake exception</font></div><div><font f=
ace=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" st=
yle=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
;return false;</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whi=
te-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;Boolean b =3D (Boolean)=
context.getAttribute(ExecutionContext.HTTP_REQ_SENT);</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;boolean se=
nt =3D (b !=3D null &amp;&amp; b.booleanValue());</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (!sent) {</=
font></div><div><font face=3D"courier new, monospace" size=3D"1"><span clas=
s=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp;// Retry if the request has not been sent fully or<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp;// if it's OK to retry methods that have been sent=
</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp; &nbsp;return true;</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><br></font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;HttpRequest requ=
est =3D (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09</span>boolean ide=
mpotent =3D !(request instanceof HttpEntityEnclosingRequest);</font></div><=
div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-t=
ab-span" style=3D"white-space:pre">=09=09=09</span>if (idempotent) {</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"=
Apple-tab-span" style=3D"white-space:pre">=09=09=09=09</span>// Retry if th=
e request is considered idempotent</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09=09=09=09</span>return true;</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09=09=09</span>}</font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><br></font></div><div><font face=3D"courier new, mono=
space" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09=09=09</span>// otherwise do not retry</font></div><div><font face=3D"co=
urier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"wh=
ite-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;return false;</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09=09</span>}</font></div><div><fo=
nt face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span=
" style=3D"white-space:pre">=09</span>}<span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span></font></div><div><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre"><font face=3D"courier new, monospace" size=
=3D"1">=09</font></span></div><div><font face=3D"courier new, monospace" si=
ze=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span=
>/**</font></div><div><font face=3D"courier new, monospace" size=3D"1"><spa=
n class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> * Modified =
from Google/Android as follows:</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span> * <span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span>- When a request happens on the UI-thread, don't throw an excepti=
on. Just log it.</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 * &nbsp;- Added a RetryHandler to handle SocketExceptions.</font></div><di=
v><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab=
-span" style=3D"white-space:pre">=09</span> * &nbsp;</font></div><div><font=
 face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" =
style=3D"white-space:pre">=09</span> * &nbsp;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> * Subclass of the Apache {@link DefaultHttp=
Client} that is configured with</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span> * reasonable default settings and registered schemes for An=
droid, and</font></div><div><font face=3D"courier new, monospace" size=3D"1=
"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> * als=
o lets the user add {@link HttpRequestInterceptor} classes.</font></div><di=
v><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab=
-span" style=3D"white-space:pre">=09</span> * Don't create this directly, u=
se the {@link #newInstance} factory method.</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09</span> *</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> * &lt;p&gt;This client processes cookies but does not retain =
them by default.</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 * To retain cookies, simply add a cookie store to the HttpContext:&lt;/p&g=
t;</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> *</font></div=
><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple=
-tab-span" style=3D"white-space:pre">=09</span> * &lt;pre&gt;context.setAtt=
ribute(ClientContext.COOKIE_STORE, cookieStore);&lt;/pre&gt;</font></div><d=
iv><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-ta=
b-span" style=3D"white-space:pre">=09</span> */</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span>public static final class AndroidHttpClient =
implements HttpClient {</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" =
size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</sp=
an> &nbsp; &nbsp;// Gzip of data shorter than this probably won't be worthw=
hile</font></div><div><font face=3D"courier new, monospace" size=3D"1"><spa=
n class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbs=
p;public static long DEFAULT_SYNC_MIN_GZIP_BYTES =3D 256;</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><br></font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp;// Default connection an=
d socket timeout of 60 seconds. &nbsp;Tweak to taste.</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp;private static final int=
 SOCKET_OPERATION_TIMEOUT =3D 60 * 1000;</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1"><br></font></div><div><font face=3D"courier=
 new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-s=
pace:pre">=09</span> &nbsp; &nbsp;private static final String TAG =3D "Andr=
oidHttpClient";</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><br></font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbs=
p; &nbsp;</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span>// R=
emoved ANR warning from logs. Documented in TRAC.&nbsp;</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp;/** Interceptor throws a=
n exception if the executing thread is blocked */</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09</span> &nbsp; &nbsp;private static final HttpReq=
uestInterceptor sThreadCheckInterceptor =3D new HttpRequestInterceptor() {<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &n=
bsp; &nbsp;public void process(HttpRequest request, HttpContext context) {<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp;// Prevent the HttpRequest from being sent on the =
main thread</font></div><div><font face=3D"courier new, monospace" size=3D"=
1">//<span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (Looper.myLooper() !=3D null &amp=
;&amp; Looper.myLooper() =3D=3D Looper.getMainLooper() ) {</font></div><div=
><font face=3D"courier new, monospace" size=3D"1">//<span class=3D"Apple-ta=
b-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;<span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09=09=09</span>Log.w("ANR", "!!! R=
isk for ANR !!!", new Exception("HttpClient is being used on the main UI th=
read."));</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
>//<span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" s=
tyle=3D"white-space:pre">=09</span> &nbsp; &nbsp;};</font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><br></font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp;/**</font></div><div><font fac=
e=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" styl=
e=3D"white-space:pre">=09</span> &nbsp; &nbsp; * Create a new HttpClient wi=
th reasonable defaults (which you can update).</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; *</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; * @param userAgent to report =
in your HTTP requests</font></div><div><font face=3D"courier new, monospace=
" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</=
span> &nbsp; &nbsp; * @param context to use for caching SSL sessions (may b=
e null for no caching)</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp; * @return AndroidHttpClient for you to use for all you=
r requests.</font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbs=
p; &nbsp; */</font></div><div><font face=3D"courier new, monospace" size=3D=
"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nb=
sp; &nbsp;public static AndroidHttpClient newInstance(String userAgent, Con=
text context) {</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;HttpParams params =3D new BasicHttpParams();</fo=
nt></div><div><font face=3D"courier new, monospace" size=3D"1"><br></font><=
/div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"A=
pple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &n=
bsp;// Turn off stale checking. &nbsp;Our connections break all the time an=
yway,</font></div><div><font face=3D"courier new, monospace" size=3D"1"><sp=
an class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nb=
sp; &nbsp; &nbsp;// and it's not worth it to pay the penalty of checking ev=
ery time.</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp;=
 &nbsp; &nbsp; &nbsp;HttpConnectionParams.setStaleCheckingEnabled(params, f=
alse);</font></div><div><font face=3D"courier new, monospace" size=3D"1"><b=
r></font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;=
 &nbsp; &nbsp;HttpConnectionParams.setConnectionTimeout(params, SOCKET_OPER=
ATION_TIMEOUT);</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;HttpConnectionParams.setSoTimeout(params, SOCKET=
_OPERATION_TIMEOUT);</font></div><div><font face=3D"courier new, monospace"=
 size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</s=
pan> &nbsp; &nbsp; &nbsp; &nbsp;HttpConnectionParams.setSocketBufferSize(pa=
rams, 8192);</font></div><div><font face=3D"courier new, monospace" size=3D=
"1"><br></font></div><div><font face=3D"courier new, monospace" size=3D"1">=
<span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; =
&nbsp; &nbsp; &nbsp;// Don't handle redirects -- return them to the caller.=
 &nbsp;Our code</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;// often wants to re-POST after a redirect, whic=
h we must do ourselves.</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; &nbsp; &nbsp;HttpClientParams.setRedirecting(params, =
false);</font></div><div><font face=3D"courier new, monospace" size=3D"1"><=
br></font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp=
; &nbsp; &nbsp;// Use a session cache for SSL sockets</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;SSLSession=
Cache sessionCache =3D context =3D=3D null ? null : new SSLSessionCache(con=
text);</font></div><div><font face=3D"courier new, monospace" size=3D"1"><b=
r></font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;=
 &nbsp; &nbsp;// Set the specified user agent and register standard protoco=
ls.</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp=
; &nbsp; &nbsp;HttpProtocolParams.setUserAgent(params, userAgent);</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp;SchemeRegistry schemeRegistry =3D new SchemeRegistry();</font></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;schem=
eRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory()=
, 80));</font></div><div><font face=3D"courier new, monospace" size=3D"1"><=
span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &=
nbsp; &nbsp; &nbsp;schemeRegistry.register(new Scheme("https", SSLCertifica=
teSocketFactory.getHttpSocketFactory(SOCKET_OPERATION_TIMEOUT, sessionCache=
), 443));</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><br></font></div><div><font face=3D"courier new, monospace" size=3D"1"><sp=
an class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nb=
sp; &nbsp; &nbsp;ClientConnectionManager manager =3D new ThreadSafeClientCo=
nnManager(params, schemeRegistry);</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><br></font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;// We use a factory method to mod=
ify superclass initialization</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;// parameters without the funny ca=
ll-a-static-method dance.</font></div><div><font face=3D"courier new, monos=
pace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp; &nbsp; &nbsp;return new AndroidHttpClient(manager,=
 params);</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp;=
 &nbsp;}</font></div><div><font face=3D"courier new, monospace" size=3D"1">=
<br></font></div><div><font face=3D"courier new, monospace" size=3D"1"><spa=
n class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbs=
p;/**</font></div><div><font face=3D"courier new, monospace" size=3D"1"><sp=
an class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nb=
sp; * Create a new HttpClient with reasonable defaults (which you can updat=
e).</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp=
; * @param userAgent to report in your HTTP requests.</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; * @return AndroidHttpCl=
ient for you to use for all your requests.</font></div><div><font face=3D"c=
ourier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre">=09</span> &nbsp; &nbsp; */</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09</span> &nbsp; &nbsp;public static AndroidHttpClient ne=
wInstance(String userAgent) {</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;return newInstance(userAgent, null=
 /* session cache */);</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace=
" size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" si=
ze=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span=
> &nbsp; &nbsp;private final HttpClient delegate;</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><br></font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp;private RuntimeException mLeak=
edException =3D new IllegalStateException(</font></div><div><font face=3D"c=
ourier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"Androi=
dHttpClient created and never closed");</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><br></font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-sp=
ace:pre">=09</span> &nbsp; &nbsp;private final HttpRequestRetryHandler retr=
yHandler =3D new RetryHandler();</font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09</span> &nbsp; &nbsp;</font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09</span> &nbsp; &nbsp;private AndroidHttpClient(ClientConnectionManag=
er ccm, HttpParams params) {</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;DefaultHttpClient httpClient =3D ne=
w DefaultHttpClient(ccm, params) {</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@Override</font=
></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D=
"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp;protected BasicHttpProcessor createHttpProcessor() {</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Add interceptor to prevent making r=
equests from main thread.</font></div><div><font face=3D"courier new, monos=
pace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BasicHttp=
Processor processor =3D super.createHttpProcessor();</font></div><div><font=
 face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" =
style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp;processor.addRequestInterceptor(sThreadCheckInterceptor);<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;processor.addRequestInterceptor(new =
CurlLogger());</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><br></font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return processor;</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"=
Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace"=
 size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@Override</font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" s=
tyle=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p;protected HttpContext createHttpContext() {</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp;// Same as DefaultHttpClient.createHttpContext() minus the</fon=
t></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// cookie store.</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp;HttpContext context =3D new BasicHttpContext();</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"App=
le-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp;context.setAttribute(</font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" s=
tyle=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ClientContext.AUTHSCHEME_REGIST=
RY,</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getA=
uthSchemes());</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;context.setAttribute=
(</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span c=
lass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Client=
Context.COOKIESPEC_REGISTRY,</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=
 &nbsp; &nbsp; &nbsp;getCookieSpecs());</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp;context.setAttribute(</font></div><div><font face=3D"courier new, monos=
pace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp;ClientContext.CREDS_PROVIDER,</font></div><div><font fac=
e=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" styl=
e=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getCredentialsProvider());</font><=
/div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"A=
pple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp;return context;</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &n=
bsp; &nbsp;};</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;</font></div><div><font face=3D"courier new, mon=
ospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre"=
>=09</span> &nbsp; &nbsp; &nbsp; &nbsp;httpClient.setHttpRequestRetryHandle=
r(retryHandler);</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 &nbsp; &nbsp; &nbsp; &nbsp;</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;this.delegate =3D httpClient;</font=
></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D=
"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;}</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><br></font></di=
v><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;@Override</fo=
nt></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;prote=
cted void finalize() throws Throwable {</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;super.finalize();</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"=
Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &=
nbsp;if (mLeakedException !=3D null) {</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Log.e(TAG, =
"Leak found", mLeakedException);</font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mLeakedException =
=3D null;</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp;=
 &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace=
" size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" si=
ze=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span=
> &nbsp; &nbsp;/**</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp; * Modifies a request to indicate to the server that we wou=
ld like a</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp;=
 &nbsp; * gzipped response. &nbsp;(Uses the "Accept-Encoding" HTTP header.)=
</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; *=
 @param request the request to modify</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; * @see #getUngzippedContent</font></div=
><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple=
-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; */</font></di=
v><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;public static=
 void modifyRequestToAcceptGzipResponse(HttpRequest request) {</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;r=
equest.addHeader("Accept-Encoding", "gzip");</font></div><div><font face=3D=
"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D=
"white-space:pre">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><br></font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp;/**</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whi=
te-space:pre">=09</span> &nbsp; &nbsp; * Gets the input stream from a respo=
nse entity. &nbsp;If the entity is gzipped</font></div><div><font face=3D"c=
ourier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"w=
hite-space:pre">=09</span> &nbsp; &nbsp; * then this will get a stream over=
 the uncompressed data.</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; *</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; * @param entity the entity whose content should be re=
ad</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;=
 * @return the input stream to read from</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whi=
te-space:pre">=09</span> &nbsp; &nbsp; * @throws IOException</font></div><d=
iv><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-ta=
b-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; */</font></div><=
div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-t=
ab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;public static In=
putStream getUngzippedContent(HttpEntity entity)</font></div><div><font fac=
e=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" styl=
e=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t=
hrows IOException {</font></div><div><font face=3D"courier new, monospace" =
size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</sp=
an> &nbsp; &nbsp; &nbsp; &nbsp;InputStream responseStream =3D entity.getCon=
tent();</font></div><div><font face=3D"courier new, monospace" size=3D"1"><=
span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &=
nbsp; &nbsp; &nbsp;if (responseStream =3D=3D null) return responseStream;</=
font></div><div><font face=3D"courier new, monospace" size=3D"1"><span clas=
s=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nb=
sp; &nbsp;Header header =3D entity.getContentEncoding();</font></div><div><=
font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (hea=
der =3D=3D null) return responseStream;</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;String contentEncoding =
=3D header.getValue();</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp; &nbsp; &nbsp;if (contentEncoding =3D=3D null) return r=
esponseStream;</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;if (contentEncoding.contains("gzip")) responseSt=
ream</font></div><div><font face=3D"courier new, monospace" size=3D"1"><spa=
n class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=3D new GZIPInputStream(respons=
eStream);</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp;=
 &nbsp; &nbsp; &nbsp;return responseStream;</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"c=
ourier new, monospace" size=3D"1"><br></font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09</span> &nbsp; &nbsp;/**</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp; * Release resources associated with t=
his client. &nbsp;You must call this,</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; * or significant resources (sockets and=
 memory) may be leaked.</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; */</font></div><div><font face=3D"courier new, monosp=
ace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp;public void close() {</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (mLeakedExcep=
tion !=3D null) {</font></div><div><font face=3D"courier new, monospace" si=
ze=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span=
> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getConnectionManager().shutdown(=
);</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;=
 &nbsp; &nbsp; &nbsp; &nbsp;mLeakedException =3D null;</font></div><div><fo=
nt face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span=
" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font><=
/div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"A=
pple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;}</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><br></font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;public HttpPara=
ms getParams() {</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 &nbsp; &nbsp; &nbsp; &nbsp;return delegate.getParams();</font></div><div><=
font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;}</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><br></font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" s=
tyle=3D"white-space:pre">=09</span> &nbsp; &nbsp;public ClientConnectionMan=
ager getConnectionManager() {</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;return delegate.getConnectionManag=
er();</font></div><div><font face=3D"courier new, monospace" size=3D"1"><sp=
an class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nb=
sp;}</font></div><div><font face=3D"courier new, monospace" size=3D"1"><br>=
</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;pu=
blic HttpResponse execute(HttpUriRequest request) throws IOException {</fon=
t></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp;try {</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09=
=09</span>return delegate.execute(request);</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09=09=09</span>} catch (IOException e) {</font></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09=09=09=09</span>try { request.abort(); }=
 catch (Exception ee) {}</font></div><div><font face=3D"courier new, monosp=
ace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09=09=09=09</span>throw e;</font></div><div><font face=3D"courier new, mon=
ospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre"=
>=09=09=09</span>}</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace" si=
ze=3D"1"><br></font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp;public HttpResponse execute(HttpUriRequest request, HttpContex=
t context)</font></div><div><font face=3D"courier new, monospace" size=3D"1=
"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws IOException {</font></div><div><=
font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;try {</=
font></div><div><font face=3D"courier new, monospace" size=3D"1"><span clas=
s=3D"Apple-tab-span" style=3D"white-space:pre">=09=09</span> &nbsp; &nbsp; =
&nbsp; &nbsp;return delegate.execute(request, context);</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09=09=09</span>} catch (IOException e) {</fon=
t></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09=09</span>try { requ=
est.abort(); } catch (Exception ee) {}</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09=09=09=09</span>throw e;</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09=09=09</span>}</font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><br></font></div><div><font face=3D"courier new, monos=
pace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp;public HttpResponse execute(HttpHost target, HttpRe=
quest request)</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws IOException {</font></div><=
div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-t=
ab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;re=
turn delegate.execute(target, request);</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><br></font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09</span> &nbsp; &nbsp;public HttpResponse execute(HttpHost target=
, HttpRequest request,</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpContext context) throws=
 IOException {</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp;return delegate.execute(target, request, context=
);</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;=
}</font></div><div><font face=3D"courier new, monospace" size=3D"1"><br></f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;publi=
c &lt;T&gt; T execute(HttpUriRequest request,&nbsp;</font></div><div><font =
face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" s=
tyle=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p;ResponseHandler&lt;? extends T&gt; responseHandler)</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp;throws IOException, ClientProtocolException {</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;try {</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09=09</span> &nbsp; &nbsp; &nbsp; =
&nbsp;return delegate.execute(request, responseHandler);</font></div><div><=
font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre">=09=09=09</span>} catch (IOException e) {</fo=
nt></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09=09</span>try { requ=
est.abort(); } catch (Exception ee) {}</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09=09=09=09</span>throw e;</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09=09=09</span>}</font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><br></font></div><div><font face=3D"courier new, monos=
pace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp;public &lt;T&gt; T execute(HttpUriRequest request,<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp;ResponseHandler&lt;? extends T&gt; responseHandler=
, HttpContext context)</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws IOException, ClientP=
rotocolException {</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp; &nbsp; &nbsp;try {</font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-sp=
ace:pre">=09=09</span> &nbsp; &nbsp; &nbsp; &nbsp;return delegate.execute(r=
equest, responseHandler, context);</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09=09=09</span>} catch (IOException e) {</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09=09=09=09</span>try { request.abort(); } catch (E=
xception ee) {}</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=09=
=09</span>throw e;</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=09=
=09</span>}</font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbs=
p; &nbsp;}</font></div><div><font face=3D"courier new, monospace" size=3D"1=
"><br></font></div><div><font face=3D"courier new, monospace" size=3D"1"><s=
pan class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &n=
bsp;public &lt;T&gt; T execute(HttpHost target, HttpRequest request,</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"=
Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp;ResponseHandler&lt;? extends T&gt; responseHandler) thro=
ws IOException,</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ClientProtocolException {</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp;return delegate.execute(target, request, responseHandler);</font></div><=
div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-t=
ab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;}</font></div><d=
iv><font face=3D"courier new, monospace" size=3D"1"><br></font></div><div><=
font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;public &lt;T&gt; T ex=
ecute(HttpHost target, HttpRequest request,</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Respon=
seHandler&lt;? extends T&gt; responseHandler, HttpContext context)</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp;throws IOException, ClientProtocolException {</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;r=
eturn delegate.execute(target, request, responseHandler, context);</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;}</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><br></font></div><=
div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-t=
ab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;/**</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; * Compress dat=
a to send to server.</font></div><div><font face=3D"courier new, monospace"=
 size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</s=
pan> &nbsp; &nbsp; * Creates a Http Entity holding the gzipped data.</font>=
</div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"=
Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; * The da=
ta will not be compressed if it is too short.</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; * @param data The bytes to co=
mpress</font></div><div><font face=3D"courier new, monospace" size=3D"1"><s=
pan class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &n=
bsp; * @return Entity holding the data</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09</span> &nbsp; &nbsp; */</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp;public static AbstractHttpEntity getCo=
mpressedEntity(byte data[], ContentResolver resolver)</font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp;throws IOException {</font></div><div><font face=3D"courier new, monosp=
ace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp; &nbsp; &nbsp;AbstractHttpEntity entity;</font></di=
v><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp=
;if (data.length &lt; getMinGzipSize(resolver)) {</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=
entity =3D new ByteArrayEntity(data);</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;} else {</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp;ByteArrayOutputStream arr =3D new ByteArrayOutputStream();</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp;OutputStream zipper =3D new GZIPOutputStream(arr);</font><=
/div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"A=
pple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp;zipper.write(data);</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;zipper.close=
();</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp;entity =3D new ByteArrayEntity(arr.toByteArray=
());</font></div><div><font face=3D"courier new, monospace" size=3D"1"><spa=
n class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp;entity.setContentEncoding("gzip");</font></di=
v><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp=
;}</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span =
class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;=
 &nbsp; &nbsp;return entity;</font></div><div><font face=3D"courier new, mo=
nospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre=
">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, mon=
ospace" size=3D"1"><br></font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp;/**</font></div><div><font face=3D"courier new, monosp=
ace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp; * Retrieves the minimum size for compressing data.=
</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; *=
 Shorter data will not be compressed.</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; */</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white=
-space:pre">=09</span> &nbsp; &nbsp;public static long getMinGzipSize(Conte=
ntResolver resolver) {</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp; &nbsp; &nbsp;return DEFAULT_SYNC_MIN_GZIP_BYTES; &nbsp=
;// For now, this is just a constant.</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"courier=
 new, monospace" size=3D"1"><br></font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09</span> &nbsp; &nbsp;/* cURL logging support. */</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><br></font></div><div><fon=
t face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span"=
 style=3D"white-space:pre">=09=09</span>/**</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09</span> &nbsp; &nbsp; * Logging tag and level.</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; */</font><=
/div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"A=
pple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;private st=
atic class LoggingConfiguration {</font></div><div><font face=3D"courier ne=
w, monospace" size=3D"1"><br></font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;private final String tag;</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp;private final int level;</font></div><div><font face=3D"courier new, mon=
ospace" size=3D"1"><br></font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; &nbsp; &nbsp;private LoggingConfiguration(String tag,=
 int level) {</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.tag =3D tag;</font></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp;this.level =3D level;</font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><br></font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;/**</font></div><div><fo=
nt face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span=
" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; * Return=
s true if logging is turned on for this configuration.</font></div><div><fo=
nt face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span=
" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; */</font=
></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D=
"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; =
&nbsp;private boolean isLoggable() {</font></div><div><font face=3D"courier=
 new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-s=
pace:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return Log.is=
Loggable(tag, level);</font></div><div><font face=3D"courier new, monospace=
" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</=
span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><br></font></div><div><font face=3D"courier new, =
monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:p=
re">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;/**</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; * Prints a mess=
age using this configuration.</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; */</font></div><div><font face=3D=
"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D=
"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;private void printl=
n(String message) {</font></div><div><font face=3D"courier new, monospace" =
size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</sp=
an> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Log.println(level, tag, messag=
e);</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span=
 class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp=
; &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><br></font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbs=
p; &nbsp;/** cURL logging configuration. */</font></div><div><font face=3D"=
courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"=
white-space:pre">=09</span> &nbsp; &nbsp;private volatile LoggingConfigurat=
ion curlConfiguration;</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp;/**</font></div><div><font face=3D"courier new, monospace" =
size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</sp=
an> &nbsp; &nbsp; * Enables cURL request logging for this client.</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"App=
le-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; *</font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"App=
le-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; * @param na=
me to log messages with</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; * @param level at which to log messages (see {@link a=
ndroid.util.Log})</font></div><div><font face=3D"courier new, monospace" si=
ze=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span=
> &nbsp; &nbsp; */</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp;public void enableCurlLogging(String name, int level) {</fo=
nt></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp;if (name =3D=3D null) {</font></div><div><font face=3D"courier new=
, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space=
:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new NullPoi=
nterException("name");</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-sp=
ace:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (level &lt; Log.VERBOSE |=
| level &gt; Log.ASSERT) {</font></div><div><font face=3D"courier new, mono=
space" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalArgume=
ntException("Level is out of range ["</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p;+ Log.VERBOSE + ".." + Log.ASSERT + "]"); &nbsp; &nbsp;</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</fon=
t></div><div><font face=3D"courier new, monospace" size=3D"1"><br></font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp;curlConfiguration =3D new LoggingConfiguration(name, level);</font></div=
><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple=
-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;}</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><br></font></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;/**</font></div><di=
v><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab=
-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; * Disables cURL l=
ogging for this client.</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; */</font></div><div><font face=3D"courier new, monosp=
ace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp;public void disableCurlLogging() {</font></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;curlC=
onfiguration =3D null;</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospace=
" size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" si=
ze=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span=
> &nbsp; &nbsp;/**</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp; * Logs cURL commands equivalent to requests.</font></div><=
div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-t=
ab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; */</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-=
tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;private class C=
urlLogger implements HttpRequestInterceptor {</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;public void proc=
ess(HttpRequest request, HttpContext context)</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp;throws HttpException, IOException {</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Lo=
ggingConfiguration configuration =3D curlConfiguration;</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp;if (configuration !=3D null</font></div><div><font face=3D"courier ne=
w, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spac=
e:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp;&amp;&amp; configuration.isLoggable()</font></div><div><font fa=
ce=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" sty=
le=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=
 &nbsp; &nbsp; &nbsp; &nbsp;&amp;&amp; request instanceof HttpUriRequest) {=
</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Never print auth token -- we use=
d to check ro.secure=3D0 to</font></div><div><font face=3D"courier new, mon=
ospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre"=
>=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// enabl=
e that, but can't do that in unbundled code.</font></div><div><font face=3D=
"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D=
"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp;configuration.println(toCurl((HttpUriRequest) request, false));</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monosp=
ace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=
=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp;}</font></div><div><font face=3D"couri=
er new, monospace" size=3D"1"><br></font></div><div><font face=3D"courier n=
ew, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spa=
ce:pre">=09</span> &nbsp; &nbsp;/**</font></div><div><font face=3D"courier =
new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-sp=
ace:pre">=09</span> &nbsp; &nbsp; * Generates a cURL command equivalent to =
the given request.</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp; */</font></div><div><font face=3D"courier new, monospace" =
size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</sp=
an> &nbsp; &nbsp;private static String toCurl(HttpUriRequest request, boole=
an logAuthToken) throws IOException {</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;StringBuilder builder =3D =
new StringBuilder();</font></div><div><font face=3D"courier new, monospace"=
 size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 &nbsp; &nbsp; &nbsp; &nbsp;builder.append("curl ");</font></div><div><font=
 face=3D"courier new, monospace" size=3D"1"><br></font></div><div><font fac=
e=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" styl=
e=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;for (Header hea=
der: request.getAllHeaders()) {</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!logAuthToken<=
/font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cla=
ss=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&amp;&amp; (header.get=
Name().equals("Authorization") ||</font></div><div><font face=3D"courier ne=
w, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spac=
e:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp; &nbsp;header.getName().equals("Cookie"))) {</font></div=
><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple=
-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;=
 &nbsp; &nbsp; &nbsp; &nbsp;continue;</font></div><div><font face=3D"courie=
r new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-=
space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</font></di=
v><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Appl=
e-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp;builder.append("--header \"");</font></div><div><font face=
=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=
=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bu=
ilder.append(header.toString().trim());</font></div><div><font face=3D"cour=
ier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;builder.ap=
pend("\" ");</font></div><div><font face=3D"courier new, monospace" size=3D=
"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nb=
sp; &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monos=
pace" size=3D"1"><br></font></div><div><font face=3D"courier new, monospace=
" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</=
span> &nbsp; &nbsp; &nbsp; &nbsp;URI uri =3D request.getURI();</font></div>=
<div><font face=3D"courier new, monospace" size=3D"1"><br></font></div><div=
><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-=
span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;// If=
 this is a wrapped request, use the URI from the original</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;// req=
uest instead. getURI() on the wrapper seems to return a</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;// relat=
ive URI. We want an absolute URI.</font></div><div><font face=3D"courier ne=
w, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-spac=
e:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;if (request instanceof Request=
Wrapper) {</font></div><div><font face=3D"courier new, monospace" size=3D"1=
"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpRequest original =3D ((RequestWrapp=
er) request).getOriginal();</font></div><div><font face=3D"courier new, mon=
ospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre"=
>=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (original instanceo=
f HttpUriRequest) {</font></div><div><font face=3D"courier new, monospace" =
size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</sp=
an> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uri =3D ((HttpUr=
iRequest) original).getURI();</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div><=
font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;}</font=
></div><div><font face=3D"courier new, monospace" size=3D"1"><br></font></d=
iv><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"App=
le-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbs=
p;builder.append("\"");</font></div><div><font face=3D"courier new, monospa=
ce" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09=
</span> &nbsp; &nbsp; &nbsp; &nbsp;builder.append(uri);</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp;builder.=
append("\"");</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><br></font></div><div><font face=3D"courier new, monospace" size=3D"=
1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbs=
p; &nbsp; &nbsp; &nbsp;if (request instanceof HttpEntityEnclosingRequest) {=
</font></div><div><font face=3D"courier new, monospace" size=3D"1"><span cl=
ass=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp; &nbsp;HttpEntityEnclosingRequest entityRequest =3D</fon=
t></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(HttpEntityEnclosingRequ=
est) request;</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpEntity entity =3D entityReques=
t.getEntity();</font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (entity !=3D null &amp;&amp; en=
tity.isRepeatable()) {</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09<=
/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (entity.ge=
tContentLength() &lt; 1024) {</font></div><div><font face=3D"courier new, m=
onospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pr=
e">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp;ByteArrayOutputStream stream =3D new ByteArrayOutputStream();</font=
></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D=
"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;entity.writeTo(stream);</fo=
nt></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String entityString =3D =
stream.toString();</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><br></font></div><div><font face=3D"courier new, monospace" size=
=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// TOD=
O: Check the content type, too.</font></div><div><font face=3D"courier new,=
 monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:=
pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp;builder.append(" --data-ascii \"")</font></div><div><font face=3D=
"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-span" style=3D=
"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.append(entityString)</f=
ont></div><div><font face=3D"courier new, monospace" size=3D"1"><span class=
=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp;.append("\"");</font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {</font></=
div><div><font face=3D"courier new, monospace" size=3D"1"><span class=3D"Ap=
ple-tab-span" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;builder.append(" [TOO MUCH DAT=
A TO INCLUDE]");</font></div><div><font face=3D"courier new, monospace" siz=
e=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span>=
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</font></div><div>=
<font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-s=
pan" style=3D"white-space:pre">=09</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp;}</font></div><div><font face=3D"courier new, monospace" size=3D"1"=
><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</span> &nbsp;=
 &nbsp; &nbsp; &nbsp;}</font></div><div><font face=3D"courier new, monospac=
e" size=3D"1"><br></font></div><div><font face=3D"courier new, monospace" s=
ize=3D"1"><span class=3D"Apple-tab-span" style=3D"white-space:pre">=09</spa=
n> &nbsp; &nbsp; &nbsp; &nbsp;return builder.toString();</font></div><div><=
font face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-sp=
an" style=3D"white-space:pre">=09</span> &nbsp; &nbsp;}</font></div><div><f=
ont face=3D"courier new, monospace" size=3D"1"><span class=3D"Apple-tab-spa=
n" style=3D"white-space:pre">=09</span>}</font></div><div><font face=3D"cou=
rier new, monospace" size=3D"1">}</font></div><div>=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D<br></div><div><br><br>O=
n Tuesday, November 6, 2012 11:05:43 AM UTC-5, Thomas Bouron wrote:<blockqu=
ote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left=
: 1px #ccc solid;padding-left: 1ex;">Ok so I made a few tests and:<div><ol>=
<li><span style=3D"line-height:normal">The solution provided by Street of b=
oston doesn't work, at least fior me. It seems that the RetryHandler is nev=
er called and I cannot figure out why</span></li><li><span style=3D"line-he=
ight:normal">I saw nothing unusual with tcpdump, so I think it is not a DNS=
 lookup issue</span></li><li><span style=3D"line-height:normal">Funny thing=
, the REST server returns me a JSON response and I discovered that for thos=
e with a size less than 8KB, my code works fine! Why? That is the question!=
</span></li></ol><br>On Tuesday, November 6, 2012 4:17:19 PM UTC+1, Thomas =
Bouron wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-lef=
t:0.8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks guys, I'll try =
that keep you updated.<br><br>On Tuesday, November 6, 2012 3:58:32 PM UTC+1=
, Nikolay Elenkov wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0=
;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, Nov=
 6, 2012 at 11:36 PM, Thomas Bouron &lt;<a>tbo...@gmail.com</a>&gt; wrote:
<br>&gt; Here is my code with AndroidHttpClient:
<br>&gt;
<br>...
<br>&gt;
<br>&gt; And my code with HttpURLConnection:
<br>&gt;
<br>&gt;
<br>
<br>Looks OK, so most probably it's some network issue. Use tcpdump, etc. i=
n you
<br>work environment to see exactly what is going on, and if it is indeed
<br>a DNS issue
<br>(although what you are getting there might be unrelated). Also try to
<br>find out what
<br>is common between the users that are having the issue (same area, carri=
er,
<br>device, Android version, etc.)
<br>
<br>HTH
<br></blockquote></blockquote></div></blockquote></div>
------=_Part_702_23918214.1352221593441--

------=_Part_701_15038727.1352221593441--