Merge branch 'jetty-8' into release-8

This commit is contained in:
Jesse McConnell 2013-07-25 11:01:58 -05:00
commit 5a0f8f8e4d
3 changed files with 95 additions and 32 deletions

View File

@ -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

View File

@ -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
} }
} }
} }
} }
} }

View File

@ -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