HttpURLConnectionTest.java revision fc95c99cfa4921fef424f3f411d013b821589e69
1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements. See the NOTICE file distributed with 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership. 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License. You may obtain a copy of the License at 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License. 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.internal.net.www.protocol.http; 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException; 20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream; 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Authenticator; 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.ConnectException; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.HttpURLConnection; 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.InetSocketAddress; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.MalformedURLException; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.PasswordAuthentication; 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Proxy; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.ProxySelector; 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.ServerSocket; 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Socket; 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.SocketAddress; 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.SocketTimeoutException; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URI; 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URL; 35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Permission; 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.ArrayList; 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.List; 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Map; 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 40fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes// TODO: rewrite these tests to use MockWebServer, assuming we don't already have better equivalent tests. 41fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes/* 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.servlet.ServletException; 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.servlet.http.HttpServletRequest; 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.servlet.http.HttpServletResponse; 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.mortbay.jetty.HttpConnection; 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.mortbay.jetty.Request; 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.mortbay.jetty.Server; 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.mortbay.jetty.handler.DefaultHandler; 50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.support.Support_Jetty; 52fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes*/ 53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase; 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Tests for <code>HttpURLConnection</code> class constructors and methods. 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class HttpURLConnectionTest extends TestCase { 60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 61fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes/* 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private static final boolean DEBUG = false; 63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private final static Object bound = new Object(); 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static class MockServer extends Thread { 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ServerSocket serverSocket; 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean accepted = false; 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean started = false; 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public MockServer(String name) throws IOException { 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes super(name); 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverSocket = new ServerSocket(0); 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverSocket.setSoTimeout(5000); 75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public int port() { 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return serverSocket.getLocalPort(); 79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void run() { 83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes started = true; 86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.notify(); 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverSocket.accept().close(); 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes accepted = true; 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (SocketTimeoutException ignore) { 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverSocket.close(); 94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException e) { 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throw new RuntimeException(e); 96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static class MockHTTPServer extends MockServer { 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // HTTP response codes 102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static final int OK_CODE = 200; 103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static final int NOT_FOUND_CODE = 404; 104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // how many times persistent connection will be used 105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // by server 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int persUses; 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // result code to be sent to client 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int responseCode; 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // response content to be sent to client 110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String response = "<html></html>"; 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // client's POST message 112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String clientPost = "Hello from client!"; 113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public MockHTTPServer(String name, int persUses) throws IOException { 115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes this(name, persUses, OK_CODE); 116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public MockHTTPServer(String name, int persUses, int responseCode) 119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws IOException { 120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes super(name); 121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes this.persUses = persUses; 122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes this.responseCode = responseCode; 123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public int port() { 126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return serverSocket.getLocalPort(); 127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void run() { 131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes started = true; 134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.notify(); 135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = null; 137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Socket client = null; 138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes client = serverSocket.accept(); 140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes accepted = true; 141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < persUses; i++) { 142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("*** Using connection for " 144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + (i + 1) + " time ***"); 145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buff = new byte[1024]; 147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = client.getInputStream(); 148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int num = 0; // number of read bytes 149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int bytik; // read byte value 150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean wasEOL = false; 151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // read header (until empty string) 152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while (((bytik = is.read()) > 0)) { 153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (bytik == '\r') { 154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bytik = is.read(); 155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (wasEOL && (bytik == '\n')) { 157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes break; 158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes wasEOL = (bytik == '\n'); 160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buff[num++] = (byte) bytik; 161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // int num = is.read(buff); 163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String message = new String(buff, 0, num, "UTF-8"); 164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out 166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .println("---- Server got request: ----\n" 167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + message 168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "-----------------------------"); 169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Act as Server (not Proxy) side 172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (message.startsWith("POST")) { 173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // client connection sent some data 174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // if the data was not read with header 175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out 177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .println("---- Server read client's data: ----"); 178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes num = is.read(buff); 180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes message = new String(buff, 0, num, "UTF-8"); 181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("'" + message + "'"); 183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out 184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .println("------------------------------------"); 185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // check the received data 187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(clientPost, message); 188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes client 191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getOutputStream() 192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .write( 193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ("HTTP/1.1 " + responseCode + " OK\n" 194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "Content-type: text/html\n" 195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "Content-length: " 196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + response.length() + "\n\n" + response) 197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getBytes("UTF-8")); 198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (responseCode != OK_CODE) { 200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // wait while test case check closed connection 201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // and interrupt this thread 202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while (!isInterrupted()) { 204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread.sleep(1000); 205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Exception ignore) { 207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (SocketTimeoutException ignore) { 211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ignore.printStackTrace(); 212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (is != null) { 214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is.close(); 215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (client != null) { 217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes client.close(); 218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverSocket.close(); 220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException e) { 222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throw new RuntimeException(e); 223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static class MockProxyServer extends MockServer { 228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean acceptedAuthorizedRequest; 230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public MockProxyServer(String name) throws Exception { 232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes super(name); 233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void run() { 237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Socket socket = serverSocket.accept(); 239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socket.setSoTimeout(5000); 240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buff = new byte[1024]; 241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int num = socket.getInputStream().read(buff); 242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socket 243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getOutputStream() 244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .write( 245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ("HTTP/1.0 407 Proxy authentication required\n" 246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "Proxy-authenticate: Basic realm=\"remotehost\"\n\n") 247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getBytes("UTF-8")); 248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes num = socket.getInputStream().read(buff); 249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (num == -1) { 250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // this connection was closed, create new one: 251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socket = serverSocket.accept(); 252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socket.setSoTimeout(5000); 253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes num = socket.getInputStream().read(buff); 254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String request = new String(buff, 0, num, "UTF-8"); 256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes acceptedAuthorizedRequest = request.toLowerCase().indexOf( 257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "proxy-authorization:") > 0; 258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (acceptedAuthorizedRequest) { 259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socket.getOutputStream().write( 260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ("HTTP/1.1 200 OK\n\n").getBytes("UTF-8")); 261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException e) { 263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private int jettyPort = 0; 268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private String jettyURL; 270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void setUp() throws Exception { 272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes jettyPort = Support_Jetty.startDefaultHttpServer(); 273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes jettyURL = "http://localhost:" + jettyPort + "/servlet"; 274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("\n=============================="); 276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("===== Execution: " + getName()); 277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("=============================="); 278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public static class ResponseServer { 282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private Server server = null; 283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private int port = -1; 285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public class MyRealmHandler extends DefaultHandler { 287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void handle(String target, HttpServletRequest request, 288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpServletResponse response, int dispatch) 289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws IOException, ServletException { 290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean auth = request.getHeader("Authorization") != null; 291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String resLoc = request.getPathInfo(); 292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean noRealm = "/norealm".equals(resLoc); 293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Request base_request = (request instanceof Request) ? (Request) request 295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes : HttpConnection.getCurrentConnection().getRequest(); 296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes base_request.setHandled(true); 297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes response.setContentType("text/html"); 298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes response.addDateHeader("Date", System.currentTimeMillis()); 299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (noRealm) { 300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes response.getWriter().print("<h1>No WWW-Authenticate</h1>"); 302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } else { 303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (auth) { 304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes response.setStatus(HttpServletResponse.SC_OK); 305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } else { 306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes response.addHeader("WWW-Authenticate", 308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "Basic realm=\"HelloWorld\""); 309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void startServer(DefaultHandler handler) throws Exception { 315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server = new Server(0); 316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.setHandler(handler); 317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.start(); 318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes port = server.getConnectors()[0].getLocalPort(); 319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void stopServer() throws Exception { 322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (server != null) { 323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.stop(); 324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server = null; 325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public int getPort() { 329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return port; 330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 333fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test response code which need authenticate 334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testGetResponseCode() throws Exception { 335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ResponseServer server = new ResponseServer(); 336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection conn = null; 337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.startServer(server.new MyRealmHandler()); 339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int port = server.getPort(); 340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes conn = (HttpURLConnection) new URL("http://localhost:" + port 342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "/norealm").openConnection(); 343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(401, conn.getResponseCode()); 344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (conn != null) { 346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes conn.disconnect(); 348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Exception e) { 349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes conn = (HttpURLConnection) new URL("http://localhost:" + port 355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "/realm").openConnection(); 356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(401, conn.getResponseCode()); 357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Basic realm=\"HelloWorld\"", conn 358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getHeaderField("WWW-Authenticate")); 359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (conn != null) { 361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes conn.disconnect(); 363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Exception e) { 364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Authenticator.setDefault(new Authenticator() { 370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public PasswordAuthentication getPasswordAuthentication() { 371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return new PasswordAuthentication("test", "password" 372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .toCharArray()); 373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }); 375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.startServer(server.new MyRealmHandler()); 376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes conn = (HttpURLConnection) new URL("http://localhost:" + port 377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "/realm").openConnection(); 378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(200, conn.getResponseCode()); 379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertNull(conn.getHeaderField("WWW-Authenticate")); 380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (conn != null) { 382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes conn.disconnect(); 384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Exception e) { 385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.stopServer(); 390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 393fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // ProxySelector implementation used in the test. 394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static class TestProxySelector extends ProxySelector { 395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // proxy port 396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private int proxy_port; 397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // server port 398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private int server_port; 399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 400fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Creates proxy selector instance. Selector will return the proxy, only 401fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // if the connection is made to localhost:server_port. Otherwise it will 402fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // return NO_PROXY. Address of the returned proxy will be 403fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // localhost:proxy_port. 404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public TestProxySelector(int server_port, int proxy_port) { 405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes this.server_port = server_port; 406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes this.proxy_port = proxy_port; 407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public java.util.List<Proxy> select(URI uri) { 411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Proxy proxy = Proxy.NO_PROXY; 412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (("localhost".equals(uri.getHost())) 413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes && (server_port == uri.getPort())) { 414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress( 415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "localhost", proxy_port)); 416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ArrayList<Proxy> result = new ArrayList<Proxy>(); 418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes result.add(proxy); 419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return result; 420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { 424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // do nothing 425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void test_getHeaderFields() throws Exception { 429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes URL url = new URL(jettyURL); 430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection httpURLConnect = (HttpURLConnection) url 431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .openConnection(); 432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(200, httpURLConnect.getResponseCode()); 433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("OK", httpURLConnect.getResponseMessage()); 434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Map headers = httpURLConnect.getHeaderFields(); 435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // there should be at least 2 headers 436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue(headers.size() > 1); 437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes List list = (List) headers.get("Content-Length"); 438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (list == null) { 439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes list = (List) headers.get("content-length"); 440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertNotNull(list); 442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes headers.put("key", "value"); 444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("should throw UnsupportedOperationException"); 445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (UnsupportedOperationException e) { 446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Expected 447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes list.set(0, "value"); 450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("should throw UnsupportedOperationException"); 451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (UnsupportedOperationException e) { 452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Expected 453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 454fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes 455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpURLConnect.setRequestProperty("key", "value"); 457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("should throw IlegalStateException"); 458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IllegalStateException e) { 459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Expected 460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 463fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // @tests the url with space 464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testConnectWithSpaceinURL() throws Exception { 465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String jettyURLwithSpace = "http://localhost:" + jettyPort 466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "/servlet with space"; 467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection httpURLConnect = (HttpURLConnection) new URL( 468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes jettyURLwithSpace).openConnection(); 469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpURLConnect.setDoOutput(true); 470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpURLConnect.connect(); 471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(200, httpURLConnect.getResponseCode()); 472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("OK", httpURLConnect.getResponseMessage()); 473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 475fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // @tests the url with space 476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testConnectWithSpaceinURL1() throws Exception { 477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String jettyURLwithSpace = "http://localhost:" + jettyPort 478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "/servlet with space?arg1=value>1&arg2=%aval%1Aue&arg3=#"; 479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection httpURLConnect = (HttpURLConnection) new URL( 480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes jettyURLwithSpace).openConnection(); 481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpURLConnect.setDoOutput(true); 482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpURLConnect.connect(); 483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(200, httpURLConnect.getResponseCode()); 484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("OK", httpURLConnect.getResponseMessage()); 485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testGetOutputStream() throws Exception { 488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Regression for HARMONY-482 489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockServer httpServer = new MockServer( 490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "ServerSocket for HttpURLConnectionTest"); 491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c = (HttpURLConnection) new URL("http://127.0.0.1:" 498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoOutput(true); 500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // use new String("POST") instead of simple "POST" to obtain other 501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // object instances then those that are in HttpURLConnection classes 502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setRequestMethod(new String("POST")); 503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.getOutputStream(); 504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.join(); 505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 507fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test whether getOutputStream can work after connection 508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void test_getOutputStream_AfterConnect() throws Exception { 509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes URL url = new URL(jettyURL); 510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.setDoOutput(true); 512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.connect(); 513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String str_get = connection.getRequestMethod(); 514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue(str_get.equalsIgnoreCase("GET")); 515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // call to getOutputStream should implicitly set req. method to POST 517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.getOutputStream(); 518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String str_post = connection.getRequestMethod(); 519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue(str_post.equalsIgnoreCase("POST")); 520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 522fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test checks if the proxy specified in openConnection method will be used 523fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // for connection to the server 524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testUsingProxy() throws Exception { 525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Regression for HARMONY-570 526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockServer server = new MockServer("server"); 527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockServer proxy = new MockServer("proxy"); 528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes URL url = new URL("http://localhost:" + server.port()); 530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection connection = (HttpURLConnection) url 532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .openConnection(new Proxy(Proxy.Type.HTTP, 533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new InetSocketAddress("localhost", proxy.port()))); 534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.setConnectTimeout(2000); 535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.setReadTimeout(2000); 536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.start(); 538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!server.started) 540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy.start(); 543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!proxy.started) 545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.connect(); 549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // wait while server and proxy run 551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.join(); 552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy.join(); 553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Connection does not use proxy", connection.usingProxy()); 555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Proxy server was not used", proxy.accepted); 556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection huc = (HttpURLConnection) url 558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .openConnection(Proxy.NO_PROXY); 559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertFalse(huc.usingProxy()); 560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testUsingProxy2() throws Exception { 563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.setProperty("http.proxyHost", "localhost"); 565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.setProperty("http.proxyPort", jettyPort + ""); 566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes URL url = new URL(jettyURL); 567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection urlConnect = (HttpURLConnection) url 568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .openConnection(); 569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnect.getInputStream(); 570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue(urlConnect.usingProxy()); 571fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes 572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // find a free port 573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ServerSocket serverSocket = new ServerSocket(0); 574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int port = serverSocket.getLocalPort(); 575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverSocket.close(); 576fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes 577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.setProperty("http.proxyPort", port + ""); 578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes url = new URL(jettyURL); 579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnect = (HttpURLConnection) url.openConnection(); 580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnect.getInputStream(); 581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertFalse(urlConnect.usingProxy()); 582fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes 583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes url = new URL("http://localhost:" + port); 584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnect = (HttpURLConnection) url.openConnection(); 585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnect.getInputStream(); 587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("should throw ConnectException"); 588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (ConnectException e) { 589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Expected 590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertFalse(urlConnect.usingProxy()); 592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.setProperties(null); 594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 597fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test checks if the proxy provided by proxy selector will be used for 598fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // connection to the server 599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testUsingProxySelector() throws Exception { 600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Regression for HARMONY-570 601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockServer server = new MockServer("server"); 602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockServer proxy = new MockServer("proxy"); 603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes URL url = new URL("http://localhost:" + server.port()); 605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // keep default proxy selector 607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ProxySelector defPS = ProxySelector.getDefault(); 608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // replace selector 609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ProxySelector.setDefault(new TestProxySelector(server.port(), proxy 610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .port())); 611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection connection = (HttpURLConnection) url 614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .openConnection(); 615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.setConnectTimeout(2000); 616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.setReadTimeout(2000); 617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.start(); 619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!server.started) 621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy.start(); 624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!proxy.started) 626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.connect(); 629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // wait while server and proxy run 631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.join(); 632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy.join(); 633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Connection does not use proxy", connection.usingProxy()); 635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Proxy server was not used", proxy.accepted); 636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // restore default proxy selector 638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ProxySelector.setDefault(defPS); 639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testProxyAuthorization() throws Exception { 643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Set up test Authenticator 644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Authenticator.setDefault(new Authenticator() { 645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected PasswordAuthentication getPasswordAuthentication() { 647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return new PasswordAuthentication("user", "password" 648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .toCharArray()); 649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }); 651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockProxyServer proxy = new MockProxyServer("ProxyServer"); 654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes URL url = new URL("http://remotehost:55555/requested.data"); 656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection connection = (HttpURLConnection) url 657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .openConnection(new Proxy(Proxy.Type.HTTP, 658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new InetSocketAddress("localhost", proxy.port()))); 659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.setConnectTimeout(5000); 660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.setReadTimeout(5000); 661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy.start(); 663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes connection.connect(); 665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("unexpected response code", 200, connection 666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getResponseCode()); 667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy.join(); 668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Connection did not send proxy authorization request", 669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes proxy.acceptedAuthorizedRequest); 670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // remove previously set authenticator 672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Authenticator.setDefault(null); 673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 676fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test that a connection is not closed if the client reads all the data but 677fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // not closes input stream. read until -1. 678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testConnectionPersistence() throws Exception { 679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockHTTPServer httpServer = new MockHTTPServer( 680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "HTTP Server for persistence checking", 2); 681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:" 689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Actual connection class: " + c.getClass()); 692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoInput(true); 695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setConnectTimeout(5000); 696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setReadTimeout(5000); 697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = c.getInputStream(); 698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buffer = new byte[128]; 699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int totalBytes = 0; 700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int bytesRead = 0; 701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytesRead = is.read(buffer)) > 0) { 702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" 704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + new String(buffer, 0, bytesRead, "UTF-8") + "'"); 705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes totalBytes += bytesRead; 707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:" 710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoInput(true); 712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setConnectTimeout(5000); 713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setReadTimeout(5000); 714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = c2.getInputStream(); 715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buffer = new byte[128]; 716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes totalBytes = 0; 717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bytesRead = 0; 718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytesRead = is.read(buffer)) > 0) { 719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" 721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + new String(buffer, 0, bytesRead, "UTF-8") + "'"); 722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes totalBytes += bytesRead; 723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 727fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test that a connection is not closed if the client reads all the data but 728fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // not closes input stream. read() not receives -1. 729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testConnectionPersistence2() throws Exception { 730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockHTTPServer httpServer = new MockHTTPServer( 731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "HTTP Server for persistence checking", 2); 732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:" 740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Actual connection class: " + c.getClass()); 743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoInput(true); 746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setConnectTimeout(5000); 747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setReadTimeout(5000); 748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = c.getInputStream(); 749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int bytes2Read = httpServer.response.length(); 750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buffer = new byte[httpServer.response.length()]; 751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read -= is.read(buffer)) > 0) { 752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:" 759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoInput(true); 761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setConnectTimeout(5000); 762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setReadTimeout(5000); 763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = c2.getInputStream(); 764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buffer = new byte[httpServer.response.length()]; 765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bytes2Read = httpServer.response.length(); 766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read -= is.read(buffer)) > 0) { 767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 774fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test that a connection is not closed if it firstly does POST, and then 775fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // does GET requests. 776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testConnectionPersistence3() throws Exception { 777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockHTTPServer httpServer = new MockHTTPServer( 778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "HTTP Server for persistence checking", 2); 779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:" 787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Actual connection class: " + c.getClass()); 790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoInput(true); 793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoOutput(true); 794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setConnectTimeout(5000); 795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setReadTimeout(5000); 796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8")); 797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = c.getInputStream(); 799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int bytes2Read = httpServer.response.length(); 800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buffer = new byte[httpServer.response.length()]; 801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read -= is.read(buffer)) > 0) { 802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:" 809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoInput(true); 811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setConnectTimeout(5000); 812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setReadTimeout(5000); 813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = c2.getInputStream(); 814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buffer = new byte[httpServer.response.length()]; 815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bytes2Read = httpServer.response.length(); 816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read -= is.read(buffer)) > 0) { 817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 824fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test that a connection is not closed if it firstly does GET, and then 825fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // does POST requests. 826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testConnectionPersistence4() throws Exception { 827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockHTTPServer httpServer = new MockHTTPServer( 828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "HTTP Server for persistence checking", 2); 829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 832561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 833561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 836561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:" 837561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Actual connection class: " + c.getClass()); 840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoInput(true); 843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setConnectTimeout(5000); 844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setReadTimeout(5000); 845561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 846561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = c.getInputStream(); 847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int bytes2Read = httpServer.response.length(); 848561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buffer = new byte[httpServer.response.length()]; 849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read = is.read(buffer)) > 0) { 850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 854561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 855561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:" 857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoOutput(true); 859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoInput(true); 860561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setConnectTimeout(5000); 861561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setReadTimeout(5000); 862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8")); 863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = c2.getInputStream(); 864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buffer = new byte[httpServer.response.length()]; 865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bytes2Read = httpServer.response.length(); 866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read = is.read(buffer)) > 0) { 867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 871561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 872561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 873561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 874fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test that a connection is not closed if it does POST for 2 times. 875561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testConnectionPersistence5() throws Exception { 876561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockHTTPServer httpServer = new MockHTTPServer( 877561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "HTTP Server for persistence checking", 2); 878561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 879561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 880561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 881561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 882561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 883561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 884561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 885561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:" 886561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 887561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 888561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Actual connection class: " + c.getClass()); 889561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 890561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoOutput(true); 891561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoInput(true); 892561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setConnectTimeout(5000); 893561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setReadTimeout(5000); 894561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8")); 895561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = c.getInputStream(); 896561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int bytes2Read = httpServer.response.length(); 897561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buffer = new byte[httpServer.response.length()]; 898561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read = is.read(buffer)) > 0) { 899561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 900561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 901561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 902561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 903561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 904561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 905561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:" 906561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + httpServer.port()).openConnection(); 907561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoOutput(true); 908561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoInput(true); 909561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setConnectTimeout(5000); 910561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setReadTimeout(5000); 911561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8")); 912561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = c2.getInputStream(); 913561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buffer = new byte[httpServer.response.length()]; 914561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bytes2Read = httpServer.response.length(); 915561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read = is.read(buffer)) > 0) { 916561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 917561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 918561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 919561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 920561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 921561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 922561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 923fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // Test that a connection made through proxy will be reused for connection 924fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes // establishing without proxy. 925561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testProxiedConnectionPersistence() throws Exception { 926561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockHTTPServer httpServer = new MockHTTPServer( 927561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "HTTP Server for persistence checking", 2); 928561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 929561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 930561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 931561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 932561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 933561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 934561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 935561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c = (HttpURLConnection) new URL( 936561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "http://some.host:1234").openConnection(new Proxy( 937561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Proxy.Type.HTTP, new InetSocketAddress("localhost", httpServer 938561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .port()))); 939561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 940561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Actual connection class: " + c.getClass()); 941561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 942561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoOutput(true); 943561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setDoInput(true); 944561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setConnectTimeout(5000); 945561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.setReadTimeout(5000); 946561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8")); 947561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = c.getInputStream(); 948561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int bytes2Read = httpServer.response.length(); 949561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buffer = new byte[httpServer.response.length()]; 950561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read = is.read(buffer)) > 0) { 951561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 952561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 953561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 954561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 955561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 956561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 957561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection c2 = (HttpURLConnection) new URL( 958561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "http://some.host:1234").openConnection(); 959561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoOutput(true); 960561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setDoInput(true); 961561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setConnectTimeout(5000); 962561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.setReadTimeout(5000); 963561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes c2.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8")); 964561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = c2.getInputStream(); 965561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buffer = new byte[httpServer.response.length()]; 966561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bytes2Read = httpServer.response.length(); 967561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while ((bytes2Read = is.read(buffer)) > 0) { 968561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 969561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (DEBUG) { 970561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client got response: '" + new String(buffer) 971561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + "'"); 972561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 973561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 974561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 975561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testSetRequestProperty() throws Exception { 976561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes MockHTTPServer httpServer = new MockHTTPServer( 977561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "HTTP Server for User-Specified Request Property", 2); 978561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes httpServer.start(); 979561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (bound) { 980561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!httpServer.started) { 981561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bound.wait(5000); 982561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 983561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 984561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 985561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes HttpURLConnection urlConnection = (HttpURLConnection) new URL( 986561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "http://localhost:" + httpServer.port()).openConnection(); 987561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(0, urlConnection.getRequestProperties().size()); 988561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 989561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes final String PROPERTY1 = "Accept"; 990561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes final String PROPERTY2 = "Connection"; 991561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnection.setRequestProperty(PROPERTY1, null); 992561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnection.setRequestProperty(PROPERTY1, null); 993561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnection.setRequestProperty(PROPERTY2, "keep-alive"); 994561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals(2, urlConnection.getRequestProperties().size()); 995561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertNull(urlConnection.getRequestProperty(PROPERTY1)); 996561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("keep-alive", urlConnection.getRequestProperty(PROPERTY2)); 997561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 998561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnection.setRequestProperty(PROPERTY1, "/"); 999561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes urlConnection.setRequestProperty(PROPERTY2, null); 1000561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("/", urlConnection.getRequestProperty(PROPERTY1)); 1001561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertNull(urlConnection.getRequestProperty(PROPERTY2)); 1002561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 1003fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes*/ 1004561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 1005