View Javadoc

1   /*******************************************************************************
2    * Copyright (c) 2011 Intalio, Inc.
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    *
8    *   The Eclipse Public License is available at
9    *   http://www.eclipse.org/legal/epl-v10.html
10   *
11   *   The Apache License v2.0 is available at
12   *   http://www.opensource.org/licenses/apache2.0.php
13   *
14   * You may elect to redistribute this code under either of these licenses.
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 }