/// <summary> /// 表示握手回复 /// </summary> /// <param name="request">握手请求</param> /// <exception cref="ArgumentNullException"></exception> public HandshakeResponse(HttpRequest request) { if (request == null) { throw new ArgumentNullException(); } this.request = request; }
/// <summary> /// 解析连接请求信息 /// </summary> /// <param name="bytes">原始数量</param> /// <param name="scheme">scheme</param> /// <returns></returns> private static HttpRequest From(byte[] bytes, string scheme) { const string pattern = @"^(?<method>[^\s]+)\s(?<path>[^\s]+)\sHTTP\/1\.1\r\n" + @"((?<field_name>[^:\r\n]+):\s(?<field_value>[^\r\n]*)\r\n)+" + @"\r\n" + @"(?<body>.+)?"; var match = Regex.Match(Encoding.UTF8.GetString(bytes), pattern, RegexOptions.IgnoreCase); if (match.Success == false) { return null; } var request = new HttpRequest { Method = match.Groups["method"].Value, Path = match.Groups["path"].Value, Body = match.Groups["body"].Value.Trim(), Scheme = scheme }; var fields = match.Groups["field_name"].Captures; var values = match.Groups["field_value"].Captures; for (var i = 0; i < fields.Count; i++) { var name = fields[i].ToString(); var value = values[i].ToString(); request.Header[name] = value; } return request; }