diff --git a/api/current.txt b/api/current.txt index 57fedcec54d66..e96b8f9c36ce2 100644 --- a/api/current.txt +++ b/api/current.txt @@ -12744,6 +12744,7 @@ package android.net { method public static javax.net.ssl.SSLSocketFactory getDefault(int, android.net.SSLSessionCache); method public java.lang.String[] getDefaultCipherSuites(); method public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache); + method public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, int, android.net.SSLSessionCache); method public static javax.net.ssl.SSLSocketFactory getInsecure(int, android.net.SSLSessionCache); method public byte[] getNpnSelectedProtocol(java.net.Socket); method public java.lang.String[] getSupportedCipherSuites(); diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java index 543f6a12177a6..42fb5c3cd682b 100644 --- a/core/java/android/net/SSLCertificateSocketFactory.java +++ b/core/java/android/net/SSLCertificateSocketFactory.java @@ -90,6 +90,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { private byte[] mNpnProtocols = null; private final int mHandshakeTimeoutMillis; + private final int mWriteTimeoutMillis; private final SSLClientSessionCache mSessionCache; private final boolean mSecure; @@ -100,12 +101,21 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { } private SSLCertificateSocketFactory( - int handshakeTimeoutMillis, SSLSessionCache cache, boolean secure) { + int handshakeTimeoutMillis, + int writeTimeoutMillis, + SSLSessionCache cache, + boolean secure) { mHandshakeTimeoutMillis = handshakeTimeoutMillis; + mWriteTimeoutMillis = writeTimeoutMillis; mSessionCache = cache == null ? null : cache.mSessionCache; mSecure = secure; } + private SSLCertificateSocketFactory( + int handshakeTimeoutMillis, SSLSessionCache cache, boolean secure) { + this(handshakeTimeoutMillis, 0, cache, secure); + } + /** * Returns a new socket factory instance with an optional handshake timeout. * @@ -161,6 +171,24 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { new SSLCertificateSocketFactory(handshakeTimeoutMillis, cache, true)); } + /** + * Returns a socket factory (also named SSLSocketFactory, but in a different + * namespace) for use with the Apache HTTP stack. + * + * @param handshakeTimeoutMillis to use for SSL connection handshake, or 0 + * for none. The socket timeout is reset to 0 after the handshake. + * @param writeTimeoutMillis the desired write timeout in milliseconds or 0 for none. + * @param cache The {@link SSLSessionCache} to use, or null for no cache. + * @return a new SocketFactory with the specified parameters + */ + public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory( + int handshakeTimeoutMillis, + int writeTimeoutMillis, + SSLSessionCache cache) { + return new org.apache.http.conn.ssl.SSLSocketFactory(new SSLCertificateSocketFactory( + handshakeTimeoutMillis, writeTimeoutMillis, cache, true)); + } + /** * Verify the hostname of the certificate used by the other end of a * connected socket. You MUST call this if you did not supply a hostname @@ -376,6 +404,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(k, host, port, close); s.setNpnProtocols(mNpnProtocols); s.setHandshakeTimeout(mHandshakeTimeoutMillis); + s.setSoWriteTimeout(mWriteTimeoutMillis); if (mSecure) { verifyHostname(s, host); } @@ -395,6 +424,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(); s.setNpnProtocols(mNpnProtocols); s.setHandshakeTimeout(mHandshakeTimeoutMillis); + s.setSoWriteTimeout(mWriteTimeoutMillis); return s; } @@ -412,6 +442,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { addr, port, localAddr, localPort); s.setNpnProtocols(mNpnProtocols); s.setHandshakeTimeout(mHandshakeTimeoutMillis); + s.setSoWriteTimeout(mWriteTimeoutMillis); return s; } @@ -427,6 +458,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(addr, port); s.setNpnProtocols(mNpnProtocols); s.setHandshakeTimeout(mHandshakeTimeoutMillis); + s.setSoWriteTimeout(mWriteTimeoutMillis); return s; } @@ -443,6 +475,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { host, port, localAddr, localPort); s.setNpnProtocols(mNpnProtocols); s.setHandshakeTimeout(mHandshakeTimeoutMillis); + s.setSoWriteTimeout(mWriteTimeoutMillis); if (mSecure) { verifyHostname(s, host); } @@ -460,6 +493,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(host, port); s.setNpnProtocols(mNpnProtocols); s.setHandshakeTimeout(mHandshakeTimeoutMillis); + s.setSoWriteTimeout(mWriteTimeoutMillis); if (mSecure) { verifyHostname(s, host); } diff --git a/core/java/android/net/http/AndroidHttpClient.java b/core/java/android/net/http/AndroidHttpClient.java index c534e58f37e11..8169a943c206c 100644 --- a/core/java/android/net/http/AndroidHttpClient.java +++ b/core/java/android/net/http/AndroidHttpClient.java @@ -16,7 +16,16 @@ package android.net.http; +import android.content.ContentResolver; +import android.content.Context; +import android.net.SSLCertificateSocketFactory; +import android.net.SSLSessionCache; +import android.os.Looper; +import android.util.Base64; +import android.util.Log; + import com.android.internal.http.HttpDateTime; + import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpEntityEnclosingRequest; @@ -25,18 +34,18 @@ import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpResponse; -import org.apache.http.entity.AbstractHttpEntity; -import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.protocol.ClientContext; 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; @@ -44,25 +53,17 @@ 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.HttpContext; -import org.apache.http.protocol.BasicHttpContext; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.ByteArrayOutputStream; import java.io.OutputStream; +import java.net.URI; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import java.net.URI; - -import android.content.Context; -import android.content.ContentResolver; -import android.net.SSLCertificateSocketFactory; -import android.net.SSLSessionCache; -import android.os.Looper; -import android.util.Base64; -import android.util.Log; /** * Implementation of the Apache {@link DefaultHttpClient} that is configured with @@ -134,7 +135,7 @@ public final class AndroidHttpClient implements HttpClient { PlainSocketFactory.getSocketFactory(), 80)); schemeRegistry.register(new Scheme("https", SSLCertificateSocketFactory.getHttpSocketFactory( - SOCKET_OPERATION_TIMEOUT, sessionCache), 443)); + SOCKET_OPERATION_TIMEOUT, SOCKET_OPERATION_TIMEOUT, sessionCache), 443)); ClientConnectionManager manager = new ThreadSafeClientConnManager(params, schemeRegistry);