Merge "370842: X-Forwarded-Host header is now set by request.getHeader(Host) which doesn't ommit the port information"

This commit is contained in:
Greg Wilkins 2012-03-06 18:06:09 -05:00 committed by Gerrit Code Review @ Eclipse.org
commit 60a77e425a
2 changed files with 50 additions and 19 deletions

View File

@ -597,12 +597,14 @@ public class ProxyServlet implements Servlet
{ {
exchange.addRequestHeader("X-Forwarded-For",request.getRemoteAddr()); exchange.addRequestHeader("X-Forwarded-For",request.getRemoteAddr());
exchange.addRequestHeader("X-Forwarded-Proto",request.getScheme()); exchange.addRequestHeader("X-Forwarded-Proto",request.getScheme());
exchange.addRequestHeader("X-Forwarded-Host",request.getServerName()); exchange.addRequestHeader("X-Forwarded-Host",request.getHeader("Host"));
exchange.addRequestHeader("X-Forwarded-Server",request.getLocalName()); exchange.addRequestHeader("X-Forwarded-Server",request.getLocalName());
} }
if (hasContent) if (hasContent)
{
exchange.setRequestContentSource(in); exchange.setRequestContentSource(in);
}
customizeExchange(exchange, request); customizeExchange(exchange, request);

View File

@ -4,6 +4,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -12,7 +13,6 @@ import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import junit.framework.Assert; import junit.framework.Assert;
import org.eclipse.jetty.client.ContentExchange; import org.eclipse.jetty.client.ContentExchange;
import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpClient;
@ -30,21 +30,24 @@ import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.junit.After; import org.junit.After;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
public class ProxyServletTest public class ProxyServletTest
{ {
private Server server; private Server _server;
private Connector connector; private Connector _connector;
private HttpClient client; private HttpClient _client;
public void init(HttpServlet servlet) throws Exception public void init(HttpServlet servlet) throws Exception
{ {
server = new Server(); _server = new Server();
connector = new SelectChannelConnector(); _connector = new SelectChannelConnector();
server.addConnector(connector); _server.addConnector(_connector);
HandlerCollection handlers = new HandlerCollection(); HandlerCollection handlers = new HandlerCollection();
server.setHandler(handlers); _server.setHandler(handlers);
ServletContextHandler proxyCtx = new ServletContextHandler(handlers, "/proxy", ServletContextHandler.NO_SESSIONS); ServletContextHandler proxyCtx = new ServletContextHandler(handlers, "/proxy", ServletContextHandler.NO_SESSIONS);
ServletHolder proxyServletHolder = new ServletHolder(new ProxyServlet() ServletHolder proxyServletHolder = new ServletHolder(new ProxyServlet()
@ -66,25 +69,49 @@ public class ProxyServletTest
handlers.addHandler(proxyCtx); handlers.addHandler(proxyCtx);
handlers.addHandler(appCtx); handlers.addHandler(appCtx);
server.start(); _server.start();
client = new HttpClient(); _client = new HttpClient();
client.start(); _client.start();
} }
@After @After
public void destroy() throws Exception public void destroy() throws Exception
{ {
if (client != null) if (_client != null)
client.stop(); _client.stop();
if (server != null) if (_server != null)
{ {
server.stop(); _server.stop();
server.join(); _server.join();
} }
} }
@Test
public void testXForwardedHostHeader() throws Exception
{
init(new HttpServlet()
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
PrintWriter writer = resp.getWriter();
writer.write(req.getHeader("X-Forwarded-Host"));
writer.flush();
}
});
String url = "http://localhost:" + _connector.getLocalPort() + "/proxy/test";
ContentExchange exchange = new ContentExchange();
exchange.setURL(url);
_client.send(exchange);
exchange.waitForDone();
assertThat("Response expected to contain content of X-Forwarded-Host Header from the request",exchange.getResponseContent(),equalTo("localhost:"
+ _connector.getLocalPort()));
}
@Test @Test
public void testBigDownloadWithSlowReader() throws Exception public void testBigDownloadWithSlowReader() throws Exception
@ -101,6 +128,8 @@ public class ProxyServletTest
init(new HttpServlet() init(new HttpServlet()
{ {
private static final long serialVersionUID = 1L;
@Override @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{ {
@ -114,7 +143,7 @@ public class ProxyServletTest
} }
}); });
String url = "http://localhost:" + connector.getLocalPort() + "/proxy" + "/test"; String url = "http://localhost:" + _connector.getLocalPort() + "/proxy/test";
ContentExchange exchange = new ContentExchange(true) ContentExchange exchange = new ContentExchange(true)
{ {
@Override @Override
@ -134,7 +163,7 @@ public class ProxyServletTest
}; };
exchange.setURL(url); exchange.setURL(url);
long start = System.nanoTime(); long start = System.nanoTime();
client.send(exchange); _client.send(exchange);
Assert.assertEquals(HttpExchange.STATUS_COMPLETED, exchange.waitForDone()); Assert.assertEquals(HttpExchange.STATUS_COMPLETED, exchange.waitForDone());
long elapsed = System.nanoTime() - start; long elapsed = System.nanoTime() - start;
Assert.assertEquals(HttpStatus.OK_200, exchange.getResponseStatus()); Assert.assertEquals(HttpStatus.OK_200, exchange.getResponseStatus());