common websocket initiation
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@1115 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
parent
d7f7382bf5
commit
76cab45109
|
@ -0,0 +1,69 @@
|
|||
package org.eclipse.jetty.websocket;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.eclipse.jetty.http.HttpParser;
|
||||
import org.eclipse.jetty.io.ConnectedEndPoint;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Factory to create WebSocket connections
|
||||
*/
|
||||
public class WebSocketFactory extends WebSocketBuffers
|
||||
{
|
||||
public WebSocketFactory(int bufferSize)
|
||||
{
|
||||
super(bufferSize);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Upgrade the request/response to a WebSocket Connection.
|
||||
* <p>This method will not normally return, but will instead throw a
|
||||
* UpgradeConnectionException, to exit HTTP handling and initiate
|
||||
* WebSocket handling of the connection.
|
||||
* @param request The request to upgrade
|
||||
* @param response The response to upgrade
|
||||
* @param websocket The websocket handler implementation to use
|
||||
* @param origin The origin of the websocket connection
|
||||
* @param protocol The protocol
|
||||
* @throws UpgradeConnectionException Thrown to upgrade the connection
|
||||
* @throws IOException
|
||||
*/
|
||||
public void upgrade(HttpServletRequest request,HttpServletResponse response, WebSocket websocket, String origin, String protocol)
|
||||
throws UpgradeConnectionException, IOException
|
||||
{
|
||||
if (!"WebSocket".equals(request.getHeader("Upgrade")))
|
||||
throw new IllegalStateException("!Upgrade:websocket");
|
||||
if (!"HTTP/1.1".equals(request.getProtocol()))
|
||||
throw new IllegalStateException("!HTTP/1.1");
|
||||
|
||||
HttpConnection http = HttpConnection.getCurrentConnection();
|
||||
ConnectedEndPoint endp = (ConnectedEndPoint)http.getEndPoint();
|
||||
WebSocketConnection connection = new WebSocketConnection(this,endp,http.getTimeStamp(),websocket);
|
||||
|
||||
String uri=request.getRequestURI();
|
||||
String host=request.getHeader("Host");
|
||||
|
||||
response.setHeader("Upgrade","WebSocket");
|
||||
response.addHeader("Connection","Upgrade");
|
||||
response.addHeader("WebSocket-Origin",origin);
|
||||
response.addHeader("WebSocket-Location","ws://"+host+uri);
|
||||
if (protocol!=null)
|
||||
response.addHeader("WebSocket-Protocol",protocol);
|
||||
response.sendError(101,"Web Socket Protocol Handshake");
|
||||
response.flushBuffer();
|
||||
|
||||
connection.fill(((HttpParser)http.getParser()).getHeaderBuffer());
|
||||
connection.fill(((HttpParser)http.getParser()).getBodyBuffer());
|
||||
|
||||
websocket.onConnect(connection);
|
||||
throw new UpgradeConnectionException(connection);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -15,7 +15,7 @@ import org.eclipse.jetty.server.handler.HandlerWrapper;
|
|||
|
||||
public abstract class WebSocketHandler extends HandlerWrapper
|
||||
{
|
||||
private WebSocketBuffers _buffers = new WebSocketBuffers(8192);
|
||||
private WebSocketFactory _websocket;
|
||||
private int _bufferSize=8192;
|
||||
|
||||
|
||||
|
@ -44,7 +44,7 @@ public abstract class WebSocketHandler extends HandlerWrapper
|
|||
@Override
|
||||
protected void doStart() throws Exception
|
||||
{
|
||||
_buffers=new WebSocketBuffers(_bufferSize);
|
||||
_websocket=new WebSocketFactory(_bufferSize);
|
||||
super.doStart();
|
||||
}
|
||||
|
||||
|
@ -56,50 +56,27 @@ public abstract class WebSocketHandler extends HandlerWrapper
|
|||
protected void doStop() throws Exception
|
||||
{
|
||||
super.doStop();
|
||||
_buffers=null;
|
||||
_websocket=null;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
@Override
|
||||
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
|
||||
{
|
||||
if ("WebSocket".equals(request.getHeader("Upgrade")) &&
|
||||
"HTTP/1.1".equals(request.getProtocol()))
|
||||
if ("WebSocket".equals(request.getHeader("Upgrade")))
|
||||
{
|
||||
String protocol=request.getHeader("WebSocket-Protocol");
|
||||
WebSocket websocket=doWebSocketConnect(request,protocol);
|
||||
|
||||
if (websocket!=null)
|
||||
{
|
||||
HttpConnection http = HttpConnection.getCurrentConnection();
|
||||
ConnectedEndPoint endp = (ConnectedEndPoint)http.getEndPoint();
|
||||
WebSocketConnection connection = new WebSocketConnection(_buffers,endp,http.getTimeStamp(),websocket);
|
||||
|
||||
String uri=request.getRequestURI();
|
||||
String host=request.getHeader("Host");
|
||||
String origin=request.getHeader("Origin");
|
||||
origin=checkOrigin(request,host,origin);
|
||||
|
||||
response.setHeader("Upgrade","WebSocket");
|
||||
response.addHeader("Connection","Upgrade");
|
||||
response.addHeader("WebSocket-Origin",origin);
|
||||
response.addHeader("WebSocket-Location","ws://"+host+uri);
|
||||
if (protocol!=null)
|
||||
response.addHeader("WebSocket-Protocol",protocol);
|
||||
response.sendError(101,"Web Socket Protocol Handshake");
|
||||
response.flushBuffer();
|
||||
|
||||
connection.fill(((HttpParser)http.getParser()).getHeaderBuffer());
|
||||
connection.fill(((HttpParser)http.getParser()).getBodyBuffer());
|
||||
|
||||
websocket.onConnect(connection);
|
||||
throw new UpgradeConnectionException(connection);
|
||||
}
|
||||
if (websocket!=null)
|
||||
_websocket.upgrade(request,response,websocket,origin,protocol);
|
||||
else
|
||||
{
|
||||
response.sendError(503);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
super.handle(target,baseRequest,request,response);
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.eclipse.jetty.server.HttpConnection;
|
|||
*/
|
||||
public abstract class WebSocketServlet extends HttpServlet
|
||||
{
|
||||
WebSocketBuffers _buffers;
|
||||
WebSocketFactory _websocket;
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
|
@ -36,7 +36,7 @@ public abstract class WebSocketServlet extends HttpServlet
|
|||
public void init() throws ServletException
|
||||
{
|
||||
String bs=getInitParameter("bufferSize");
|
||||
_buffers = new WebSocketBuffers(bs==null?8192:Integer.parseInt(bs));
|
||||
_websocket = new WebSocketFactory(bs==null?8192:Integer.parseInt(bs));
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -46,43 +46,20 @@ public abstract class WebSocketServlet extends HttpServlet
|
|||
@Override
|
||||
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||
{
|
||||
if ("WebSocket".equals(request.getHeader("Upgrade")) &&
|
||||
"HTTP/1.1".equals(request.getProtocol()))
|
||||
if ("WebSocket".equals(request.getHeader("Upgrade")))
|
||||
{
|
||||
String protocol=request.getHeader("WebSocket-Protocol");
|
||||
WebSocket websocket=doWebSocketConnect(request,protocol);
|
||||
|
||||
if (websocket!=null)
|
||||
{
|
||||
HttpConnection http = HttpConnection.getCurrentConnection();
|
||||
ConnectedEndPoint endp = (ConnectedEndPoint)http.getEndPoint();
|
||||
WebSocketConnection connection = new WebSocketConnection(_buffers,endp,http.getTimeStamp(),websocket);
|
||||
|
||||
String uri=request.getRequestURI();
|
||||
String host=request.getHeader("Host");
|
||||
String origin=request.getHeader("Origin");
|
||||
origin=checkOrigin(request,host,origin);
|
||||
|
||||
response.setHeader("Upgrade","WebSocket");
|
||||
response.addHeader("Connection","Upgrade");
|
||||
response.addHeader("WebSocket-Origin",origin);
|
||||
response.addHeader("WebSocket-Location","ws://"+host+uri);
|
||||
if (protocol!=null)
|
||||
response.addHeader("WebSocket-Protocol",protocol);
|
||||
response.sendError(101,"Web Socket Protocol Handshake");
|
||||
response.flushBuffer();
|
||||
|
||||
connection.fill(((HttpParser)http.getParser()).getHeaderBuffer());
|
||||
connection.fill(((HttpParser)http.getParser()).getBodyBuffer());
|
||||
|
||||
websocket.onConnect(connection);
|
||||
throw new UpgradeConnectionException(connection);
|
||||
}
|
||||
if (websocket!=null)
|
||||
_websocket.upgrade(request,response,websocket,origin,protocol);
|
||||
else
|
||||
{
|
||||
response.sendError(503);
|
||||
}
|
||||
}
|
||||
else
|
||||
super.service(request,response);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue