Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimone Bordet2014-09-23 16:48:16 +0000
committerSimone Bordet2014-09-23 16:48:16 +0000
commit1e33c325134b4a512573bd80c915207608847232 (patch)
tree44c05f57a7716f55ed7696b747ca495988a10615
parent2bdc402609e85360feae0128c39b84628b7bc3a1 (diff)
parentdd8be028bb5840d9dee064b04c10cbb917efb1cb (diff)
downloadorg.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'.
-rw-r--r--jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java30
-rw-r--r--jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java38
-rw-r--r--jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java7
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()

Back to the top