// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.proxy; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.toolchain.test.TestTracker; import org.junit.After; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; public class ReverseProxyTest { @Rule public final TestTracker tracker = new TestTracker(); private Server server; private ServerConnector serverConnector; private Server proxy; private ServerConnector proxyConnector; private HttpClient client; private void startServer(HttpServlet servlet) throws Exception { server = new Server(); serverConnector = new ServerConnector(server); server.addConnector(serverConnector); ServletContextHandler appCtx = new ServletContextHandler(server, "/", true, false); ServletHolder appServletHolder = new ServletHolder(servlet); appCtx.addServlet(appServletHolder, "/*"); server.start(); } private void startProxy(Map<String, String> params) throws Exception { proxy = new Server(); HttpConfiguration configuration = new HttpConfiguration(); configuration.setSendDateHeader(false); configuration.setSendServerVersion(false); proxyConnector = new ServerConnector(proxy, new HttpConnectionFactory(configuration)); proxy.addConnector(proxyConnector); ServletContextHandler proxyContext = new ServletContextHandler(proxy, "/", true, false); ServletHolder proxyServletHolder = new ServletHolder(new AsyncMiddleManServlet() { @Override protected String rewriteTarget(HttpServletRequest clientRequest) { StringBuilder builder = new StringBuilder(); builder.append(clientRequest.getScheme()).append("://127.0.0.1:"); builder.append(serverConnector.getLocalPort()); builder.append(clientRequest.getRequestURI()); String query = clientRequest.getQueryString(); if (query != null) builder.append("?").append(query); return builder.toString(); } }); if (params != null) proxyServletHolder.setInitParameters(params); proxyContext.addServlet(proxyServletHolder, "/*"); proxy.start(); } private void startClient() throws Exception { client = new HttpClient(); client.start(); } @After public void dispose() throws Exception { client.stop(); proxy.stop(); server.stop(); } @Test public void testHostHeaderUpdatedWhenSentToServer() throws Exception { startServer(new HttpServlet() { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Assert.assertEquals("127.0.0.1", request.getServerName()); Assert.assertEquals(serverConnector.getLocalPort(), request.getServerPort()); } }); startProxy(null); startClient(); ContentResponse response = client.newRequest("localhost", proxyConnector.getLocalPort()).send(); Assert.assertEquals(200, response.getStatus()); } @Test public void testHostHeaderPreserved() throws Exception { startServer(new HttpServlet() { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Assert.assertEquals("localhost", request.getServerName()); Assert.assertEquals(proxyConnector.getLocalPort(), request.getServerPort()); } }); startProxy(new HashMap<String, String>() {{ put("preserveHost", "true"); }}); startClient(); ContentResponse response = client.newRequest("localhost", proxyConnector.getLocalPort()).send(); Assert.assertEquals(200, response.getStatus()); } }