1 package org.eclipse.jetty.websocket;
2
3 import java.io.IOException;
4
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse;
7
8 import org.eclipse.jetty.http.HttpParser;
9 import org.eclipse.jetty.io.ConnectedEndPoint;
10 import org.eclipse.jetty.server.HttpConnection;
11
12
13
14
15
16 public class WebSocketFactory
17 {
18 private WebSocketBuffers _buffers;
19 private int _maxIdleTime=300000;
20
21
22 public WebSocketFactory()
23 {
24 _buffers=new WebSocketBuffers(8192);
25 }
26
27
28 public WebSocketFactory(int bufferSize)
29 {
30 _buffers=new WebSocketBuffers(bufferSize);
31 }
32
33
34
35
36
37 public long getMaxIdleTime()
38 {
39 return _maxIdleTime;
40 }
41
42
43
44
45
46 public void setMaxIdleTime(int maxIdleTime)
47 {
48 _maxIdleTime = maxIdleTime;
49 }
50
51
52
53
54
55 public int getBufferSize()
56 {
57 return _buffers.getBufferSize();
58 }
59
60
61
62
63
64 public void setBufferSize(int bufferSize)
65 {
66 if (bufferSize!=getBufferSize())
67 _buffers=new WebSocketBuffers(bufferSize);
68 }
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 public void upgrade(HttpServletRequest request,HttpServletResponse response, WebSocket websocket, String origin, String protocol)
84 throws IOException
85 {
86 if (!"WebSocket".equals(request.getHeader("Upgrade")))
87 throw new IllegalStateException("!Upgrade:websocket");
88 if (!"HTTP/1.1".equals(request.getProtocol()))
89 throw new IllegalStateException("!HTTP/1.1");
90
91 HttpConnection http = HttpConnection.getCurrentConnection();
92 ConnectedEndPoint endp = (ConnectedEndPoint)http.getEndPoint();
93 WebSocketConnection connection = new WebSocketConnection(websocket,endp,_buffers,http.getTimeStamp(), _maxIdleTime);
94
95 String uri=request.getRequestURI();
96 String query=request.getQueryString();
97 if (query!=null && query.length()>0)
98 uri+="?"+query;
99 String host=request.getHeader("Host");
100 response.setHeader("Upgrade","WebSocket");
101 response.addHeader("Connection","Upgrade");
102 response.addHeader("WebSocket-Origin",origin);
103 response.addHeader("WebSocket-Location",(request.isSecure()?"wss://":"ws://")+host+uri);
104 if (protocol!=null)
105 response.addHeader("WebSocket-Protocol",protocol);
106 response.sendError(101,"Web Socket Protocol Handshake");
107 response.flushBuffer();
108
109 connection.fill(((HttpParser)http.getParser()).getHeaderBuffer());
110 connection.fill(((HttpParser)http.getParser()).getBodyBuffer());
111
112 websocket.onConnect(connection);
113 request.setAttribute("org.eclipse.jetty.io.Connection",connection);
114 response.flushBuffer();
115 }
116 }