Merge branch 'jetty-8' into release-8
This commit is contained in:
commit
5a0f8f8e4d
|
@ -36,7 +36,6 @@ import org.eclipse.jetty.http.HttpVersions;
|
||||||
import org.eclipse.jetty.io.AbstractConnection;
|
import org.eclipse.jetty.io.AbstractConnection;
|
||||||
import org.eclipse.jetty.io.Buffer;
|
import org.eclipse.jetty.io.Buffer;
|
||||||
import org.eclipse.jetty.io.Buffers;
|
import org.eclipse.jetty.io.Buffers;
|
||||||
import org.eclipse.jetty.io.ByteArrayBuffer;
|
|
||||||
import org.eclipse.jetty.io.Connection;
|
import org.eclipse.jetty.io.Connection;
|
||||||
import org.eclipse.jetty.io.EndPoint;
|
import org.eclipse.jetty.io.EndPoint;
|
||||||
import org.eclipse.jetty.io.EofException;
|
import org.eclipse.jetty.io.EofException;
|
||||||
|
@ -318,7 +317,11 @@ public abstract class AbstractHttpConnection extends AbstractConnection implemen
|
||||||
{
|
{
|
||||||
HttpExchange exchange = _exchange;
|
HttpExchange exchange = _exchange;
|
||||||
if (exchange!=null)
|
if (exchange!=null)
|
||||||
|
{
|
||||||
exchange.setStatus(HttpExchange.STATUS_PARSING_CONTENT);
|
exchange.setStatus(HttpExchange.STATUS_PARSING_CONTENT);
|
||||||
|
if (HttpMethods.CONNECT.equalsIgnoreCase(exchange.getMethod()))
|
||||||
|
_parser.setPersistent(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -350,8 +353,6 @@ public abstract class AbstractHttpConnection extends AbstractConnection implemen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -36,12 +36,12 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
{
|
{
|
||||||
return _proxySocket.getLocalPort();
|
return _proxySocket.getLocalPort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void startProxy() throws Exception
|
protected void startProxy() throws Exception
|
||||||
{
|
{
|
||||||
_proxySocket = new ServerSocket(0);
|
_proxySocket = new ServerSocket(0);
|
||||||
|
|
||||||
_proxyThread = new Thread()
|
_proxyThread = new Thread()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
|
@ -63,19 +63,28 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
};
|
};
|
||||||
_proxyThread.setDaemon(true);
|
_proxyThread.setDaemon(true);
|
||||||
_proxyThread.start();
|
_proxyThread.start();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void stopProxy() throws Exception
|
protected void stopProxy() throws Exception
|
||||||
{
|
{
|
||||||
_proxySocket.close();
|
if (_proxySocket != null)
|
||||||
_proxyThread.interrupt();
|
{
|
||||||
|
_proxySocket.close();
|
||||||
|
_proxyThread.interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testExternalProxy() throws Exception
|
||||||
|
{
|
||||||
|
// Do not execute this test, since it won't hit the fake proxy
|
||||||
}
|
}
|
||||||
|
|
||||||
static class FakeProxy extends Thread
|
static class FakeProxy extends Thread
|
||||||
{
|
{
|
||||||
Socket _socket;
|
Socket _socket;
|
||||||
|
|
||||||
public FakeProxy(Socket socket)
|
public FakeProxy(Socket socket)
|
||||||
{
|
{
|
||||||
_socket=socket;
|
_socket=socket;
|
||||||
|
@ -86,50 +95,50 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
|
|
||||||
Socket toserver=null;
|
Socket toserver=null;
|
||||||
final InputStream in;
|
final InputStream in;
|
||||||
final OutputStream out;
|
final OutputStream out;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
in = _socket.getInputStream();
|
in = _socket.getInputStream();
|
||||||
out = _socket.getOutputStream();
|
out = _socket.getOutputStream();
|
||||||
|
|
||||||
String address="";
|
String address="";
|
||||||
int state=0;
|
int state=0;
|
||||||
|
|
||||||
for (int b=in.read();b>=0;b=in.read())
|
for (int b=in.read();b>=0;b=in.read())
|
||||||
{
|
{
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (' '==b)
|
if (' '==b)
|
||||||
state=1;
|
state=1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
if (' '==b)
|
if (' '==b)
|
||||||
state=2;
|
state=2;
|
||||||
else
|
else
|
||||||
address+=(char)b;
|
address+=(char)b;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
if ('\r'==b)
|
if ('\r'==b)
|
||||||
state=3;
|
state=3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
if ('\n'==b)
|
if ('\n'==b)
|
||||||
state=4;
|
state=4;
|
||||||
else
|
else
|
||||||
state=2;
|
state=2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
if ('\r'==b)
|
if ('\r'==b)
|
||||||
state=5;
|
state=5;
|
||||||
else
|
else
|
||||||
state=2;
|
state=2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
if ('\n'==b)
|
if ('\n'==b)
|
||||||
{
|
{
|
||||||
|
@ -142,7 +151,7 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
out.write((
|
out.write((
|
||||||
"HTTP/1.1 200 OK\r\n"+
|
"HTTP/1.1 200 OK\r\n"+
|
||||||
"Server: fake\r\n"+
|
"Server: fake\r\n"+
|
||||||
// "Content-Length: 0\r\n"+
|
// "Content-Length: 0\r\n"+
|
||||||
"\r\n"
|
"\r\n"
|
||||||
).getBytes());
|
).getBytes());
|
||||||
}
|
}
|
||||||
|
@ -151,12 +160,12 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
out.write((
|
out.write((
|
||||||
"HTTP/1.1 503 Unavailable\r\n"+
|
"HTTP/1.1 503 Unavailable\r\n"+
|
||||||
"Server: fake\r\n"+
|
"Server: fake\r\n"+
|
||||||
"Content-Length: 0\r\n"+
|
"Content-Length: 0\r\n"+
|
||||||
"\r\n"
|
"\r\n"
|
||||||
).getBytes());
|
).getBytes());
|
||||||
}
|
}
|
||||||
out.flush();
|
out.flush();
|
||||||
|
|
||||||
if (toserver!=null)
|
if (toserver!=null)
|
||||||
{
|
{
|
||||||
final InputStream from = toserver.getInputStream();
|
final InputStream from = toserver.getInputStream();
|
||||||
|
@ -188,7 +197,7 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
copy.setDaemon(true);
|
copy.setDaemon(true);
|
||||||
copy.start();
|
copy.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state=2;
|
state=2;
|
||||||
|
@ -196,11 +205,11 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
toserver.getOutputStream().write((byte)b);
|
toserver.getOutputStream().write((byte)b);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
{
|
{
|
||||||
|
@ -221,8 +230,8 @@ public class ProxyFakeTunnelTest extends ProxyTunnellingTest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package org.eclipse.jetty.client;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InterruptedIOException;
|
import java.io.InterruptedIOException;
|
||||||
|
import java.net.Socket;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.TimeUnit;
|
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.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
import org.junit.Assume;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
@ -106,14 +108,20 @@ public class ProxyTunnellingTest
|
||||||
|
|
||||||
protected void stopServer() throws Exception
|
protected void stopServer() throws Exception
|
||||||
{
|
{
|
||||||
server.stop();
|
if (server != null)
|
||||||
server.join();
|
{
|
||||||
|
server.stop();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void stopProxy() throws Exception
|
protected void stopProxy() throws Exception
|
||||||
{
|
{
|
||||||
proxy.stop();
|
if (proxy != null)
|
||||||
proxy.join();
|
{
|
||||||
|
proxy.stop();
|
||||||
|
proxy.join();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -337,6 +345,51 @@ 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);
|
||||||
|
// Use a longer timeout, sometimes the proxy takes a while to answer
|
||||||
|
exchange.setTimeout(20000);
|
||||||
|
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
|
private static class ServerHandler extends AbstractHandler
|
||||||
{
|
{
|
||||||
public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
|
public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
|
||||||
|
|
Loading…
Reference in New Issue