diff options
author | Simone Bordet | 2015-06-05 10:34:47 +0000 |
---|---|---|
committer | Simone Bordet | 2015-06-05 10:34:47 +0000 |
commit | 87b1ae44f8eb09805e8b944aa8fc2967e4db4980 (patch) | |
tree | f38bfdd50a948cf2b73634a58e72169792788b71 | |
parent | a10142fdf562186d352ea2af0c3059f9c431db24 (diff) | |
parent | 9306477f5bdfad31a649f42206c6ecee46a6c3cd (diff) | |
download | org.eclipse.jetty.project-87b1ae44f8eb09805e8b944aa8fc2967e4db4980.tar.gz org.eclipse.jetty.project-87b1ae44f8eb09805e8b944aa8fc2967e4db4980.tar.xz org.eclipse.jetty.project-87b1ae44f8eb09805e8b944aa8fc2967e4db4980.zip |
Merged branch 'jetty-9.2.x' into 'master'.
6 files changed, 267 insertions, 164 deletions
diff --git a/VERSION.txt b/VERSION.txt index aa089c350a..d16a592d16 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1,5 +1,35 @@ jetty-9.3.0-SNAPSHOT +jetty-9.2.11.v20150529 - 29 May 2015 + + 461499 ConnectionPool may leak connections. + + 463579 Add support for 308 status code. + + 464292 Implement stream-based transformer for AsyncMiddleManServlet. + + 464438 ClassFileTransformer support in + org.eclipse.jetty.webapp.WebAppClassLoader broken + + 464740 DosFilter whiteList check improvement + + 464869 PathResource.addPath allows absolute resolution. + + 464989 AbstractSessionManager.removeEventListener() should remove + HttpSessionIdListener + + 465053 Prevent gzip buffer overflow on complete + + 465181 HttpParser parse full end chunk. + + 465202 Forked Mojo does not extract war overlays/dependencies + + 465359 Resource.newResource(String res, boolean useCache) does not use + useCache argument + + 465360 URLResource.addPath should use _useCaches setting to create new + Resource + + 465700 NullPointerException in ResourceHandler with welcome files + + 465734 DosFilter whitelist bit pattern fix + + 465747 Jetty is failing to process all HTTP OPTIONS requests. + + 466329 Fixed local only TestFilter + + 467276 NPE protection in SslContextFactory + + 467603 Response 401 from server hangs client. + + 467936 w Check HttpOutput aggregateSize is < bufferSize + + 468008 Scanner ignores directory length + + 468421 HttpClient#send fails with IllegalArgumentException on non-lowercase + schemes. + + 468714 SelectorManager updateKey race without submit + + 468747 XSS vulnerability in HttpSpiContextHandler + jetty-9.3.0.RC0 - 12 May 2015 + 414479 Add WebSocketPingPongListener for those that want PING/PONG payload data @@ -97,6 +127,16 @@ jetty-9.3.0.RC0 - 12 May 2015 + 467043 WebSocketClient close codes on protocol violation reported as policy violation +jetty-9.2.11.M0 - 25 March 2015 + + 454934 WebSocketClient / connectToServer can block indefinitely during + upgrade failure + + 459273 Redundant license notices + + 461499 ConnectionPool may leak connections. + + 461919 Use osgi-friendly serviceloader mechanism for WebSocketServletFactory + + 461941 JMX Remote host:port set from start properties + + 462546 ShutdownMonitor should bind to jetty.host + + 462616 Race between finishing a connect and timing it out. + jetty-9.3.0.M2 - 11 March 2015 + 383207 Use BundleFileLocatorHelperFactory to obtain BundleFileLocatorHelper + 420944 Hot Deployment of WAR when Context XML exists doesn't trigger @@ -239,92 +279,6 @@ jetty-9.3.0.M2 - 11 March 2015 + 461623 BufferUtil.writeTo does not update position consistently + 461643 HttpContent.advance() race. -jetty-9.3.0.M1 - 03 November 2014 - + 376365 "jetty.sh start" returns 0 on failure - + 396569 'bin/jetty.sh stop' reports 'OK' even when jetty was not running - + 396572 Starting jetty from cygwin is not working properly - + 437303 Serving of static filenames with "unwise" characters causes 404 error - + 440729 SSL requests often fail with EOFException or IllegalStateException. - + 440925 NPE when using relative paths for --start-log-file - + 442419 CrossOriginFilter javadoc says "exposeHeaders", but should be - "exposedHeaders" - + 442942 Content sent with status 204 (No Content) - + 443529 CrossOriginFilter does not accept wildcard for allowedHeaders - + 443530 CrossOriginFilter does not set the Vary header - + 443550 improved FileResource encoded alias checking - + 444031 Ensure exceptions do not reduce threadpool below minimum - + 444595 nosql/mongodb - Cleanup process/Refreshing does not respect encoding - of attribute keys - + 444676 Goal jetty:deploy-war produces errors with version 9.2.3 - + 444722 Fixed order of setReuseAddress call - + 444896 Overriding of web-default servlet mapping in web.xml not working with - quickstart - + 445157 First redeployed servlet leaks WebAppContext - + 445167 Allow configuration of dispatch after select. - + 445239 Rename weld.mod to cdi.mod to be consistent with past module namings - + 445258 STOP.WAIT is not really respected - + 445374 Reevaluate org.eclipse.jetty.websocket.jsr356 enablement concepts - + 445495 Improve Exception message when no jndi resource to bind for a name in - web.xml - + 445542 Add SecuredRedirectHandler for embedded jetty use to redirect to - secure port/scheme - + 445821 Error 400 should be logged with RequestLog - + 445823 Moved RequestLog calling to HttpChannel - + 445830 Support setting environment variables on forked jetty with - jetty:run-forked - + 445979 jetty.sh fails to start when start-stop-daemon does not exist and the - user is not root - + 446033 org.eclipse.jetty.websocket.server.WebSocketServerFactory not - available in OSGi - + 446063 ALPN Fail SSL Handshake if no supported Application Protocols. - + 446107 NullPointerException in ProxyServlet when extended by Servlet without - a package - + 446425 Oracle Sql error on JettySessions table when this table do not exist - already - + 446506 getAsyncContext ISE before startAsync on async dispatches - + 446559 Avoid spin consuming extra data - + 446563 Null HttpChannel.getCurrentHttpChannel() in - ServletHandler.doFilter(). - + 446564 Refactored RequestLog Mechanism - + 446672 NPN Specification issue in the case no protocols are selected. - + 446923 SharedBlockingCallback does not handle connector max idle time of - Long.MAX_VALUE; BlockerTimeoutException not serializable - + 446944 ServletTester and HttpTester should be in - <classifier>tests</classifier> - + 447216 putAll Properties in XmlConfiguration - + 447381 Disable SSLv3 by default. - + 447472 test harness for slow large writes - + 447515 Remove GzipFilter - + 447627 MultiPart file always created when "filename" set in - Content-Disposition - + 447629 getPart()/getParts() fails on Multipart request if getParameter is - called in a filter first - + 447746 HttpClient is always going to send User-Agent header even though I do - not want it to. - + 447979 Refactor to make MetaData responsible for progressively ordering - web-inf jars - + 448156 Fixed INACTIVE race in IteratingCallback - + 448225 Removed unnecessary synchronize on initParser - + 448675 Impossible to set own Threadpool when using jetty-maven-plugin - + 448841 Clarified selectors==0 javadoc 448840 Clarified ServerConnector - javadoc 448839 Fixed javadoc typo in ServerConnector - + 449001 Remove start.d directory from JETTY_HOME - + 449003 WARNING: Cannot enable requested module [protonego-impl]: not a valid - module name - + 449038 WebSocketUpgradeFilter must support async. - + 449175 Removed extra space in NCSA log - + 449372 Make jvmArgs of jetty:run-forked configurable from command line - -jetty-9.2.11.M0 - 25 March 2015 - + 454934 WebSocketClient / connectToServer can block indefinitely during - upgrade failure - + 459273 Redundant license notices - + 461499 ConnectionPool may leak connections. - + 461919 Use osgi-friendly serviceloader mechanism for WebSocketServletFactory - + 461941 JMX Remote host:port set from start properties - + 462546 ShutdownMonitor should bind to jetty.host - + 462616 Race between finishing a connect and timing it out. - jetty-9.2.10.v20150310 - 10 March 2015 + 445518 Provide different error callbacks to ProxyServlet. + 456521 ShutdownHandler should shut down more gracefully @@ -442,6 +396,82 @@ jetty-9.2.5.v20141112 - 12 November 2014 + 450873 Disable tests that downcaste wrapped GzipFilterResponses + 450894 jetty.sh does not delete JETTY_STATE at start +jetty-9.3.0.M1 - 03 November 2014 + + 376365 "jetty.sh start" returns 0 on failure + + 396569 'bin/jetty.sh stop' reports 'OK' even when jetty was not running + + 396572 Starting jetty from cygwin is not working properly + + 437303 Serving of static filenames with "unwise" characters causes 404 error + + 440729 SSL requests often fail with EOFException or IllegalStateException. + + 440925 NPE when using relative paths for --start-log-file + + 442419 CrossOriginFilter javadoc says "exposeHeaders", but should be + "exposedHeaders" + + 442942 Content sent with status 204 (No Content) + + 443529 CrossOriginFilter does not accept wildcard for allowedHeaders + + 443530 CrossOriginFilter does not set the Vary header + + 443550 improved FileResource encoded alias checking + + 444031 Ensure exceptions do not reduce threadpool below minimum + + 444595 nosql/mongodb - Cleanup process/Refreshing does not respect encoding + of attribute keys + + 444676 Goal jetty:deploy-war produces errors with version 9.2.3 + + 444722 Fixed order of setReuseAddress call + + 444896 Overriding of web-default servlet mapping in web.xml not working with + quickstart + + 445157 First redeployed servlet leaks WebAppContext + + 445167 Allow configuration of dispatch after select. + + 445239 Rename weld.mod to cdi.mod to be consistent with past module namings + + 445258 STOP.WAIT is not really respected + + 445374 Reevaluate org.eclipse.jetty.websocket.jsr356 enablement concepts + + 445495 Improve Exception message when no jndi resource to bind for a name in + web.xml + + 445542 Add SecuredRedirectHandler for embedded jetty use to redirect to + secure port/scheme + + 445821 Error 400 should be logged with RequestLog + + 445823 Moved RequestLog calling to HttpChannel + + 445830 Support setting environment variables on forked jetty with + jetty:run-forked + + 445979 jetty.sh fails to start when start-stop-daemon does not exist and the + user is not root + + 446033 org.eclipse.jetty.websocket.server.WebSocketServerFactory not + available in OSGi + + 446063 ALPN Fail SSL Handshake if no supported Application Protocols. + + 446107 NullPointerException in ProxyServlet when extended by Servlet without + a package + + 446425 Oracle Sql error on JettySessions table when this table do not exist + already + + 446506 getAsyncContext ISE before startAsync on async dispatches + + 446559 Avoid spin consuming extra data + + 446563 Null HttpChannel.getCurrentHttpChannel() in + ServletHandler.doFilter(). + + 446564 Refactored RequestLog Mechanism + + 446672 NPN Specification issue in the case no protocols are selected. + + 446923 SharedBlockingCallback does not handle connector max idle time of + Long.MAX_VALUE; BlockerTimeoutException not serializable + + 446944 ServletTester and HttpTester should be in + <classifier>tests</classifier> + + 447216 putAll Properties in XmlConfiguration + + 447381 Disable SSLv3 by default. + + 447472 test harness for slow large writes + + 447515 Remove GzipFilter + + 447627 MultiPart file always created when "filename" set in + Content-Disposition + + 447629 getPart()/getParts() fails on Multipart request if getParameter is + called in a filter first + + 447746 HttpClient is always going to send User-Agent header even though I do + not want it to. + + 447979 Refactor to make MetaData responsible for progressively ordering + web-inf jars + + 448156 Fixed INACTIVE race in IteratingCallback + + 448225 Removed unnecessary synchronize on initParser + + 448675 Impossible to set own Threadpool when using jetty-maven-plugin + + 448841 Clarified selectors==0 javadoc 448840 Clarified ServerConnector + javadoc 448839 Fixed javadoc typo in ServerConnector + + 449001 Remove start.d directory from JETTY_HOME + + 449003 WARNING: Cannot enable requested module [protonego-impl]: not a valid + module name + + 449038 WebSocketUpgradeFilter must support async. + + 449175 Removed extra space in NCSA log + + 449372 Make jvmArgs of jetty:run-forked configurable from command line + jetty-9.2.4.v20141103 - 03 November 2014 + 376365 "jetty.sh start" returns 0 on failure + 396569 'bin/jetty.sh stop' reports 'OK' even when jetty was not running @@ -932,7 +962,7 @@ jetty-9.1.2.v20140210 - 10 February 2014 + 423421 remove org.slf4j and org.ow2.asm from jetty-all artifact + 424171 Old javax.activation jar interferes with email sending + 424562 JDBCSessionManager.setNodeIdInSessionId(true) does not work - + 425275 + + 425275 org.eclipse.jetty.osgi.annotations.AnnotationConfiguration.BundleParserTask.getStatistic() returns null when debug is enabled. + 425638 Fixed monitor module/xml typos @@ -1235,7 +1265,7 @@ jetty-9.0.6.v20130930 - 30 September 2013 in the value + 415192 <jsp-file> maps to JspPropertyGroupServlet instead of JspServlet + 415194 Deployer gives management of context to context collection - + 415302 + + 415302 + 415330 Avoid multiple callbacks at EOF + 415401 Add initalizeDefaults call to SpringConfigurationProcessor + 415548 migrate ProxyHTTPToSPDYTest to use HttpClient to avoid intermittent @@ -1375,7 +1405,7 @@ jetty-9.1.0.M0 - 16 September 2013 + 415131 Avoid autoboxing on debug + 415192 <jsp-file> maps to JspPropertyGroupServlet instead of JspServlet + 415194 Deployer gives management of context to context collection - + 415302 + + 415302 + 415314 Jetty should not commit response on output if < Response.setBufferSize() bytes are written + 415330 Avoid multiple callbacks at EOF diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java index 381ccca5f9..afce6d9692 100644 --- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java +++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java @@ -18,6 +18,28 @@ package org.eclipse.jetty.proxy; +import java.io.IOException; +import java.net.InetAddress; +import java.net.URI; +import java.net.UnknownHostException; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeoutException; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.UnavailableException; +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.Request; import org.eclipse.jetty.client.api.Response; @@ -29,21 +51,32 @@ import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.thread.QueuedThreadPool; -import javax.servlet.AsyncContext; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.UnavailableException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.net.InetAddress; -import java.net.URI; -import java.net.UnknownHostException; -import java.util.*; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeoutException; - +/** + * <p>Abstract base class for proxy servlets.</p> + * <p>Forwards requests to another server either as a standard web reverse + * proxy or as a transparent reverse proxy (as defined by RFC 7230).</p> + * <p>To facilitate JMX monitoring, the {@link HttpClient} instance is set + * as ServletContext attribute, prefixed with this servlet's name and + * exposed by the mechanism provided by + * {@link ServletContext#setAttribute(String, Object)}.</p> + * <p>The following init parameters may be used to configure the servlet:</p> + * <ul> + * <li>preserveHost - the host header specified by the client is forwarded to the server</li> + * <li>hostHeader - forces the host header to a particular value</li> + * <li>viaHost - the name to use in the Via header: Via: http/1.1 <viaHost></li> + * <li>whiteList - comma-separated list of allowed proxy hosts</li> + * <li>blackList - comma-separated list of forbidden proxy hosts</li> + * </ul> + * <p>In addition, see {@link #createHttpClient()} for init parameters + * used to configure the {@link HttpClient} instance.</p> + * <p>NOTE: By default the Host header sent to the server by this proxy + * servlet is the server's host name. However, this breaks redirects. + * Set {@code preserveHost} to {@code true} to make redirects working, + * although this may break server's virtual host selection.</p> + * <p>The default behavior of not preserving the Host header mimics + * the default behavior of Apache httpd and Nginx, which both have + * a way to be configured to preserve the Host header.</p> + */ public abstract class AbstractProxyServlet extends HttpServlet { protected static final Set<String> HOP_HEADERS; @@ -65,6 +98,7 @@ public abstract class AbstractProxyServlet extends HttpServlet private final Set<String> _whiteList = new HashSet<>(); private final Set<String> _blackList = new HashSet<>(); protected Logger _log; + private boolean _preserveHost; private String _hostHeader; private String _viaHost; private HttpClient _client; @@ -77,6 +111,8 @@ public abstract class AbstractProxyServlet extends HttpServlet ServletConfig config = getServletConfig(); + _preserveHost = Boolean.parseBoolean(config.getInitParameter("preserveHost")); + _hostHeader = config.getInitParameter("hostHeader"); _viaHost = config.getInitParameter("viaHost"); @@ -175,9 +211,8 @@ public abstract class AbstractProxyServlet extends HttpServlet } /** - * Creates a {@link HttpClient} instance, configured with init parameters of this servlet. - * <p> - * The init parameters used to configure the {@link HttpClient} instance are: + * <p>Creates a {@link HttpClient} instance, configured with init parameters of this servlet.</p> + * <p>The init parameters used to configure the {@link HttpClient} instance are:</p> * <table> * <caption>Init Parameters</caption> * <thead> @@ -403,7 +438,7 @@ public abstract class AbstractProxyServlet extends HttpServlet String headerName = headerNames.nextElement(); String lowerHeaderName = headerName.toLowerCase(Locale.ENGLISH); - if (HttpHeader.HOST.is(headerName)) + if (HttpHeader.HOST.is(headerName) && !_preserveHost) continue; // Remove hop-by-hop headers. diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java index 90605254fc..1b8c3b2b19 100644 --- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java +++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java @@ -18,6 +18,27 @@ package org.eclipse.jetty.proxy; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.TimeUnit; +import java.util.zip.GZIPOutputStream; + +import javax.servlet.AsyncContext; +import javax.servlet.ReadListener; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.eclipse.jetty.client.ContentDecoder; import org.eclipse.jetty.client.GZIPContentDecoder; import org.eclipse.jetty.client.api.ContentProvider; @@ -34,21 +55,15 @@ import org.eclipse.jetty.util.CountingCallback; import org.eclipse.jetty.util.IteratingCallback; import org.eclipse.jetty.util.component.Destroyable; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; -import java.util.concurrent.TimeUnit; -import java.util.zip.GZIPOutputStream; - -@SuppressWarnings("serial") +/** + * <p>Servlet 3.1 asynchronous proxy servlet with capability + * to intercept and modify request/response content.</p> + * <p>Both the request processing and the I/O are asynchronous.</p> + * + * @see ProxyServlet + * @see AsyncProxyServlet + * @see ConnectHandler + */ public class AsyncMiddleManServlet extends AbstractProxyServlet { private static final String CLIENT_TRANSFORMER = AsyncMiddleManServlet.class.getName() + ".clientTransformer"; @@ -190,6 +205,8 @@ public class AsyncMiddleManServlet extends AbstractProxyServlet /** * <p>Convenience extension of {@link AsyncMiddleManServlet} that offers transparent proxy functionalities.</p> + * + * @see TransparentDelegate */ public static class Transparent extends ProxyServlet { @@ -272,7 +289,7 @@ public class AsyncMiddleManServlet extends AbstractProxyServlet if (_log.isDebugEnabled()) _log.debug("{} asynchronous read {} bytes on {}", getRequestId(clientRequest), read, input); - if (read<0) + if (read < 0) return Action.SUCCEEDED; if (contentLength > 0 && read > 0) diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java index 3e003d304f..0d6f538fd0 100644 --- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java +++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java @@ -21,6 +21,7 @@ package org.eclipse.jetty.proxy; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritePendingException; + import javax.servlet.ReadListener; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -38,9 +39,12 @@ import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.IteratingCallback; /** - * <p>Proxy servlet based on Servlet 3.1 async I/O.</p> + * <p>Servlet 3.1 asynchronous proxy servlet.</p> + * <p>Both the request processing and the I/O are asynchronous.</p> * + * @see ProxyServlet * @see AsyncMiddleManServlet + * @see ConnectHandler */ public class AsyncProxyServlet extends ProxyServlet { @@ -101,6 +105,8 @@ public class AsyncProxyServlet extends ProxyServlet /** * <p>Convenience extension of {@link AsyncProxyServlet} that offers transparent proxy functionalities.</p> + * + * @see TransparentDelegate */ public static class Transparent extends AsyncProxyServlet { diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java index 15be874964..097f71f88a 100644 --- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java +++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java @@ -22,14 +22,13 @@ import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.concurrent.TimeUnit; + import javax.servlet.AsyncContext; import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.api.ContentProvider; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; @@ -39,22 +38,11 @@ import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.util.Callback; /** - * <p>Proxy servlet based on Servlet 3.0 asynchronous request/response.</p> - * <p>Forwards requests to another server either as a standard web reverse proxy - * (as defined by RFC2616) or as a transparent reverse proxy.</p> - * <p>To facilitate JMX monitoring, the {@link HttpClient} instance is set as - * context attribute, prefixed with the servlet's name and exposed by the - * mechanism provided by {@link ServletContext#setAttribute(String, Object)}.</p> - * <p>The following init parameters may be used to configure the servlet:</p> - * <ul> - * <li>hostHeader - forces the host header to a particular value</li> - * <li>viaHost - the name to use in the Via header: Via: http/1.1 <viaHost></li> - * <li>whiteList - comma-separated list of allowed proxy hosts</li> - * <li>blackList - comma-separated list of forbidden proxy hosts</li> - * </ul> - * <p>In addition, see {@link #createHttpClient()} for init parameters used to configure - * the {@link HttpClient} instance.</p> + * <p>Servlet 3.0 asynchronous proxy servlet.</p> + * <p>The request processing is asynchronous, but the I/O is blocking.</p> * + * @see AsyncProxyServlet + * @see AsyncMiddleManServlet * @see ConnectHandler */ public class ProxyServlet extends AbstractProxyServlet @@ -127,6 +115,8 @@ public class ProxyServlet extends AbstractProxyServlet /** * <p>Convenience extension of {@link ProxyServlet} that offers transparent proxy functionalities.</p> + * + * @see TransparentDelegate */ public static class Transparent extends ProxyServlet { diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ReverseProxyTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ReverseProxyTest.java index 72b02eee33..0c4261cab8 100644 --- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ReverseProxyTest.java +++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ReverseProxyTest.java @@ -19,6 +19,8 @@ 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; @@ -43,13 +45,27 @@ public class ReverseProxyTest { @Rule public final TestTracker tracker = new TestTracker(); - private HttpClient client; - private Server proxy; - private ServerConnector proxyConnector; private Server server; private ServerConnector serverConnector; + private Server proxy; + private ServerConnector proxyConnector; + private HttpClient client; - private void startProxy() throws Exception + 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(); @@ -66,7 +82,7 @@ public class ReverseProxyTest protected String rewriteTarget(HttpServletRequest clientRequest) { StringBuilder builder = new StringBuilder(); - builder.append(clientRequest.getScheme()).append("://localhost:"); + builder.append(clientRequest.getScheme()).append("://127.0.0.1:"); builder.append(serverConnector.getLocalPort()); builder.append(clientRequest.getRequestURI()); String query = clientRequest.getQueryString(); @@ -75,25 +91,14 @@ public class ReverseProxyTest return builder.toString(); } }); + if (params != null) + proxyServletHolder.setInitParameters(params); + proxyContext.addServlet(proxyServletHolder, "/*"); proxy.start(); } - 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 startClient() throws Exception { client = new HttpClient(); @@ -109,17 +114,37 @@ public class ReverseProxyTest } @Test - public void testClientHostHeaderUpdatedWhenSentToServer() throws Exception + 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(request.getServerPort(), serverConnector.getLocalPort()); + Assert.assertEquals("localhost", request.getServerName()); + Assert.assertEquals(proxyConnector.getLocalPort(), request.getServerPort()); } }); - startProxy(); + startProxy(new HashMap<String, String>() {{ put("preserveHost", "true"); }}); startClient(); ContentResponse response = client.newRequest("localhost", proxyConnector.getLocalPort()).send(); |