103928aee4356845252ac6b662d5c72c29903813eJake Slack//
203928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
303928aee4356845252ac6b662d5c72c29903813eJake Slack//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
403928aee4356845252ac6b662d5c72c29903813eJake Slack//  ------------------------------------------------------------------------
503928aee4356845252ac6b662d5c72c29903813eJake Slack//  All rights reserved. This program and the accompanying materials
603928aee4356845252ac6b662d5c72c29903813eJake Slack//  are made available under the terms of the Eclipse Public License v1.0
703928aee4356845252ac6b662d5c72c29903813eJake Slack//  and Apache License v2.0 which accompanies this distribution.
803928aee4356845252ac6b662d5c72c29903813eJake Slack//
903928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Eclipse Public License is available at
1003928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.eclipse.org/legal/epl-v10.html
1103928aee4356845252ac6b662d5c72c29903813eJake Slack//
1203928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Apache License v2.0 is available at
1303928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.opensource.org/licenses/apache2.0.php
1403928aee4356845252ac6b662d5c72c29903813eJake Slack//
1503928aee4356845252ac6b662d5c72c29903813eJake Slack//  You may elect to redistribute this code under either of these licenses.
1603928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
1703928aee4356845252ac6b662d5c72c29903813eJake Slack//
1803928aee4356845252ac6b662d5c72c29903813eJake Slack
1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.websocket;
2003928aee4356845252ac6b662d5c72c29903813eJake Slack
2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.IOException;
2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.List;
2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpServletRequest;
2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpServletResponse;
2503928aee4356845252ac6b662d5c72c29903813eJake Slack
2603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.EndPoint;
2703928aee4356845252ac6b662d5c72c29903813eJake Slack
2803928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class WebSocketServletConnectionRFC6455 extends WebSocketConnectionRFC6455 implements WebSocketServletConnection
2903928aee4356845252ac6b662d5c72c29903813eJake Slack{
3003928aee4356845252ac6b662d5c72c29903813eJake Slack    private final WebSocketFactory factory;
3103928aee4356845252ac6b662d5c72c29903813eJake Slack
3203928aee4356845252ac6b662d5c72c29903813eJake Slack    public WebSocketServletConnectionRFC6455(WebSocketFactory factory, WebSocket websocket, EndPoint endpoint, WebSocketBuffers buffers, long timestamp, int maxIdleTime, String protocol,
3303928aee4356845252ac6b662d5c72c29903813eJake Slack            List<Extension> extensions, int draft) throws IOException
3403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
3503928aee4356845252ac6b662d5c72c29903813eJake Slack        super(websocket,endpoint,buffers,timestamp,maxIdleTime,protocol,extensions,draft);
3603928aee4356845252ac6b662d5c72c29903813eJake Slack        this.factory = factory;
3703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
3803928aee4356845252ac6b662d5c72c29903813eJake Slack
3903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
4003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void handshake(HttpServletRequest request, HttpServletResponse response, String subprotocol) throws IOException
4103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
4203928aee4356845252ac6b662d5c72c29903813eJake Slack        String key = request.getHeader("Sec-WebSocket-Key");
4303928aee4356845252ac6b662d5c72c29903813eJake Slack
4403928aee4356845252ac6b662d5c72c29903813eJake Slack        response.setHeader("Upgrade","WebSocket");
4503928aee4356845252ac6b662d5c72c29903813eJake Slack        response.addHeader("Connection","Upgrade");
4603928aee4356845252ac6b662d5c72c29903813eJake Slack        response.addHeader("Sec-WebSocket-Accept",hashKey(key));
4703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (subprotocol != null)
4803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
4903928aee4356845252ac6b662d5c72c29903813eJake Slack            response.addHeader("Sec-WebSocket-Protocol",subprotocol);
5003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
5103928aee4356845252ac6b662d5c72c29903813eJake Slack
5203928aee4356845252ac6b662d5c72c29903813eJake Slack        for (Extension ext : getExtensions())
5303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
5403928aee4356845252ac6b662d5c72c29903813eJake Slack            response.addHeader("Sec-WebSocket-Extensions",ext.getParameterizedName());
5503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
5603928aee4356845252ac6b662d5c72c29903813eJake Slack
5703928aee4356845252ac6b662d5c72c29903813eJake Slack        response.sendError(101);
5803928aee4356845252ac6b662d5c72c29903813eJake Slack
5903928aee4356845252ac6b662d5c72c29903813eJake Slack        onFrameHandshake();
6003928aee4356845252ac6b662d5c72c29903813eJake Slack        onWebSocketOpen();
6103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
6203928aee4356845252ac6b662d5c72c29903813eJake Slack
6303928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
6403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void onClose()
6503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
6603928aee4356845252ac6b662d5c72c29903813eJake Slack        super.onClose();
6703928aee4356845252ac6b662d5c72c29903813eJake Slack        factory.removeConnection(this);
6803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
6903928aee4356845252ac6b662d5c72c29903813eJake Slack}
70