This repository has been archived by the owner on Jul 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 597
/
HttpHeader.cs
144 lines (113 loc) · 3.91 KB
/
HttpHeader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System;
using System.Net;
using System.Text;
using Titanium.Web.Proxy.Extensions;
using Titanium.Web.Proxy.Http;
namespace Titanium.Web.Proxy.Models;
/// <summary>
/// Http Header object used by proxy
/// </summary>
public class HttpHeader
{
/// <summary>
/// HPACK: Header Compression for HTTP/2
/// Section 4.1. Calculating Table Size
/// The additional 32 octets account for an estimated overhead associated with an entry.
/// </summary>
public const int HttpHeaderOverhead = 32;
#if NET6_0_OR_GREATER
internal static Version VersionUnknown => HttpVersion.Unknown;
#else
internal static Version VersionUnknown { get; } = new(0, 0);
#endif
internal static Version Version10 => HttpVersion.Version10;
internal static Version Version11 => HttpVersion.Version11;
#if NET6_0_OR_GREATER
internal static Version Version20 => HttpVersion.Version20;
#else
internal static Version Version20 { get; } = new(2, 0);
#endif
internal static readonly Encoding DefaultEncoding = Encoding.GetEncoding("ISO-8859-1");
public static Encoding Encoding => DefaultEncoding;
internal static readonly HttpHeader ProxyConnectionKeepAlive = new("Proxy-Connection", "keep-alive");
private string? nameString;
private string? valueString;
/// <summary>
/// Initialize a new instance.
/// </summary>
/// <param name="name">Header name.</param>
/// <param name="value">Header value.</param>
public HttpHeader(string name, string value)
{
if (string.IsNullOrEmpty(name)) throw new Exception("Name cannot be null or empty");
nameString = name.Trim();
NameData = nameString.GetByteString();
valueString = value.Trim();
ValueData = valueString.GetByteString();
}
internal HttpHeader(KnownHeader name, string value)
{
nameString = name.String;
NameData = name.String8;
valueString = value.Trim();
ValueData = valueString.GetByteString();
}
internal HttpHeader(KnownHeader name, KnownHeader value)
{
nameString = name.String;
NameData = name.String8;
valueString = value.String;
ValueData = value.String8;
}
internal HttpHeader(ByteString name, ByteString value)
{
if (name.Length == 0) throw new Exception("Name cannot be empty");
NameData = name;
ValueData = value;
}
private protected HttpHeader(ByteString name, ByteString value, bool headerEntry)
{
// special header entry created in inherited class with empty name
NameData = name;
ValueData = value;
}
/// <summary>
/// Header Name.
/// </summary>
public string Name => nameString ??= NameData.GetString();
internal ByteString NameData { get; }
/// <summary>
/// Header Value.
/// </summary>
public string Value => valueString ??= ValueData.GetString();
internal ByteString ValueData { get; private set; }
public int Size => Name.Length + Value.Length + HttpHeaderOverhead;
internal static int SizeOf(ByteString name, ByteString value)
{
return name.Length + value.Length + HttpHeaderOverhead;
}
internal void SetValue(string value)
{
valueString = value;
ValueData = value.GetByteString();
}
internal void SetValue(KnownHeader value)
{
valueString = value.String;
ValueData = value.String8;
}
/// <summary>
/// Returns header as a valid header string.
/// </summary>
/// <returns></returns>
public override string ToString()
{
return $"{Name}: {Value}";
}
internal static HttpHeader GetProxyAuthorizationHeader(string? userName, string? password)
{
var result = new HttpHeader(KnownHeaders.ProxyAuthorization,
"Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")));
return result;
}
}