1
2
3
4
5
6
7
8
9
10
11
12
13
14 package org.eclipse.jetty.websocket;
15
16 import java.io.IOException;
17
18 import javax.servlet.ServletException;
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
21
22 import org.eclipse.jetty.server.Request;
23 import org.eclipse.jetty.server.handler.HandlerWrapper;
24
25 public abstract class WebSocketHandler extends HandlerWrapper
26 {
27 private WebSocketFactory _websocket;
28 private int _bufferSize=8192;
29 private int _maxIdleTime=-1;
30
31
32
33
34
35
36 public int getBufferSize()
37 {
38 return _bufferSize;
39 }
40
41
42
43
44
45 public void setBufferSize(int bufferSize)
46 {
47 _bufferSize = bufferSize;
48 }
49
50
51
52
53
54 public int getMaxIdleTime()
55 {
56 return (int)(_websocket==null?_maxIdleTime:_websocket.getMaxIdleTime());
57 }
58
59
60
61
62
63 public void setMaxIdleTime(int maxIdleTime)
64 {
65 _maxIdleTime = maxIdleTime;
66 if (_websocket!=null)
67 _websocket.setMaxIdleTime(maxIdleTime);
68 }
69
70
71
72
73
74 @Override
75 protected void doStart() throws Exception
76 {
77 _websocket=new WebSocketFactory(_bufferSize);
78 if (_maxIdleTime>=0)
79 _websocket.setMaxIdleTime(_maxIdleTime);
80 super.doStart();
81 }
82
83
84
85
86
87 @Override
88 protected void doStop() throws Exception
89 {
90 super.doStop();
91 _websocket=null;
92 }
93
94
95 @Override
96 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
97 {
98 if ("WebSocket".equals(request.getHeader("Upgrade")))
99 {
100 String subprotocol=request.getHeader(request.getHeader("Sec-WebSocket-Key1")!=null?"Sec-WebSocket-Protocol":"WebSocket-Protocol");
101 WebSocket websocket=doWebSocketConnect(request,subprotocol);
102
103 String host=request.getHeader("Host");
104 String origin=request.getHeader("Origin");
105 origin=checkOrigin(request,host,origin);
106
107 if (websocket!=null)
108 _websocket.upgrade(request,response,websocket,origin,subprotocol);
109 else
110 response.sendError(503);
111 }
112 else
113 {
114 super.handle(target,baseRequest,request,response);
115 }
116 }
117
118
119 protected String checkOrigin(HttpServletRequest request, String host, String origin)
120 {
121 if (origin==null)
122 origin=host;
123 return origin;
124 }
125
126
127 abstract protected WebSocket doWebSocketConnect(HttpServletRequest request,String protocol);
128
129 }