1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.eclipse.jetty.websocket;
17
18 import java.io.IOException;
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
21
22 import org.eclipse.jetty.http.HttpURI;
23 import org.eclipse.jetty.io.EndPoint;
24 import org.eclipse.jetty.util.QuotedStringTokenizer;
25
26 public class WebSocketServletConnectionD00 extends WebSocketConnectionD00 implements WebSocketServletConnection
27 {
28 private final WebSocketFactory factory;
29
30 public WebSocketServletConnectionD00(WebSocketFactory factory, WebSocket websocket, EndPoint endpoint, WebSocketBuffers buffers, long timestamp, int maxIdleTime, String protocol)
31 throws IOException
32 {
33 super(websocket,endpoint,buffers,timestamp,maxIdleTime,protocol);
34 this.factory = factory;
35 }
36
37 public void handshake(HttpServletRequest request, HttpServletResponse response, String subprotocol) throws IOException
38 {
39 String uri = request.getRequestURI();
40 String query = request.getQueryString();
41 if (query != null && query.length() > 0)
42 {
43 uri += "?" + query;
44 }
45 uri = new HttpURI(uri).toString();
46 String host = request.getHeader("Host");
47
48 String origin = request.getHeader("Sec-WebSocket-Origin");
49 if (origin == null)
50 {
51 origin = request.getHeader("Origin");
52 }
53 if (origin != null)
54 {
55 origin = QuotedStringTokenizer.quoteIfNeeded(origin,"\r\n");
56 }
57
58 String key1 = request.getHeader("Sec-WebSocket-Key1");
59
60 if (key1 != null)
61 {
62 String key2 = request.getHeader("Sec-WebSocket-Key2");
63 setHixieKeys(key1,key2);
64
65 response.setHeader("Upgrade","WebSocket");
66 response.addHeader("Connection","Upgrade");
67 if (origin != null)
68 {
69 response.addHeader("Sec-WebSocket-Origin",origin);
70 }
71 response.addHeader("Sec-WebSocket-Location",(request.isSecure()?"wss://":"ws://") + host + uri);
72 if (subprotocol != null)
73 {
74 response.addHeader("Sec-WebSocket-Protocol",subprotocol);
75 }
76 response.sendError(101, "WebSocket Protocol Handshake");
77 }
78 else
79 {
80 response.setHeader("Upgrade","WebSocket");
81 response.addHeader("Connection","Upgrade");
82 response.addHeader("WebSocket-Origin",origin);
83 response.addHeader("WebSocket-Location",(request.isSecure()?"wss://":"ws://") + host + uri);
84 if (subprotocol != null)
85 {
86 response.addHeader("WebSocket-Protocol",subprotocol);
87 }
88 response.sendError(101,"Web Socket Protocol Handshake");
89 response.flushBuffer();
90
91 onFrameHandshake();
92 onWebsocketOpen();
93 }
94 }
95
96 @Override
97 public void onClose()
98 {
99 super.onClose();
100 factory.removeConnection(this);
101 }
102 }