diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpConnection.java b/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpConnection.java index 12560b3d1b2..916f082e0ff 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpConnection.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpConnection.java @@ -36,7 +36,6 @@ import org.eclipse.jetty.http.HttpVersions; import org.eclipse.jetty.io.AbstractConnection; import org.eclipse.jetty.io.Buffer; import org.eclipse.jetty.io.Buffers; -import org.eclipse.jetty.io.ByteArrayBuffer; import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.EofException; @@ -318,7 +317,11 @@ public abstract class AbstractHttpConnection extends AbstractConnection implemen { HttpExchange exchange = _exchange; if (exchange!=null) + { exchange.setStatus(HttpExchange.STATUS_PARSING_CONTENT); + if (HttpMethods.CONNECT.equalsIgnoreCase(exchange.getMethod())) + _parser.setPersistent(true); + } } @Override @@ -350,8 +353,6 @@ public abstract class AbstractHttpConnection extends AbstractConnection implemen } } } - - } @Override diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ProxyTunnellingTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ProxyTunnellingTest.java index 550c5418ea0..c887d1fb2fa 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/ProxyTunnellingTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ProxyTunnellingTest.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.client; import java.io.IOException; import java.io.InterruptedIOException; +import java.net.Socket; import java.net.URLEncoder; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -46,6 +47,7 @@ import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.junit.After; import org.junit.Assert; +import org.junit.Assume; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -106,14 +108,20 @@ public class ProxyTunnellingTest protected void stopServer() throws Exception { - server.stop(); - server.join(); + if (server != null) + { + server.stop(); + server.join(); + } } protected void stopProxy() throws Exception { - proxy.stop(); - proxy.join(); + if (proxy != null) + { + proxy.stop(); + proxy.join(); + } } @Test @@ -337,6 +345,50 @@ public class ProxyTunnellingTest } } + @Test + public void testExternalProxy() throws Exception + { + // Free proxy server obtained from http://hidemyass.com/proxy-list/ + String proxyHost = "81.208.25.53"; + int proxyPort = 3128; + try + { + new Socket(proxyHost, proxyPort).close(); + } + catch (IOException x) + { + Assume.assumeNoException(x); + } + + // Start the server to start the SslContextFactory + startSSLServer(new AbstractHandler() + { + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + throw new ServletException(); + } + }); + + HttpClient httpClient = new HttpClient(); + httpClient.setProxy(new Address(proxyHost, proxyPort)); + httpClient.registerListener(RedirectListener.class.getName()); + httpClient.start(); + + try + { + ContentExchange exchange = new ContentExchange(true); + exchange.setTimeout(5000); + exchange.setURL("https://www.google.com"); + httpClient.send(exchange); + assertEquals(HttpExchange.STATUS_COMPLETED, exchange.waitForDone()); + assertEquals(200, exchange.getResponseStatus()); + } + finally + { + httpClient.stop(); + } + } + private static class ServerHandler extends AbstractHandler { public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException