mirror of
https://github.com/jetty/jetty.project.git
synced 2025-02-25 08:58:30 +00:00
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:
parent
cfe248c67b
commit
5d9360e343
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
public void setStatus(int status)
|
||||
// Transfer all headers to the real HTTP response
|
||||
for (Map.Entry<String, List<String>> entry : getHeaders().entrySet())
|
||||
{
|
||||
this.resp.setStatus(status);
|
||||
for (String value : entry.getValue())
|
||||
{
|
||||
response.addHeader(entry.getKey(), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user