using System;
using System.Text;
using System.IO;
namespace IFramework.Net.Http
{
public class HttpHeader
{
public string Protocol { get; set; } = "HTTP/1.1";
public HttpOption Option { get; set; }
public string RelativeUri { get; set; } = "/";
public string Host { get; set; }
public string Connection { get; set; }
public string UserAgent { get; set; }
public string Accept { get; set; }
public string CacheControl { get; set; }
public string ContentType { get; set; }
public string AcceptEncoding { get; set; }
public string AcceptLanguage { get; set; }
public string Referer { get; set; }
public string Cookie { get; set; }
public string SecFetchUser { get; set; }
public string SecFetchMode { get; set; }
public string SecFetchSite { get; set; }
public string SecFetchDest { get; set; }
///
/// extend reserve
///
public string Extensions { get; set; }
///
/// do not track
///
public string DNT { get; set; }
public long StreamPosition { get; private set; }
public long ContentLength { get; set; }
public HttpHeader(string httpContent)
{
string[] lines = httpContent.Split('\n');
GetHeaderLine(lines[0]);
for(int i = 1; i < lines.Length; ++i)
{
if (lines[i] == string.Empty) break;
GetHeader(lines[i]);
}
}
public HttpHeader(SegmentOffset segment)
{
using (MemoryStream ms = new MemoryStream(segment.buffer, segment.offset, segment.size))
using (StreamReader reader = new StreamReader(ms, Encoding.UTF8))
{
string line = reader.ReadLine();// first line
GetHeaderLine(line);
while ((line=reader.ReadLine()) != null)
{
if (line == string.Empty)
{
ContentLength = ms.Length - ms.Position;
StreamPosition = ms.Position;
break;
}
GetHeader(line);
}
}
}
#if NET_VERSION_4_5
[MethodImpl(MethodImplOptions.AggressiveInlining)]
#endif
protected void GetHeaderLine(string line)
{
var ops = line.Split(' ');
Option = (HttpOption)Enum.Parse(typeof(HttpOption), ops[0]);
RelativeUri = ops[1];
Protocol = ops[2];
}
public string ToHeaderString(HttpStatusCode httpStatusCode)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat("{0} {1} {2}", Protocol, ((int)httpStatusCode), httpStatusCode.ToString());
builder.AppendLine();
builder.AppendLine("Cache-Control:"+CacheControl);
builder.AppendLine("Connection:"+Connection);
//builder.AppendLine("Content-Encoding:"+ AcceptEncoding);
builder.AppendLine("Content-Type:" + ContentType);
builder.AppendLine("Date:" + DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss"));
if (string.IsNullOrEmpty(Extensions) == false)
builder.AppendLine(Extensions);
builder.AppendLine();
return builder.ToString();
}
private void GetHeader(string line)
{
string[] dics = line.Split(':');
if (dics.Length <= 1) return;
switch (dics[0])
{
case "Host":Host = dics[1]; break;
case "Connection": Connection = dics[1];break;
case "DNT": DNT = dics[1]; break;
case "Accept": Accept = dics[1]; break;
case "Referer": Referer = dics[1]; break;
case "Cookie": Cookie = dics[1]; break;
case "User-Agent": UserAgent = dics[1]; break;
case "Cache-Control": CacheControl = dics[1]; break;
case "Accept-Encoding": AcceptEncoding = dics[1]; break;
case "Accept-Language": AcceptLanguage = dics[1]; break;
case "Sec-Fetch-User": SecFetchUser = dics[1]; break;
case "Sec-Fetch-Mode": SecFetchMode = dics[1]; break;
case "Sec-Fetch-Site": SecFetchSite = dics[1]; break;
case "Sec-Fetch-Dest": SecFetchDest = dics[1]; break;
default: Extensions += dics[1];break;
}
}
}
public enum HttpOption
{
GET,
POST,
PUT,
DELETE,
HEAD,
TRACE,
PATCH,
OPTIONS
}
}