#region MIT License 
 | 
/** 
 | 
 * ResponseHandshake.cs 
 | 
 * 
 | 
 * The MIT License 
 | 
 * 
 | 
 * Copyright (c) 2012 sta.blockhead 
 | 
 *  
 | 
 * Permission is hereby granted, free of charge, to any person obtaining a copy 
 | 
 * of this software and associated documentation files (the "Software"), to deal 
 | 
 * in the Software without restriction, including without limitation the rights 
 | 
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
 | 
 * copies of the Software, and to permit persons to whom the Software is 
 | 
 * furnished to do so, subject to the following conditions: 
 | 
 * 
 | 
 * The above copyright notice and this permission notice shall be included in 
 | 
 * all copies or substantial portions of the Software. 
 | 
 *  
 | 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 | 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 | 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 | 
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
 | 
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 | 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
 | 
 * THE SOFTWARE. 
 | 
 */ 
 | 
#endregion 
 | 
  
 | 
using System; 
 | 
using System.Collections.Specialized; 
 | 
using System.Text; 
 | 
using WebSocketSharp.Net; 
 | 
  
 | 
namespace WebSocketSharp 
 | 
{ 
 | 
  
 | 
    public class ResponseHandshake : Handshake 
 | 
    { 
 | 
        #region Constructor 
 | 
  
 | 
        public ResponseHandshake() 
 | 
            : this(HttpStatusCode.SwitchingProtocols) 
 | 
        { 
 | 
            AddHeader("Upgrade", "websocket"); 
 | 
            AddHeader("Connection", "Upgrade"); 
 | 
        } 
 | 
  
 | 
        public ResponseHandshake(HttpStatusCode code) 
 | 
        { 
 | 
            StatusCode = ((int)code).ToString(); 
 | 
            Reason = Ext.GetDescription(code); 
 | 
        } 
 | 
  
 | 
        #endregion 
 | 
  
 | 
        #region Properties 
 | 
  
 | 
        public bool IsWebSocketResponse 
 | 
        { 
 | 
  
 | 
            get 
 | 
            { 
 | 
                if (ProtocolVersion != HttpVersion.Version11) 
 | 
                    return false; 
 | 
  
 | 
                if (StatusCode != "101") 
 | 
                    return false; 
 | 
  
 | 
                if (!HeaderExists("Upgrade", "websocket")) 
 | 
                    return false; 
 | 
  
 | 
                if (!HeaderExists("Connection", "Upgrade")) 
 | 
                    return false; 
 | 
  
 | 
                if (!HeaderExists("Sec-WebSocket-Accept")) 
 | 
                    return false; 
 | 
  
 | 
                return true; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public string Reason { get; internal set; } 
 | 
  
 | 
        public string StatusCode { get; internal set; } 
 | 
  
 | 
        #endregion 
 | 
  
 | 
        #region Methods 
 | 
  
 | 
        public static ResponseHandshake CreateCloseResponse(HttpStatusCode code) 
 | 
        { 
 | 
            var res = new ResponseHandshake(code); 
 | 
            res.AddHeader("Connection", "close"); 
 | 
  
 | 
            return res; 
 | 
        } 
 | 
  
 | 
        public static ResponseHandshake Parse(string[] response) 
 | 
        { 
 | 
            var statusLine = response[0].Split(' '); 
 | 
            if (statusLine.Length < 3) 
 | 
                throw new ArgumentException("Invalid status line."); 
 | 
  
 | 
            var reason = new StringBuilder(statusLine[2]); 
 | 
            for (int i = 3; i < statusLine.Length; i++) 
 | 
                reason.AppendFormat(" {0}", statusLine[i]); 
 | 
  
 | 
            var headers = new WebHeaderCollection(); 
 | 
            for (int i = 1; i < response.Length; i++) 
 | 
                headers.Add(response[i]); 
 | 
  
 | 
            return new ResponseHandshake 
 | 
            { 
 | 
                Headers = headers, 
 | 
                Reason = reason.ToString(), 
 | 
                StatusCode = statusLine[1], 
 | 
                ProtocolVersion = new Version(statusLine[0].Substring(5)) 
 | 
            }; 
 | 
        } 
 | 
  
 | 
        public override string ToString() 
 | 
        { 
 | 
            var buffer = new StringBuilder(); 
 | 
  
 | 
            buffer.AppendFormat("HTTP/{0} {1} {2}{3}", ProtocolVersion, StatusCode, Reason, _crlf); 
 | 
  
 | 
            foreach (string key in Headers.AllKeys) 
 | 
                buffer.AppendFormat("{0}: {1}{2}", key, Headers[key], _crlf); 
 | 
  
 | 
            buffer.Append(_crlf); 
 | 
  
 | 
            return buffer.ToString(); 
 | 
        } 
 | 
  
 | 
        #endregion 
 | 
    } 
 | 
} 
 |