Merged branch 'master' into 'jetty-9.1'.
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java
index 6fa8275..9e939fe 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java
@@ -129,7 +129,8 @@
         if (exchange == null)
             return false;
 
-        parser.setHeadResponse(HttpMethod.HEAD.is(exchange.getRequest().getMethod()));
+        String method = exchange.getRequest().getMethod();
+        parser.setHeadResponse(HttpMethod.HEAD.is(method) || HttpMethod.CONNECT.is(method));
         exchange.getResponse().version(version).status(status).reason(reason);
 
         responseBegin(exchange);
@@ -177,7 +178,7 @@
             return false;
 
         responseSuccess(exchange);
-        return false;
+        return true;
     }
 
     @Override
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
index 9db2204..22f51ce 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.net.ConnectException;
+import java.net.Socket;
 import java.net.URLEncoder;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
@@ -55,6 +56,7 @@
 import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -116,14 +118,20 @@
 
     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
@@ -364,6 +372,42 @@
         }
     }
 
+    @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);
+        }
+
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.start();
+
+        HttpClient httpClient = new HttpClient(sslContextFactory);
+        httpClient.setProxyConfiguration(new ProxyConfiguration(proxyHost, proxyPort));
+        httpClient.start();
+
+        try
+        {
+            ContentResponse response = httpClient.newRequest("https://www.google.com")
+                    // Use a longer timeout, sometimes the proxy takes a while to answer
+                    .timeout(20, TimeUnit.SECONDS)
+                    .send();
+            assertEquals(HttpStatus.OK_200, response.getStatus());
+        }
+        finally
+        {
+            httpClient.stop();
+        }
+    }
+
     private static class ServerHandler extends AbstractHandler
     {
         public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException