1 // ========================================================================
2 // Copyright (c) 2010 Mort Bay Consulting Pty. Ltd.
3 // ------------------------------------------------------------------------
4 // All rights reserved. This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v1.0
6 // and Apache License v2.0 which accompanies this distribution.
7 // The Eclipse Public License is available at
8 // http://www.eclipse.org/legal/epl-v10.html
9 // The Apache License v2.0 is available at
10 // http://www.opensource.org/licenses/apache2.0.php
11 // You may elect to redistribute this code under either of these licenses.
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 /** Get the bufferSize.
34 * @return the bufferSize
35 */
36 public int getBufferSize()
37 {
38 return _bufferSize;
39 }
40
41 /* ------------------------------------------------------------ */
42 /** Set the bufferSize.
43 * @param bufferSize the bufferSize to set
44 */
45 public void setBufferSize(int bufferSize)
46 {
47 _bufferSize = bufferSize;
48 }
49
50 /* ------------------------------------------------------------ */
51 /** Get the maxIdleTime.
52 * @return the maxIdleTime
53 */
54 public int getMaxIdleTime()
55 {
56 return (int)(_websocket==null?_maxIdleTime:_websocket.getMaxIdleTime());
57 }
58
59 /* ------------------------------------------------------------ */
60 /** Set the maxIdleTime.
61 * @param maxIdleTime the maxIdleTime to set
62 */
63 public void setMaxIdleTime(int maxIdleTime)
64 {
65 _maxIdleTime = maxIdleTime;
66 if (_websocket!=null)
67 _websocket.setMaxIdleTime(maxIdleTime);
68 }
69
70 /* ------------------------------------------------------------ */
71 /**
72 * @see org.eclipse.jetty.server.handler.HandlerWrapper#doStart()
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 * @see org.eclipse.jetty.server.handler.HandlerWrapper#doStop()
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 protocol=request.getHeader(request.getHeader("Sec-WebSocket-Key1")!=null?"Sec-WebSocket-Protocol":"WebSocket-Protocol");
101 WebSocket websocket=doWebSocketConnect(request,protocol);
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,protocol);
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 }