409028 - Jetty HttpClient does not work with proxy CONNECT method.
The problem was due to the fact that the server replied with HTTP/1.0 to the CONNECT request; because of this, the parser was set as non persistent, and the tunnel was immediately closed. Now we are setting the parser as persistent if the method is a CONNECT, no matter what HTTP version the server specifies.
This commit is contained in:
parent
2f08ba2948
commit
3b18490ead
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue