diff options
author | Brian Carlstrom <bdc@google.com> | 2010-07-28 23:37:09 -0700 |
---|---|---|
committer | Brian Carlstrom <bdc@google.com> | 2010-07-28 23:49:30 -0700 |
commit | 5e8a587d49f014fdd42403f51bbe877855e4a6b3 (patch) | |
tree | a8a1b468531dbd0ee796f86ae1a48c8d4e168fac /core | |
parent | aae052324fb1d3add554158974c5a6ee609739b3 (diff) | |
download | frameworks_base-5e8a587d49f014fdd42403f51bbe877855e4a6b3.zip frameworks_base-5e8a587d49f014fdd42403f51bbe877855e4a6b3.tar.gz frameworks_base-5e8a587d49f014fdd42403f51bbe877855e4a6b3.tar.bz2 |
Tracking merge of dalvik-dev to master
Change-Id: Id4c19401ad0aa238219aaf5d9a20d2889d0a4b18
Diffstat (limited to 'core')
4 files changed, 149 insertions, 5 deletions
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java index 31acb5b..9166019 100644 --- a/core/java/android/net/SSLCertificateSocketFactory.java +++ b/core/java/android/net/SSLCertificateSocketFactory.java @@ -46,9 +46,9 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; +import org.apache.harmony.xnet.provider.jsse.OpenSSLContextImpl; import org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl; import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache; -import org.apache.harmony.xnet.provider.jsse.SSLContextImpl; import org.apache.harmony.xnet.provider.jsse.SSLParameters; /** @@ -210,7 +210,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { private SSLSocketFactory makeSocketFactory(TrustManager[] trustManagers) { try { - SSLContextImpl sslContext = new SSLContextImpl(); + OpenSSLContextImpl sslContext = new OpenSSLContextImpl(); sslContext.engineInit(null, trustManagers, null, mSessionCache, null); return sslContext.engineGetSocketFactory(); } catch (KeyManagementException e) { diff --git a/core/java/android/net/http/HttpsConnection.java b/core/java/android/net/http/HttpsConnection.java index 9b842ae..cefa997 100644 --- a/core/java/android/net/http/HttpsConnection.java +++ b/core/java/android/net/http/HttpsConnection.java @@ -19,8 +19,8 @@ package android.net.http; import android.content.Context; import android.util.Log; import org.apache.harmony.xnet.provider.jsse.FileClientSessionCache; +import org.apache.harmony.xnet.provider.jsse.OpenSSLContextImpl; import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache; -import org.apache.harmony.xnet.provider.jsse.SSLContextImpl; import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpHost; @@ -79,7 +79,7 @@ public class HttpsConnection extends Connection { cache = FileClientSessionCache.usingDirectory(sessionDir); } - SSLContextImpl sslContext = new SSLContextImpl(); + OpenSSLContextImpl sslContext = new OpenSSLContextImpl(); // here, trust managers is a single trust-all manager TrustManager[] trustManagers = new TrustManager[] { diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk index 245c67c..01faaad 100644 --- a/core/tests/coretests/Android.mk +++ b/core/tests/coretests/Android.mk @@ -13,7 +13,9 @@ LOCAL_SRC_FILES := \ LOCAL_STATIC_JAVA_LIBRARIES += android-common -LOCAL_JAVA_LIBRARIES := android.test.runner +LOCAL_DX_FLAGS := --core-library +LOCAL_STATIC_JAVA_LIBRARIES := core-tests-supportlib +LOCAL_JAVA_LIBRARIES := android.test.runner android-common LOCAL_PACKAGE_NAME := FrameworksCoreTests LOCAL_CERTIFICATE := platform diff --git a/core/tests/coretests/src/android/net/http/HttpsThroughHttpProxyTest.java b/core/tests/coretests/src/android/net/http/HttpsThroughHttpProxyTest.java new file mode 100644 index 0000000..f3b7c06 --- /dev/null +++ b/core/tests/coretests/src/android/net/http/HttpsThroughHttpProxyTest.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.http; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.List; +import javax.net.ssl.TestSSLContext; +import junit.framework.TestCase; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.params.ConnRoutePNames; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.ssl.AllowAllHostnameVerifier; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.impl.client.DefaultHttpClient; +import tests.http.MockResponse; +import tests.http.MockWebServer; +import tests.http.RecordedRequest; + +public class HttpsThroughHttpProxyTest extends TestCase { + + public void testConnectViaHttps() throws IOException, InterruptedException { + TestSSLContext testSSLContext = TestSSLContext.create(); + + MockWebServer server = new MockWebServer(); + server.useHttps(testSSLContext.serverContext.getSocketFactory(), false); + server.enqueue(new MockResponse() + .setResponseCode(200) + .setBody("this response comes via HTTPS")); + server.play(); + + HttpClient httpClient = new DefaultHttpClient(); + SSLSocketFactory sslSocketFactory = new SSLSocketFactory( + testSSLContext.clientContext.getSocketFactory()); + sslSocketFactory.setHostnameVerifier(new AllowAllHostnameVerifier()); + httpClient.getConnectionManager().getSchemeRegistry() + .register(new Scheme("https", sslSocketFactory, server.getPort())); + + HttpResponse response = httpClient.execute( + new HttpGet("https://localhost:" + server.getPort() + "/foo")); + assertEquals("this response comes via HTTPS", contentToString(response)); + + RecordedRequest request = server.takeRequest(); + assertEquals("GET /foo HTTP/1.1", request.getRequestLine()); + } + + /** + * http://code.google.com/p/android/issues/detail?id=2690 + */ + public void testConnectViaProxy() throws IOException, InterruptedException { + MockWebServer proxy = new MockWebServer(); + MockResponse mockResponse = new MockResponse() + .setResponseCode(200) + .setBody("this response comes via a proxy"); + proxy.enqueue(mockResponse); + proxy.play(); + + HttpClient httpProxyClient = new DefaultHttpClient(); + httpProxyClient.getParams().setParameter( + ConnRoutePNames.DEFAULT_PROXY, new HttpHost("localhost", proxy.getPort())); + + HttpResponse response = httpProxyClient.execute(new HttpGet("http://android.com/foo")); + assertEquals("this response comes via a proxy", contentToString(response)); + + RecordedRequest request = proxy.takeRequest(); + assertEquals("GET http://android.com/foo HTTP/1.1", request.getRequestLine()); + assertContains(request.getHeaders(), "Host: android.com"); + } + + public void testConnectViaHttpProxyToHttps() throws IOException, InterruptedException { + TestSSLContext testSSLContext = TestSSLContext.create(); + + MockWebServer proxy = new MockWebServer(); + proxy.useHttps(testSSLContext.serverContext.getSocketFactory(), true); + MockResponse connectResponse = new MockResponse() + .setResponseCode(200); + connectResponse.getHeaders().clear(); + proxy.enqueue(connectResponse); + proxy.enqueue(new MockResponse() + .setResponseCode(200) + .setBody("this response comes via a secure proxy")); + proxy.play(); + + HttpClient httpProxyClient = new DefaultHttpClient(); + HttpHost proxyHost = new HttpHost("localhost", proxy.getPort()); + httpProxyClient.getParams().setParameter( + ConnRoutePNames.DEFAULT_PROXY, proxyHost); + SSLSocketFactory sslSocketFactory = new SSLSocketFactory( + testSSLContext.clientContext.getSocketFactory()); + sslSocketFactory.setHostnameVerifier(new AllowAllHostnameVerifier()); + httpProxyClient.getConnectionManager().getSchemeRegistry() + .register(new Scheme("https", sslSocketFactory, 443)); + + HttpResponse response = httpProxyClient.execute(new HttpGet("https://android.com/foo")); + assertEquals("this response comes via a secure proxy", contentToString(response)); + + RecordedRequest connect = proxy.takeRequest(); + assertEquals("Connect line failure on proxy " + proxyHost.toHostString(), + "CONNECT android.com:443 HTTP/1.1", connect.getRequestLine()); + assertContains(connect.getHeaders(), "Host: android.com"); + + RecordedRequest get = proxy.takeRequest(); + assertEquals("GET /foo HTTP/1.1", get.getRequestLine()); + assertContains(get.getHeaders(), "Host: android.com"); + } + + private void assertContains(List<String> headers, String header) { + assertTrue(headers.toString(), headers.contains(header)); + } + + private String contentToString(HttpResponse response) throws IOException { + StringWriter writer = new StringWriter(); + char[] buffer = new char[1024]; + Reader reader = new InputStreamReader(response.getEntity().getContent()); + int length; + while ((length = reader.read(buffer)) != -1) { + writer.write(buffer, 0, length); + } + reader.close(); + return writer.toString(); + } +} |