427254 - Cookies are not sent to the client.

Introduced ServletUpgradeResponse.complete(), called when the response
is about to be sent to the client, to transfer the headers stored in
the superclass (UpgradeResponse.headers) into the HttpServletResponse.
This commit is contained in:
Simone Bordet 2014-02-03 15:31:51 +01:00
parent cfe248c67b
commit 5d9360e343
4 changed files with 83 additions and 27 deletions

View File

@ -27,6 +27,7 @@ import javax.websocket.ClientEndpointConfig;
import javax.websocket.ContainerProvider;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.HandshakeResponse;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
@ -119,4 +120,60 @@ public class CookiesTest
Session session = container.connectToServer(endPoint, config, URI.create("ws://localhost:" + connector.getLocalPort()));
session.close();
}
@Test
public void testCookiesAreSentToClient() throws Exception
{
final String cookieName = "name";
final String cookieValue = "value";
final String cookieDomain = "domain";
final String cookiePath = "/path";
startServer(new EchoHandler()
{
@Override
public Object createWebSocket(ServletUpgradeRequest request, ServletUpgradeResponse response)
{
String cookieString = cookieName + "=" + cookieValue + ";Domain=" + cookieDomain + ";Path=" + cookiePath;
response.getHeaders().put("Set-Cookie", Collections.singletonList(cookieString));
return super.createWebSocket(request, response);
}
});
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
ClientEndpointConfig.Builder builder = ClientEndpointConfig.Builder.create();
builder.configurator(new ClientEndpointConfig.Configurator()
{
@Override
public void afterResponse(HandshakeResponse response)
{
Map<String, List<String>> headers = response.getHeaders();
// Test case insensitivity
Assert.assertTrue(headers.containsKey("set-cookie"));
List<String> values = headers.get("Set-Cookie");
Assert.assertNotNull(values);
Assert.assertEquals(1, values.size());
List<HttpCookie> cookies = HttpCookie.parse(values.get(0));
Assert.assertEquals(1, cookies.size());
HttpCookie cookie = cookies.get(0);
Assert.assertEquals(cookieName, cookie.getName());
Assert.assertEquals(cookieValue, cookie.getValue());
Assert.assertEquals(cookieDomain, cookie.getDomain());
Assert.assertEquals(cookiePath, cookie.getPath());
}
});
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();
}
}

View File

@ -19,7 +19,6 @@
package org.eclipse.jetty.websocket.server;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
@ -65,5 +64,6 @@ public class HandshakeRFC6455 implements WebSocketHandshake
}
response.setStatus(HttpServletResponse.SC_SWITCHING_PROTOCOLS);
response.complete();
}
}

View File

@ -32,7 +32,6 @@ import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Executor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -187,7 +186,7 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
if (websocketPojo == null)
{
// no creation, sorry
response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
sockresp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Endpoint Creation Failed");
return false;
}

View File

@ -20,7 +20,7 @@ package org.eclipse.jetty.websocket.servlet;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.websocket.api.UpgradeResponse;
@ -31,26 +31,24 @@ import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
*/
public class ServletUpgradeResponse extends UpgradeResponse
{
private HttpServletResponse resp;
private HttpServletResponse response;
private boolean extensionsNegotiated = false;
private boolean subprotocolNegotiated = false;
public ServletUpgradeResponse(HttpServletResponse resp)
public ServletUpgradeResponse(HttpServletResponse response)
{
super();
this.resp = resp;
}
@Override
public void addHeader(String name, String value)
{
this.resp.addHeader(name,value);
this.response = response;
}
@Override
public int getStatusCode()
{
return this.resp.getStatus();
return response.getStatus();
}
public void setStatus(int status)
{
response.setStatus(status);
}
@Override
@ -61,7 +59,7 @@ public class ServletUpgradeResponse extends UpgradeResponse
public boolean isCommitted()
{
return this.resp.isCommitted();
return response.isCommitted();
}
public boolean isExtensionsNegotiated()
@ -77,14 +75,16 @@ public class ServletUpgradeResponse extends UpgradeResponse
public void sendError(int statusCode, String message) throws IOException
{
setSuccess(false);
this.resp.sendError(statusCode,message);
complete();
response.sendError(statusCode, message);
}
@Override
public void sendForbidden(String message) throws IOException
{
setSuccess(false);
resp.sendError(HttpServletResponse.SC_FORBIDDEN,message);
complete();
response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
}
@Override
@ -101,15 +101,15 @@ public class ServletUpgradeResponse extends UpgradeResponse
extensionsNegotiated = true;
}
@Override
public void setHeader(String name, String value)
public void complete()
{
this.resp.setHeader(name,value);
// Transfer all headers to the real HTTP response
for (Map.Entry<String, List<String>> entry : getHeaders().entrySet())
{
for (String value : entry.getValue())
{
response.addHeader(entry.getKey(), value);
}
}
}
public void setStatus(int status)
{
this.resp.setStatus(status);
}
}