Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimone Bordet2014-02-03 11:49:58 +0000
committerSimone Bordet2014-02-03 11:49:58 +0000
commitcfe248c67beea260f21a73bca019e3241f2cf11d (patch)
treeb8a1bed9f5ba3e0adcd6d73e97194d14b11e2f10
parent5e3c8821bb3ac838903cefac80080c404ac647e8 (diff)
downloadorg.eclipse.jetty.project-cfe248c67beea260f21a73bca019e3241f2cf11d.tar.gz
org.eclipse.jetty.project-cfe248c67beea260f21a73bca019e3241f2cf11d.tar.xz
org.eclipse.jetty.project-cfe248c67beea260f21a73bca019e3241f2cf11d.zip
427128 - Cookies are not sent to the server.
Implemented/fixed handling of cookies sent by client to server.
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java20
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java122
-rw-r--r--jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java3
-rw-r--r--jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java14
-rw-r--r--jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java2
5 files changed, 151 insertions, 10 deletions
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java
index a17656038f..968f74fa49 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java
@@ -18,9 +18,9 @@
package org.eclipse.jetty.websocket.jsr356;
+import java.net.HttpCookie;
import java.util.List;
import java.util.Map;
-
import javax.websocket.ClientEndpointConfig.Configurator;
import org.eclipse.jetty.websocket.api.UpgradeRequest;
@@ -46,7 +46,23 @@ public class JsrUpgradeListener implements UpgradeListener
Map<String, List<String>> headers = request.getHeaders();
configurator.beforeRequest(headers);
- request.setHeaders(headers);
+
+ // Handle cookies
+ for (String name : headers.keySet())
+ {
+ if ("cookie".equalsIgnoreCase(name))
+ {
+ List<String> values = headers.get(name);
+ if (values != null)
+ {
+ for (String cookie : values)
+ {
+ List<HttpCookie> cookies = HttpCookie.parse(cookie);
+ request.getCookies().addAll(cookies);
+ }
+ }
+ }
+ }
}
@Override
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java
new file mode 100644
index 0000000000..0bf9abd42b
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java
@@ -0,0 +1,122 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2014 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.websocket.jsr356;
+
+import java.net.HttpCookie;
+import java.net.URI;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import javax.websocket.ClientEndpointConfig;
+import javax.websocket.ContainerProvider;
+import javax.websocket.Endpoint;
+import javax.websocket.EndpointConfig;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
+
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CookiesTest
+{
+ private Server server;
+ private ServerConnector connector;
+
+ protected void startServer(Handler handler) throws Exception
+ {
+ server = new Server();
+ connector = new ServerConnector(server);
+ server.addConnector(connector);
+
+ ContextHandler context = new ContextHandler();
+ context.setContextPath("/");
+ context.setHandler(handler);
+ server.setHandler(context);
+
+ server.start();
+ }
+
+ @After
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testCookiesAreSentToServer() throws Exception
+ {
+ final String cookieName = "name";
+ final String cookieValue = "value";
+ final String cookieString = cookieName + "=" + cookieValue;
+ startServer(new EchoHandler()
+ {
+ @Override
+ public Object createWebSocket(ServletUpgradeRequest request, ServletUpgradeResponse response)
+ {
+ List<HttpCookie> cookies = request.getCookies();
+ Assert.assertNotNull(cookies);
+ Assert.assertEquals(1, cookies.size());
+ HttpCookie cookie = cookies.get(0);
+ Assert.assertEquals(cookieName, cookie.getName());
+ Assert.assertEquals(cookieValue, cookie.getValue());
+
+ Map<String, List<String>> headers = request.getHeaders();
+ // Test case insensitivity
+ Assert.assertTrue(headers.containsKey("cookie"));
+ List<String> values = headers.get("Cookie");
+ Assert.assertNotNull(values);
+ Assert.assertEquals(1, values.size());
+ Assert.assertEquals(cookieString, values.get(0));
+
+ return super.createWebSocket(request, response);
+ }
+ });
+
+ WebSocketContainer container = ContainerProvider.getWebSocketContainer();
+
+ ClientEndpointConfig.Builder builder = ClientEndpointConfig.Builder.create();
+ builder.configurator(new ClientEndpointConfig.Configurator()
+ {
+ @Override
+ public void beforeRequest(Map<String, List<String>> headers)
+ {
+ headers.put("Cookie", Collections.singletonList(cookieString));
+ }
+ });
+ ClientEndpointConfig config = builder.build();
+
+ Endpoint endPoint = new Endpoint()
+ {
+ @Override
+ public void onOpen(Session session, EndpointConfig config)
+ {
+ }
+ };
+
+ Session session = container.connectToServer(endPoint, config, URI.create("ws://localhost:" + connector.getLocalPort()));
+ session.close();
+ }
+}
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java
index bbbe21f7b1..c76dd5419a 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java
@@ -262,7 +262,8 @@ public class UpgradeRequest
public void setCookies(List<HttpCookie> cookies)
{
- this.cookies = cookies;
+ this.cookies.clear();
+ this.cookies.addAll(cookies);
}
public void setExtensions(List<ExtensionConfig> configs)
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
index c042e96def..15d2f37e04 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
@@ -24,10 +24,10 @@ import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeSet;
import java.util.concurrent.ThreadLocalRandom;
import org.eclipse.jetty.util.B64Code;
@@ -44,15 +44,17 @@ import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
*/
public class ClientUpgradeRequest extends UpgradeRequest
{
- private final static Logger LOG = Log.getLogger(ClientUpgradeRequest.class);
- private final static int MAX_KEYS = -1; // maximum number of parameter keys to decode
+ private static final Logger LOG = Log.getLogger(ClientUpgradeRequest.class);
+ private static final int MAX_KEYS = -1; // maximum number of parameter keys to decode
private static final Set<String> FORBIDDEN_HEADERS;
static
{
- // headers not allowed to be set in ClientUpgradeRequest.headers
- FORBIDDEN_HEADERS = new HashSet<>();
+ // Headers not allowed to be set in ClientUpgradeRequest.headers.
+ FORBIDDEN_HEADERS = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
+ // Cookies are handled explicitly, avoid to add them twice.
FORBIDDEN_HEADERS.add("cookie");
+ // Headers that cannot be set by applications.
FORBIDDEN_HEADERS.add("upgrade");
FORBIDDEN_HEADERS.add("host");
FORBIDDEN_HEADERS.add("connection");
@@ -176,7 +178,7 @@ public class ClientUpgradeRequest extends UpgradeRequest
{
if (FORBIDDEN_HEADERS.contains(key))
{
- LOG.warn("Skipping forbidden header - {}",key);
+ LOG.debug("Skipping forbidden header - {}",key);
continue; // skip
}
request.append(key).append(": ");
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java
index b9309f8db8..8af85198ed 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java
@@ -264,7 +264,7 @@ public class WebSocketClient extends ContainerLifeCycle implements SessionListen
}
super.doStop();
- LOG.info("Stopped {}",this);
+ LOG.debug("Stopped {}",this);
}
/**

Back to the top