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