blob: 95aad91a6f102203e21a91fcd2da87c90304e367 [file] [log] [blame]
/*
* 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 junit.framework.TestCase;
import libcore.javax.net.ssl.TestSSLContext;
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();
}
}