#if !NET20 using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace Apewer.WebSocket { internal class ConnectionInfo { const string CookiePattern = @"((;)*(\s)*(?[^=]+)=(?[^\;]+))+"; private static readonly Regex CookieRegex = new Regex(CookiePattern, RegexOptions.Compiled); public static ConnectionInfo Create(HttpRequest request, string clientIp, int clientPort, string negotiatedSubprotocol) { var info = new ConnectionInfo { Origin = request["Origin"] ?? request["Sec-WebSocket-Origin"], Host = request["Host"], SubProtocol = request["Sec-WebSocket-Protocol"], Path = request.Path, ClientIpAddress = clientIp, ClientPort = clientPort, NegotiatedSubProtocol = negotiatedSubprotocol, Headers = new Dictionary(request.Headers, System.StringComparer.InvariantCultureIgnoreCase) }; var cookieHeader = request["Cookie"]; if (cookieHeader != null) { var match = CookieRegex.Match(cookieHeader); var fields = match.Groups["cookie_name"].Captures; var values = match.Groups["cookie_value"].Captures; for (var i = 0; i < fields.Count; i++) { var name = fields[i].ToString(); var value = values[i].ToString(); info.Cookies[name] = value; } } return info; } ConnectionInfo() { Cookies = new Dictionary(); Id = Guid.NewGuid(); } public string NegotiatedSubProtocol { get; private set; } public string SubProtocol { get; private set; } public string Origin { get; private set; } public string Host { get; private set; } public string Path { get; private set; } public string ClientIpAddress { get; set; } public int ClientPort { get; set; } public Guid Id { get; set; } public IDictionary Cookies { get; private set; } public IDictionary Headers { get; private set; } } } #endif