diff options
author | Simone Bordet | 2014-09-23 16:48:16 +0000 |
---|---|---|
committer | Simone Bordet | 2014-09-23 16:48:16 +0000 |
commit | 1e33c325134b4a512573bd80c915207608847232 (patch) | |
tree | 44c05f57a7716f55ed7696b747ca495988a10615 | |
parent | 2bdc402609e85360feae0128c39b84628b7bc3a1 (diff) | |
parent | dd8be028bb5840d9dee064b04c10cbb917efb1cb (diff) | |
download | org.eclipse.jetty.project-1e33c325134b4a512573bd80c915207608847232.tar.gz org.eclipse.jetty.project-1e33c325134b4a512573bd80c915207608847232.tar.xz org.eclipse.jetty.project-1e33c325134b4a512573bd80c915207608847232.zip |
Merged branch 'jetty-9.2.x' into 'master'.
3 files changed, 69 insertions, 6 deletions
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 ed00af2564..6db114aad2 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 @@ -85,14 +85,14 @@ public class ProxyServlet extends HttpServlet private static final Set<String> HOP_HEADERS = new HashSet<>(); static { - HOP_HEADERS.add("proxy-connection"); HOP_HEADERS.add("connection"); HOP_HEADERS.add("keep-alive"); + HOP_HEADERS.add("proxy-authorization"); + HOP_HEADERS.add("proxy-authenticate"); + HOP_HEADERS.add("proxy-connection"); HOP_HEADERS.add("transfer-encoding"); HOP_HEADERS.add("te"); HOP_HEADERS.add("trailer"); - HOP_HEADERS.add("proxy-authorization"); - HOP_HEADERS.add("proxy-authenticate"); HOP_HEADERS.add("upgrade"); } @@ -406,7 +406,25 @@ public class ProxyServlet extends HttpServlet .method(request.getMethod()) .version(HttpVersion.fromString(request.getProtocol())); - // Copy headers + // Copy headers. + + // Any header listed by the Connection header must be removed: + // http://tools.ietf.org/html/rfc7230#section-6.1. + Set<String> hopHeaders = null; + Enumeration<String> connectionHeaders = request.getHeaders(HttpHeader.CONNECTION.asString()); + while (connectionHeaders.hasMoreElements()) + { + String value = connectionHeaders.nextElement(); + String[] values = value.split(","); + for (String name : values) + { + name = name.trim().toLowerCase(Locale.ENGLISH); + if (hopHeaders == null) + hopHeaders = new HashSet<>(); + hopHeaders.add(name); + } + } + boolean hasContent = request.getContentLength() > 0 || request.getContentType() != null; for (Enumeration<String> headerNames = request.getHeaderNames(); headerNames.hasMoreElements();) { @@ -419,9 +437,11 @@ public class ProxyServlet extends HttpServlet if (_hostHeader != null && HttpHeader.HOST.is(headerName)) continue; - // Remove hop-by-hop headers + // Remove hop-by-hop headers. if (HOP_HEADERS.contains(lowerHeaderName)) continue; + if (hopHeaders != null && hopHeaders.contains(lowerHeaderName)) + continue; for (Enumeration<String> headerValues = request.getHeaders(headerName); headerValues.hasMoreElements();) { diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java index d2819d971f..cf349c9e92 100644 --- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java +++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java @@ -32,8 +32,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.Arrays; +import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Random; @@ -69,6 +71,7 @@ import org.eclipse.jetty.client.http.HttpDestinationOverHTTP; import org.eclipse.jetty.client.util.BufferingResponseListener; import org.eclipse.jetty.client.util.BytesContentProvider; import org.eclipse.jetty.client.util.InputStreamResponseListener; +import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; @@ -1144,5 +1147,40 @@ public class ProxyServletTest Assert.assertEquals(headerValue, response.getHeaders().get(headerName)); } + @Test + public void testHeadersListedByConnectionHeaderAreRemoved() throws Exception + { + prepareProxy(); + + final Map<String, String> hopHeaders = new LinkedHashMap<>(); + hopHeaders.put(HttpHeader.TE.asString(), "gzip"); + hopHeaders.put(HttpHeader.CONNECTION.asString(), "Keep-Alive, Foo, Bar"); + hopHeaders.put("Foo", "abc"); + hopHeaders.put("Foo", "def"); + hopHeaders.put(HttpHeader.KEEP_ALIVE.asString(), "timeout=30"); + + prepareServer(new HttpServlet() + { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + List<String> names = Collections.list(request.getHeaderNames()); + for (String name : names) + { + if (hopHeaders.containsKey(name)) + throw new IOException("Hop header must not be proxied: " + name); + } + } + }); + + HttpClient client = prepareClient(); + Request request = client.newRequest("localhost", serverConnector.getLocalPort()); + for (Map.Entry<String, String> entry : hopHeaders.entrySet()) + request.header(entry.getKey(), entry.getValue()); + ContentResponse response = request.send(); + + Assert.assertEquals(200, response.getStatus()); + } + // TODO: test proxy authentication } diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java index 91043660bf..415f96e327 100644 --- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java +++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java @@ -59,7 +59,12 @@ public class ServletUpgradeResponse extends UpgradeResponse public boolean isCommitted() { - return response.isCommitted(); + if (response != null) + { + return response.isCommitted(); + } + // True in all other cases + return true; } public boolean isExtensionsNegotiated() |