blob: 92a0fbb5ce764b643c347c16ce1673fea0b92466 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.harmony.luni.tests.internal.net.www.protocol.http;
import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URL;
import java.security.Permission;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
// TODO: rewrite these tests to use MockWebServer, assuming we don't already have better equivalent tests.
/*
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mortbay.jetty.HttpConnection;
import org.mortbay.jetty.Request;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.DefaultHandler;
import tests.support.Support_Jetty;
*/
import junit.framework.TestCase;
/**
* Tests for <code>HttpURLConnection</code> class constructors and methods.
*/
public class HttpURLConnectionTest extends TestCase {
/*
private static final boolean DEBUG = false;
private final static Object bound = new Object();
static class MockServer extends Thread {
ServerSocket serverSocket;
boolean accepted = false;
boolean started = false;
public MockServer(String name) throws IOException {
super(name);
serverSocket = new ServerSocket(0);
serverSocket.setSoTimeout(5000);
}
public int port() {
return serverSocket.getLocalPort();
}
@Override
public void run() {
try {
synchronized (bound) {
started = true;
bound.notify();
}
try {
serverSocket.accept().close();
accepted = true;
} catch (SocketTimeoutException ignore) {
}
serverSocket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
static class MockHTTPServer extends MockServer {
// HTTP response codes
static final int OK_CODE = 200;
static final int NOT_FOUND_CODE = 404;
// how many times persistent connection will be used
// by server
int persUses;
// result code to be sent to client
int responseCode;
// response content to be sent to client
String response = "<html></html>";
// client's POST message
String clientPost = "Hello from client!";
public MockHTTPServer(String name, int persUses) throws IOException {
this(name, persUses, OK_CODE);
}
public MockHTTPServer(String name, int persUses, int responseCode)
throws IOException {
super(name);
this.persUses = persUses;
this.responseCode = responseCode;
}
public int port() {
return serverSocket.getLocalPort();
}
@Override
public void run() {
try {
synchronized (bound) {
started = true;
bound.notify();
}
InputStream is = null;
Socket client = null;
try {
client = serverSocket.accept();
accepted = true;
for (int i = 0; i < persUses; i++) {
if (DEBUG) {
System.out.println("*** Using connection for "
+ (i + 1) + " time ***");
}
byte[] buff = new byte[1024];
is = client.getInputStream();
int num = 0; // number of read bytes
int bytik; // read byte value
boolean wasEOL = false;
// read header (until empty string)
while (((bytik = is.read()) > 0)) {
if (bytik == '\r') {
bytik = is.read();
}
if (wasEOL && (bytik == '\n')) {
break;
}
wasEOL = (bytik == '\n');
buff[num++] = (byte) bytik;
}
// int num = is.read(buff);
String message = new String(buff, 0, num, "UTF-8");
if (DEBUG) {
System.out
.println("---- Server got request: ----\n"
+ message
+ "-----------------------------");
}
// Act as Server (not Proxy) side
if (message.startsWith("POST")) {
// client connection sent some data
// if the data was not read with header
if (DEBUG) {
System.out
.println("---- Server read client's data: ----");
}
num = is.read(buff);
message = new String(buff, 0, num, "UTF-8");
if (DEBUG) {
System.out.println("'" + message + "'");
System.out
.println("------------------------------------");
}
// check the received data
assertEquals(clientPost, message);
}
client
.getOutputStream()
.write(
("HTTP/1.1 " + responseCode + " OK\n"
+ "Content-type: text/html\n"
+ "Content-length: "
+ response.length() + "\n\n" + response)
.getBytes("UTF-8"));
if (responseCode != OK_CODE) {
// wait while test case check closed connection
// and interrupt this thread
try {
while (!isInterrupted()) {
Thread.sleep(1000);
}
} catch (Exception ignore) {
}
}
}
} catch (SocketTimeoutException ignore) {
ignore.printStackTrace();
} finally {
if (is != null) {
is.close();
}
if (client != null) {
client.close();
}
serverSocket.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
static class MockProxyServer extends MockServer {
boolean acceptedAuthorizedRequest;
public MockProxyServer(String name) throws Exception {
super(name);
}
@Override
public void run() {
try {
Socket socket = serverSocket.accept();
socket.setSoTimeout(5000);
byte[] buff = new byte[1024];
int num = socket.getInputStream().read(buff);
socket
.getOutputStream()
.write(
("HTTP/1.0 407 Proxy authentication required\n"
+ "Proxy-authenticate: Basic realm=\"remotehost\"\n\n")
.getBytes("UTF-8"));
num = socket.getInputStream().read(buff);
if (num == -1) {
// this connection was closed, create new one:
socket = serverSocket.accept();
socket.setSoTimeout(5000);
num = socket.getInputStream().read(buff);
}
String request = new String(buff, 0, num, "UTF-8");
acceptedAuthorizedRequest = request.toLowerCase().indexOf(
"proxy-authorization:") > 0;
if (acceptedAuthorizedRequest) {
socket.getOutputStream().write(
("HTTP/1.1 200 OK\n\n").getBytes("UTF-8"));
}
} catch (IOException e) {
}
}
}
private int jettyPort = 0;
private String jettyURL;
public void setUp() throws Exception {
jettyPort = Support_Jetty.startDefaultHttpServer();
jettyURL = "http://localhost:" + jettyPort + "/servlet";
if (DEBUG) {
System.out.println("\n==============================");
System.out.println("===== Execution: " + getName());
System.out.println("==============================");
}
}
public static class ResponseServer {
private Server server = null;
private int port = -1;
public class MyRealmHandler extends DefaultHandler {
public void handle(String target, HttpServletRequest request,
HttpServletResponse response, int dispatch)
throws IOException, ServletException {
boolean auth = request.getHeader("Authorization") != null;
String resLoc = request.getPathInfo();
boolean noRealm = "/norealm".equals(resLoc);
Request base_request = (request instanceof Request) ? (Request) request
: HttpConnection.getCurrentConnection().getRequest();
base_request.setHandled(true);
response.setContentType("text/html");
response.addDateHeader("Date", System.currentTimeMillis());
if (noRealm) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().print("<h1>No WWW-Authenticate</h1>");
} else {
if (auth) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.addHeader("WWW-Authenticate",
"Basic realm=\"HelloWorld\"");
}
}
}
}
public void startServer(DefaultHandler handler) throws Exception {
server = new Server(0);
server.setHandler(handler);
server.start();
port = server.getConnectors()[0].getLocalPort();
}
public void stopServer() throws Exception {
if (server != null) {
server.stop();
server = null;
}
}
public int getPort() {
return port;
}
}
// Test response code which need authenticate
public void testGetResponseCode() throws Exception {
ResponseServer server = new ResponseServer();
HttpURLConnection conn = null;
try {
server.startServer(server.new MyRealmHandler());
int port = server.getPort();
try {
conn = (HttpURLConnection) new URL("http://localhost:" + port
+ "/norealm").openConnection();
assertEquals(401, conn.getResponseCode());
} finally {
if (conn != null) {
try {
conn.disconnect();
} catch (Exception e) {
}
}
}
try {
conn = (HttpURLConnection) new URL("http://localhost:" + port
+ "/realm").openConnection();
assertEquals(401, conn.getResponseCode());
assertEquals("Basic realm=\"HelloWorld\"", conn
.getHeaderField("WWW-Authenticate"));
} finally {
if (conn != null) {
try {
conn.disconnect();
} catch (Exception e) {
}
}
}
try {
Authenticator.setDefault(new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("test", "password"
.toCharArray());
}
});
server.startServer(server.new MyRealmHandler());
conn = (HttpURLConnection) new URL("http://localhost:" + port
+ "/realm").openConnection();
assertEquals(200, conn.getResponseCode());
assertNull(conn.getHeaderField("WWW-Authenticate"));
} finally {
if (conn != null) {
try {
conn.disconnect();
} catch (Exception e) {
}
}
}
} finally {
server.stopServer();
}
}
// ProxySelector implementation used in the test.
static class TestProxySelector extends ProxySelector {
// proxy port
private int proxy_port;
// server port
private int server_port;
// Creates proxy selector instance. Selector will return the proxy, only
// if the connection is made to localhost:server_port. Otherwise it will
// return NO_PROXY. Address of the returned proxy will be
// localhost:proxy_port.
public TestProxySelector(int server_port, int proxy_port) {
this.server_port = server_port;
this.proxy_port = proxy_port;
}
@Override
public java.util.List<Proxy> select(URI uri) {
Proxy proxy = Proxy.NO_PROXY;
if (("localhost".equals(uri.getHost()))
&& (server_port == uri.getPort())) {
proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
"localhost", proxy_port));
}
ArrayList<Proxy> result = new ArrayList<Proxy>();
result.add(proxy);
return result;
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
// do nothing
}
}
public void test_getHeaderFields() throws Exception {
URL url = new URL(jettyURL);
HttpURLConnection httpURLConnect = (HttpURLConnection) url
.openConnection();
assertEquals(200, httpURLConnect.getResponseCode());
assertEquals("OK", httpURLConnect.getResponseMessage());
Map headers = httpURLConnect.getHeaderFields();
// there should be at least 2 headers
assertTrue(headers.size() > 1);
List list = (List) headers.get("Content-Length");
if (list == null) {
list = (List) headers.get("content-length");
}
assertNotNull(list);
try {
headers.put("key", "value");
fail("should throw UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// Expected
}
try {
list.set(0, "value");
fail("should throw UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// Expected
}
try {
httpURLConnect.setRequestProperty("key", "value");
fail("should throw IlegalStateException");
} catch (IllegalStateException e) {
// Expected
}
}
// @tests the url with space
public void testConnectWithSpaceinURL() throws Exception {
String jettyURLwithSpace = "http://localhost:" + jettyPort
+ "/servlet with space";
HttpURLConnection httpURLConnect = (HttpURLConnection) new URL(
jettyURLwithSpace).openConnection();
httpURLConnect.setDoOutput(true);
httpURLConnect.connect();
assertEquals(200, httpURLConnect.getResponseCode());
assertEquals("OK", httpURLConnect.getResponseMessage());
}
// @tests the url with space
public void testConnectWithSpaceinURL1() throws Exception {
String jettyURLwithSpace = "http://localhost:" + jettyPort
+ "/servlet with space?arg1=value>1&arg2=%aval%1Aue&arg3=#";
HttpURLConnection httpURLConnect = (HttpURLConnection) new URL(
jettyURLwithSpace).openConnection();
httpURLConnect.setDoOutput(true);
httpURLConnect.connect();
assertEquals(200, httpURLConnect.getResponseCode());
assertEquals("OK", httpURLConnect.getResponseMessage());
}
public void testGetOutputStream() throws Exception {
// Regression for HARMONY-482
MockServer httpServer = new MockServer(
"ServerSocket for HttpURLConnectionTest");
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection c = (HttpURLConnection) new URL("http://127.0.0.1:"
+ httpServer.port()).openConnection();
c.setDoOutput(true);
// use new String("POST") instead of simple "POST" to obtain other
// object instances then those that are in HttpURLConnection classes
c.setRequestMethod(new String("POST"));
c.getOutputStream();
httpServer.join();
}
// Test whether getOutputStream can work after connection
public void test_getOutputStream_AfterConnect() throws Exception {
URL url = new URL(jettyURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.connect();
String str_get = connection.getRequestMethod();
assertTrue(str_get.equalsIgnoreCase("GET"));
// call to getOutputStream should implicitly set req. method to POST
connection.getOutputStream();
String str_post = connection.getRequestMethod();
assertTrue(str_post.equalsIgnoreCase("POST"));
}
// Test checks if the proxy specified in openConnection method will be used
// for connection to the server
public void testUsingProxy() throws Exception {
// Regression for HARMONY-570
MockServer server = new MockServer("server");
MockServer proxy = new MockServer("proxy");
URL url = new URL("http://localhost:" + server.port());
HttpURLConnection connection = (HttpURLConnection) url
.openConnection(new Proxy(Proxy.Type.HTTP,
new InetSocketAddress("localhost", proxy.port())));
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);
server.start();
synchronized (bound) {
if (!server.started)
bound.wait(5000);
}
proxy.start();
synchronized (bound) {
if (!proxy.started)
bound.wait(5000);
}
connection.connect();
// wait while server and proxy run
server.join();
proxy.join();
assertTrue("Connection does not use proxy", connection.usingProxy());
assertTrue("Proxy server was not used", proxy.accepted);
HttpURLConnection huc = (HttpURLConnection) url
.openConnection(Proxy.NO_PROXY);
assertFalse(huc.usingProxy());
}
public void testUsingProxy2() throws Exception {
try {
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", jettyPort + "");
URL url = new URL(jettyURL);
HttpURLConnection urlConnect = (HttpURLConnection) url
.openConnection();
urlConnect.getInputStream();
assertTrue(urlConnect.usingProxy());
// find a free port
ServerSocket serverSocket = new ServerSocket(0);
int port = serverSocket.getLocalPort();
serverSocket.close();
System.setProperty("http.proxyPort", port + "");
url = new URL(jettyURL);
urlConnect = (HttpURLConnection) url.openConnection();
urlConnect.getInputStream();
assertFalse(urlConnect.usingProxy());
url = new URL("http://localhost:" + port);
urlConnect = (HttpURLConnection) url.openConnection();
try {
urlConnect.getInputStream();
fail("should throw ConnectException");
} catch (ConnectException e) {
// Expected
}
assertFalse(urlConnect.usingProxy());
} finally {
System.setProperties(null);
}
}
// Test checks if the proxy provided by proxy selector will be used for
// connection to the server
public void testUsingProxySelector() throws Exception {
// Regression for HARMONY-570
MockServer server = new MockServer("server");
MockServer proxy = new MockServer("proxy");
URL url = new URL("http://localhost:" + server.port());
// keep default proxy selector
ProxySelector defPS = ProxySelector.getDefault();
// replace selector
ProxySelector.setDefault(new TestProxySelector(server.port(), proxy
.port()));
try {
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);
server.start();
synchronized (bound) {
if (!server.started)
bound.wait(5000);
}
proxy.start();
synchronized (bound) {
if (!proxy.started)
bound.wait(5000);
}
connection.connect();
// wait while server and proxy run
server.join();
proxy.join();
assertTrue("Connection does not use proxy", connection.usingProxy());
assertTrue("Proxy server was not used", proxy.accepted);
} finally {
// restore default proxy selector
ProxySelector.setDefault(defPS);
}
}
public void testProxyAuthorization() throws Exception {
// Set up test Authenticator
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user", "password"
.toCharArray());
}
});
try {
MockProxyServer proxy = new MockProxyServer("ProxyServer");
URL url = new URL("http://remotehost:55555/requested.data");
HttpURLConnection connection = (HttpURLConnection) url
.openConnection(new Proxy(Proxy.Type.HTTP,
new InetSocketAddress("localhost", proxy.port())));
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
proxy.start();
connection.connect();
assertEquals("unexpected response code", 200, connection
.getResponseCode());
proxy.join();
assertTrue("Connection did not send proxy authorization request",
proxy.acceptedAuthorizedRequest);
} finally {
// remove previously set authenticator
Authenticator.setDefault(null);
}
}
// Test that a connection is not closed if the client reads all the data but
// not closes input stream. read until -1.
public void testConnectionPersistence() throws Exception {
MockHTTPServer httpServer = new MockHTTPServer(
"HTTP Server for persistence checking", 2);
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
if (DEBUG) {
System.out.println("Actual connection class: " + c.getClass());
}
c.setDoInput(true);
c.setConnectTimeout(5000);
c.setReadTimeout(5000);
InputStream is = c.getInputStream();
byte[] buffer = new byte[128];
int totalBytes = 0;
int bytesRead = 0;
while ((bytesRead = is.read(buffer)) > 0) {
if (DEBUG) {
System.out.println("Client got response: '"
+ new String(buffer, 0, bytesRead, "UTF-8") + "'");
}
totalBytes += bytesRead;
}
HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
c2.setDoInput(true);
c2.setConnectTimeout(5000);
c2.setReadTimeout(5000);
is = c2.getInputStream();
buffer = new byte[128];
totalBytes = 0;
bytesRead = 0;
while ((bytesRead = is.read(buffer)) > 0) {
if (DEBUG) {
System.out.println("Client got response: '"
+ new String(buffer, 0, bytesRead, "UTF-8") + "'");
totalBytes += bytesRead;
}
}
}
// Test that a connection is not closed if the client reads all the data but
// not closes input stream. read() not receives -1.
public void testConnectionPersistence2() throws Exception {
MockHTTPServer httpServer = new MockHTTPServer(
"HTTP Server for persistence checking", 2);
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
if (DEBUG) {
System.out.println("Actual connection class: " + c.getClass());
}
c.setDoInput(true);
c.setConnectTimeout(5000);
c.setReadTimeout(5000);
InputStream is = c.getInputStream();
int bytes2Read = httpServer.response.length();
byte[] buffer = new byte[httpServer.response.length()];
while ((bytes2Read -= is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
c2.setDoInput(true);
c2.setConnectTimeout(5000);
c2.setReadTimeout(5000);
is = c2.getInputStream();
buffer = new byte[httpServer.response.length()];
bytes2Read = httpServer.response.length();
while ((bytes2Read -= is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
}
// Test that a connection is not closed if it firstly does POST, and then
// does GET requests.
public void testConnectionPersistence3() throws Exception {
MockHTTPServer httpServer = new MockHTTPServer(
"HTTP Server for persistence checking", 2);
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
if (DEBUG) {
System.out.println("Actual connection class: " + c.getClass());
}
c.setDoInput(true);
c.setDoOutput(true);
c.setConnectTimeout(5000);
c.setReadTimeout(5000);
c.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8"));
InputStream is = c.getInputStream();
int bytes2Read = httpServer.response.length();
byte[] buffer = new byte[httpServer.response.length()];
while ((bytes2Read -= is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
c2.setDoInput(true);
c2.setConnectTimeout(5000);
c2.setReadTimeout(5000);
is = c2.getInputStream();
buffer = new byte[httpServer.response.length()];
bytes2Read = httpServer.response.length();
while ((bytes2Read -= is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
}
// Test that a connection is not closed if it firstly does GET, and then
// does POST requests.
public void testConnectionPersistence4() throws Exception {
MockHTTPServer httpServer = new MockHTTPServer(
"HTTP Server for persistence checking", 2);
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
if (DEBUG) {
System.out.println("Actual connection class: " + c.getClass());
}
c.setDoInput(true);
c.setConnectTimeout(5000);
c.setReadTimeout(5000);
InputStream is = c.getInputStream();
int bytes2Read = httpServer.response.length();
byte[] buffer = new byte[httpServer.response.length()];
while ((bytes2Read = is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
c2.setDoOutput(true);
c2.setDoInput(true);
c2.setConnectTimeout(5000);
c2.setReadTimeout(5000);
c2.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8"));
is = c2.getInputStream();
buffer = new byte[httpServer.response.length()];
bytes2Read = httpServer.response.length();
while ((bytes2Read = is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
}
// Test that a connection is not closed if it does POST for 2 times.
public void testConnectionPersistence5() throws Exception {
MockHTTPServer httpServer = new MockHTTPServer(
"HTTP Server for persistence checking", 2);
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection c = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
if (DEBUG) {
System.out.println("Actual connection class: " + c.getClass());
}
c.setDoOutput(true);
c.setDoInput(true);
c.setConnectTimeout(5000);
c.setReadTimeout(5000);
c.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8"));
InputStream is = c.getInputStream();
int bytes2Read = httpServer.response.length();
byte[] buffer = new byte[httpServer.response.length()];
while ((bytes2Read = is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
HttpURLConnection c2 = (HttpURLConnection) new URL("http://localhost:"
+ httpServer.port()).openConnection();
c2.setDoOutput(true);
c2.setDoInput(true);
c2.setConnectTimeout(5000);
c2.setReadTimeout(5000);
c2.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8"));
is = c2.getInputStream();
buffer = new byte[httpServer.response.length()];
bytes2Read = httpServer.response.length();
while ((bytes2Read = is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
}
// Test that a connection made through proxy will be reused for connection
// establishing without proxy.
public void testProxiedConnectionPersistence() throws Exception {
MockHTTPServer httpServer = new MockHTTPServer(
"HTTP Server for persistence checking", 2);
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection c = (HttpURLConnection) new URL(
"http://some.host:1234").openConnection(new Proxy(
Proxy.Type.HTTP, new InetSocketAddress("localhost", httpServer
.port())));
if (DEBUG) {
System.out.println("Actual connection class: " + c.getClass());
}
c.setDoOutput(true);
c.setDoInput(true);
c.setConnectTimeout(5000);
c.setReadTimeout(5000);
c.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8"));
InputStream is = c.getInputStream();
int bytes2Read = httpServer.response.length();
byte[] buffer = new byte[httpServer.response.length()];
while ((bytes2Read = is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
HttpURLConnection c2 = (HttpURLConnection) new URL(
"http://some.host:1234").openConnection();
c2.setDoOutput(true);
c2.setDoInput(true);
c2.setConnectTimeout(5000);
c2.setReadTimeout(5000);
c2.getOutputStream().write(httpServer.clientPost.getBytes("UTF-8"));
is = c2.getInputStream();
buffer = new byte[httpServer.response.length()];
bytes2Read = httpServer.response.length();
while ((bytes2Read = is.read(buffer)) > 0) {
}
if (DEBUG) {
System.out.println("Client got response: '" + new String(buffer)
+ "'");
}
}
public void testSetRequestProperty() throws Exception {
MockHTTPServer httpServer = new MockHTTPServer(
"HTTP Server for User-Specified Request Property", 2);
httpServer.start();
synchronized (bound) {
if (!httpServer.started) {
bound.wait(5000);
}
}
HttpURLConnection urlConnection = (HttpURLConnection) new URL(
"http://localhost:" + httpServer.port()).openConnection();
assertEquals(0, urlConnection.getRequestProperties().size());
final String PROPERTY1 = "Accept";
final String PROPERTY2 = "Connection";
urlConnection.setRequestProperty(PROPERTY1, null);
urlConnection.setRequestProperty(PROPERTY1, null);
urlConnection.setRequestProperty(PROPERTY2, "keep-alive");
assertEquals(2, urlConnection.getRequestProperties().size());
assertNull(urlConnection.getRequestProperty(PROPERTY1));
assertEquals("keep-alive", urlConnection.getRequestProperty(PROPERTY2));
urlConnection.setRequestProperty(PROPERTY1, "/");
urlConnection.setRequestProperty(PROPERTY2, null);
assertEquals("/", urlConnection.getRequestProperty(PROPERTY1));
assertNull(urlConnection.getRequestProperty(PROPERTY2));
}
*/
}