1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.luni.tests.internal.net.www.protocol.http; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Authenticator; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.HttpURLConnection; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetSocketAddress; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.PasswordAuthentication; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Proxy; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.ProxySelector; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.ServerSocket; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Socket; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketAddress; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketTimeoutException; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URI; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests for <code>HTTPURLConnection</code> class constructors and methods. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class HttpURLConnectionTest extends TestCase { 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final static Object bound = new Object(); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class MockServer extends Thread { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ServerSocket serverSocket; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean accepted = false; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean started = false; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public MockServer(String name) throws IOException { 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(name); 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project serverSocket = new ServerSocket(0); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project serverSocket.setSoTimeout(1000); 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int port() { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return serverSocket.getLocalPort(); 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void run() { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (bound) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project started = true; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bound.notify(); 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project serverSocket.accept().close(); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project accepted = true; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SocketTimeoutException ignore) { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project serverSocket.close(); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException(e); 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class MockProxyServer extends MockServer { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean acceptedAuthorizedRequest; 83f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public MockProxyServer(String name) throws Exception { 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(name); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void run() { 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Socket socket = serverSocket.accept(); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project socket.setSoTimeout(1000); 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buff = new byte[1024]; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int num = socket.getInputStream().read(buff); 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project socket.getOutputStream().write(( 96f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes "HTTP/1.0 407 Proxy authentication required\n" 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + "Proxy-authenticate: Basic realm=\"remotehost\"\n\n") 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getBytes()); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project num = socket.getInputStream().read(buff); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (num == -1) { 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this connection was closed, create new one: 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project socket = serverSocket.accept(); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project socket.setSoTimeout(1000); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project num = socket.getInputStream().read(buff); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String request = new String(buff, 0, num); 107f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes acceptedAuthorizedRequest = 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project request.toLowerCase().indexOf("proxy-authorization:") > 0; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (acceptedAuthorizedRequest) { 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project socket.getOutputStream().write(( 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "HTTP/1.1 200 OK\n\n").getBytes()); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ProxySelector implementation used in the test. 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class TestProxySelector extends ProxySelector { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // proxy port 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int proxy_port; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // server port 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int server_port; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates proxy selector instance. 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Selector will return the proxy, only if the connection 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is made to localhost:server_port. Otherwise it will 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * return NO_PROXY. 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Address of the returned proxy will be localhost:proxy_port. 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public TestProxySelector(int server_port, int proxy_port) { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.server_port = server_port; 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.proxy_port = proxy_port; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public java.util.List<Proxy> select(URI uri) { 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Proxy proxy = Proxy.NO_PROXY; 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (("localhost".equals(uri.getHost())) 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && (server_port == uri.getPort())) { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy = new Proxy(Proxy.Type.HTTP, 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new InetSocketAddress("localhost", proxy_port)); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ArrayList<Proxy> result = new ArrayList<Proxy>(); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.add(proxy); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // do nothing 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 159229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * org.apache.harmony.luni.internal.net.www.http.getOutputStream() 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testGetOutputStream() throws Exception { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Regression for HARMONY-482 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MockServer httpServer = 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new MockServer("ServerSocket for HttpURLConnectionTest"); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project httpServer.start(); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized(bound) { 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!httpServer.started) { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bound.wait(5000); 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project HttpURLConnection c = (HttpURLConnection) 172a566c3ecc8c821172e27d89444dd7cadfbdc369bJorg Pleumann new URL("http://localhost:" + httpServer.port()).openConnection(); 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.setDoOutput(true); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //use new String("POST") instead of simple "POST" to obtain other 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //object instances then those that are in HttpURLConnection classes 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.setRequestMethod(new String("POST")); 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.getOutputStream(); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project httpServer.join(); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Test checks if the proxy specified in openConnection 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method will be used for connection to the server 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testUsingProxy() throws Exception { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Regression for HARMONY-570 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MockServer server = new MockServer("server"); 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MockServer proxy = new MockServer("proxy"); 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project URL url = new URL("http://localhost:" + server.port()); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project HttpURLConnection connection = (HttpURLConnection) url 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .openConnection(new Proxy(Proxy.Type.HTTP, 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new InetSocketAddress("localhost", 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.port()))); 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.setConnectTimeout(2000); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.setReadTimeout(2000); 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project server.start(); 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized(bound) { 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!server.started) bound.wait(5000); 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.start(); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized(bound) { 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!proxy.started) bound.wait(5000); 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.connect(); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // wait while server and proxy run 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project server.join(); 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.join(); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Connection does not use proxy", connection.usingProxy()); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Proxy server was not used", proxy.accepted); 217f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project HttpURLConnection huc = (HttpURLConnection)url.openConnection(Proxy.NO_PROXY); 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertFalse(huc.usingProxy()); 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Test checks if the proxy provided by proxy selector 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will be used for connection to the server 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testUsingProxySelector() throws Exception { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Regression for HARMONY-570 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MockServer server = new MockServer("server"); 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MockServer proxy = new MockServer("proxy"); 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project URL url = new URL("http://localhost:" + server.port()); 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // keep default proxy selector 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProxySelector defPS = ProxySelector.getDefault(); 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // replace selector 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProxySelector.setDefault( 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new TestProxySelector(server.port(), proxy.port())); 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project HttpURLConnection connection = 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (HttpURLConnection) url.openConnection(); 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.setConnectTimeout(2000); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.setReadTimeout(2000); 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project server.start(); 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized(bound) { 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!server.started) bound.wait(5000); 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.start(); 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized(bound) { 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!proxy.started) bound.wait(5000); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.connect(); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // wait while server and proxy run 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project server.join(); 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.join(); 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 259f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes assertTrue("Connection does not use proxy", 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.usingProxy()); 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Proxy server was not used", proxy.accepted); 262bcd90c94df25762ef06654bf937960e20dae8e2aNarayan Kamath 263bcd90c94df25762ef06654bf937960e20dae8e2aNarayan Kamath connection.disconnect(); 264bcd90c94df25762ef06654bf937960e20dae8e2aNarayan Kamath assertTrue("usingProxy broken after disconnect", 265bcd90c94df25762ef06654bf937960e20dae8e2aNarayan Kamath connection.usingProxy()); 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // restore default proxy selector 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProxySelector.setDefault(defPS); 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2716a6b612286976cc185c898803fe51e4e062bd9ebBrett Chabot // SideEffect: Suffers from side effect of other, currently unknown test 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testProxyAuthorization() throws Exception { 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Set up test Authenticator 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Authenticator.setDefault(new Authenticator() { 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected PasswordAuthentication getPasswordAuthentication() { 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new PasswordAuthentication( 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "user", "password".toCharArray()); 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }); 281f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MockProxyServer proxy = new MockProxyServer("ProxyServer"); 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project URL url = new URL("http://remotehost:55555/requested.data"); 286f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes HttpURLConnection connection = 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (HttpURLConnection) url.openConnection( 288f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes new Proxy(Proxy.Type.HTTP, 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new InetSocketAddress("localhost", proxy.port()))); 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.setConnectTimeout(1000); 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.setReadTimeout(1000); 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.start(); 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connection.connect(); 296f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes assertEquals("unexpected response code", 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200, connection.getResponseCode()); 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.join(); 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Connection did not send proxy authorization request", 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project proxy.acceptedAuthorizedRequest); 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // remove previously set authenticator 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Authenticator.setDefault(null); 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 306f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 308