View Javadoc

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 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 }