/// <summary>分析头部</summary> /// <param name="pk"></param> /// <returns></returns> public static IDictionary <String, Object> ParseHeader(Packet pk) { // 客户端收到响应,服务端收到请求 var headers = new NullableDictionary <String, Object>(StringComparer.OrdinalIgnoreCase); var p = pk.IndexOf(NewLine); if (p < 0) { return(headers); } #if DEBUG //WriteLog(pk.ToStr()); #endif // 截取 var lines = pk.ReadBytes(0, p).ToStr().Split("\r\n"); // 重构 p += 4; pk.Set(pk.Data, pk.Offset + p, pk.Count - p); // 分析头部 headers.Clear(); var line = lines[0]; for (var i = 1; i < lines.Length; i++) { line = lines[i]; p = line.IndexOf(':'); if (p > 0) { headers[line.Substring(0, p)] = line.Substring(p + 1).Trim(); } } line = lines[0]; var ss = line.Split(" "); // 分析请求方法 GET / HTTP/1.1 if (ss.Length >= 3 && ss[2].StartsWithIgnoreCase("HTTP/")) { headers["Method"] = ss[0]; // 构造资源路径 var host = headers["Host"] + ""; var uri = "{0}://{1}".F("http", host); //var uri = "{0}://{1}".F(IsSSL ? "https" : "http", host); //if (host.IsNullOrEmpty() || !host.Contains(":")) //{ // var port = Local.Port; // if (IsSSL && port != 443 || !IsSSL && port != 80) uri += ":" + port; //} uri += ss[1]; headers["Url"] = new Uri(uri); } else { // 分析响应码 var code = ss[1].ToInt(); if (code > 0) { headers["StatusCode"] = (HttpStatusCode)code; } } return(headers); }