org.projectodd.sockjs.WebsocketHandler Maven / Gradle / Ivy
/**
* Copyright (C) 2014 Red Hat, Inc, and individual contributors.
* Copyright (C) 2011-2012 VMware, Inc.
*/
package org.projectodd.sockjs;
/**
* Handlers from sockjs-node's trans-websocket.coffee
*/
public class WebsocketHandler {
private void websocketCheck(SockJsRequest req) {
String upgradeHeader = req.getHeader("upgrade");
if (!"websocket".equalsIgnoreCase(upgradeHeader)) {
throw new DispatchException(400, "Can \"Upgrade\" only to \"WebSocket\".");
}
String connectionHeader = req.getHeader("connection");
if (connectionHeader == null) {
connectionHeader = "";
}
boolean isUpgrade = false;
for (String conn : connectionHeader.split("/, *")) {
if (conn.equalsIgnoreCase("upgrade")) {
isUpgrade = true;
break;
}
}
if (!isUpgrade) {
throw new DispatchException(400, "\"Connection\" must be \"Upgrade\".");
}
}
public DispatchFunction sockjsWebsocket = new DispatchFunction() {
@Override
public Object handle(SockJsRequest req, SockJsResponse res, Object data) throws SockJsException {
websocketCheck(req);
// Valid websocket requests supported by this server don't make it this far - they
// get handled before being dispatched to the Servlet.
return unsupported.handle(req, res, data);
}
};
public DispatchFunction rawWebsocket = new DispatchFunction() {
@Override
public Object handle(SockJsRequest req, SockJsResponse res, Object data) throws SockJsException {
websocketCheck(req);
// Valid websocket requests supported by this server don't make it this far - they
// get handled before being dispatched to the Servlet.
return unsupported.handle(req, res, data);
}
};
private DispatchFunction unsupported = new DispatchFunction() {
@Override
public Object handle(SockJsRequest req, SockJsResponse res, Object data) throws SockJsException {
// Any valid websocket request the server supports will not be dispatched here
// With Undertow, for example, Hixie-76 isn't supported so we hit this code instead
// of doing the websocket handshake
res.setHeader("connection", "close");
res.writeHead(400);
res.end("Server doesn't support the requested WebSocket variant\r\n");
return null;
}
};
public WebsocketHandler(SockJsServer server) {
this.server = server;
}
private SockJsServer server;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy