Terraria
v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
HeaderDescriptor.cs
Go to the documentation of this file.
1
using
System.Buffers
;
2
using
System.Diagnostics.CodeAnalysis
;
3
using
System.Text
;
4
using
System.Text.Unicode
;
5
6
namespace
System.Net.Http.Headers
;
7
8
internal
readonly
struct
HeaderDescriptor
:
IEquatable
<HeaderDescriptor>
9
{
10
private
readonly
string
_headerName
;
11
12
private
readonly
KnownHeader
_knownHeader
;
13
14
public
string
Name
=>
_headerName
;
15
16
public
HttpHeaderParser
Parser
=>
_knownHeader
?.
Parser
;
17
18
public
HttpHeaderType
HeaderType
19
{
20
get
21
{
22
if
(
_knownHeader
!=
null
)
23
{
24
return
_knownHeader
.
HeaderType
;
25
}
26
return
HttpHeaderType
.Custom;
27
}
28
}
29
30
public
KnownHeader
KnownHeader
=>
_knownHeader
;
31
32
public
HeaderDescriptor
(
KnownHeader
knownHeader)
33
{
34
_knownHeader
= knownHeader;
35
_headerName
= knownHeader.
Name
;
36
}
37
38
internal
HeaderDescriptor
(
string
headerName)
39
{
40
_headerName
= headerName;
41
_knownHeader
=
null
;
42
}
43
44
public
bool
Equals
(
HeaderDescriptor
other
)
45
{
46
if
(
_knownHeader
!=
null
)
47
{
48
return
_knownHeader
==
other
._knownHeader;
49
}
50
return
string
.Equals(
_headerName
,
other
._headerName,
StringComparison
.OrdinalIgnoreCase);
51
}
52
53
public
override
int
GetHashCode
()
54
{
55
return
_knownHeader
?.GetHashCode() ??
StringComparer
.
OrdinalIgnoreCase
.GetHashCode(
_headerName
);
56
}
57
58
public
override
bool
Equals
(
object
obj
)
59
{
60
throw
new
InvalidOperationException
();
61
}
62
63
public
static
bool
TryGet
(
string
headerName, out
HeaderDescriptor
descriptor)
64
{
65
KnownHeader
knownHeader =
KnownHeaders
.
TryGetKnownHeader
(headerName);
66
if
(knownHeader !=
null
)
67
{
68
descriptor =
new
HeaderDescriptor
(knownHeader);
69
return
true
;
70
}
71
if
(!
HttpRuleParser
.
IsToken
(headerName))
72
{
73
descriptor =
default
(
HeaderDescriptor
);
74
return
false
;
75
}
76
descriptor =
new
HeaderDescriptor
(headerName);
77
return
true
;
78
}
79
80
public
static
bool
TryGet
(
ReadOnlySpan<byte>
headerName, out
HeaderDescriptor
descriptor)
81
{
82
KnownHeader
knownHeader =
KnownHeaders
.
TryGetKnownHeader
(headerName);
83
if
(knownHeader !=
null
)
84
{
85
descriptor =
new
HeaderDescriptor
(knownHeader);
86
return
true
;
87
}
88
if
(!
HttpRuleParser
.
IsToken
(headerName))
89
{
90
descriptor =
default
(
HeaderDescriptor
);
91
return
false
;
92
}
93
descriptor =
new
HeaderDescriptor
(
HttpRuleParser
.
GetTokenString
(headerName));
94
return
true
;
95
}
96
97
internal
static
bool
TryGetStaticQPackHeader
(
int
index
, out
HeaderDescriptor
descriptor, [NotNullWhen(
true
)] out
string
knownValue)
98
{
99
(
HeaderDescriptor
,
string
)[] headerLookup =
QPackStaticTable
.
HeaderLookup
;
100
if
((uint)
index
< (uint)headerLookup.Length)
101
{
102
(descriptor, knownValue) = headerLookup[
index
];
103
return
true
;
104
}
105
descriptor =
default
(
HeaderDescriptor
);
106
knownValue =
null
;
107
return
false
;
108
}
109
110
public
HeaderDescriptor
AsCustomHeader
()
111
{
112
return
new
HeaderDescriptor
(
_knownHeader
.
Name
);
113
}
114
115
public
string
GetHeaderValue
(
ReadOnlySpan<byte>
headerValue,
Encoding
valueEncoding)
116
{
117
if
(headerValue.
Length
== 0)
118
{
119
return
string
.Empty;
120
}
121
if
(
_knownHeader
!=
null
)
122
{
123
string
[] knownValues =
_knownHeader
.
KnownValues
;
124
if
(knownValues !=
null
)
125
{
126
for
(
int
i = 0; i < knownValues.Length; i++)
127
{
128
if
(
ByteArrayHelpers
.
EqualsOrdinalAsciiIgnoreCase
(knownValues[i], headerValue))
129
{
130
return
knownValues[i];
131
}
132
}
133
}
134
string
decoded;
135
if
(
_knownHeader
==
KnownHeaders
.
ContentType
)
136
{
137
string
knownContentType =
GetKnownContentType
(headerValue);
138
if
(knownContentType !=
null
)
139
{
140
return
knownContentType;
141
}
142
}
143
else
if
(
_knownHeader
==
KnownHeaders
.
Location
&&
TryDecodeUtf8
(headerValue, out decoded))
144
{
145
return
decoded;
146
}
147
}
148
return
(valueEncoding ??
HttpRuleParser
.
DefaultHttpEncoding
).GetString(headerValue);
149
}
150
151
internal
static
string
GetKnownContentType
(
ReadOnlySpan<byte>
contentTypeValue)
152
{
153
string
text
=
null
;
154
switch
(contentTypeValue.
Length
)
155
{
156
case
8:
157
switch
(contentTypeValue[7] | 0x20)
158
{
159
case
108:
160
text
=
"text/xml"
;
161
break
;
162
case
115:
163
text
=
"text/css"
;
164
break
;
165
case
118:
166
text
=
"text/csv"
;
167
break
;
168
}
169
break
;
170
case
9:
171
switch
(contentTypeValue[6] | 0x20)
172
{
173
case
103:
174
text
=
"image/gif"
;
175
break
;
176
case
112:
177
text
=
"image/png"
;
178
break
;
179
case
116:
180
text
=
"text/html"
;
181
break
;
182
}
183
break
;
184
case
10:
185
switch
(contentTypeValue[0] | 0x20)
186
{
187
case
116:
188
text
=
"text/plain"
;
189
break
;
190
case
105:
191
text
=
"image/jpeg"
;
192
break
;
193
}
194
break
;
195
case
15:
196
switch
(contentTypeValue[12] | 0x20)
197
{
198
case
112:
199
text
=
"application/pdf"
;
200
break
;
201
case
120:
202
text
=
"application/xml"
;
203
break
;
204
case
122:
205
text
=
"application/zip"
;
206
break
;
207
}
208
break
;
209
case
16:
210
switch
(contentTypeValue[12] | 0x20)
211
{
212
case
103:
213
text
=
"application/grpc"
;
214
break
;
215
case
106:
216
text
=
"application/json"
;
217
break
;
218
}
219
break
;
220
case
19:
221
text
=
"multipart/form-data"
;
222
break
;
223
case
22:
224
text
=
"application/javascript"
;
225
break
;
226
case
24:
227
switch
(contentTypeValue[0] | 0x20)
228
{
229
case
97:
230
text
=
"application/octet-stream"
;
231
break
;
232
case
116:
233
text
=
"text/html; charset=utf-8"
;
234
break
;
235
}
236
break
;
237
case
25:
238
text
=
"text/plain; charset=utf-8"
;
239
break
;
240
case
31:
241
text
=
"application/json; charset=utf-8"
;
242
break
;
243
case
33:
244
text
=
"application/x-www-form-urlencoded"
;
245
break
;
246
}
247
if
(
text
==
null
|| !
ByteArrayHelpers
.
EqualsOrdinalAsciiIgnoreCase
(
text
, contentTypeValue))
248
{
249
return
null
;
250
}
251
return
text
;
252
}
253
254
private
static
bool
TryDecodeUtf8
(
ReadOnlySpan<byte>
input
, [NotNullWhen(
true
)] out
string
decoded)
255
{
256
char
[]
array
=
ArrayPool<char>
.
Shared
.Rent(
input
.Length);
257
try
258
{
259
if
(
Utf8
.
ToUtf16
(
input
,
array
, out var _, out var charsWritten, replaceInvalidSequences:
false
) ==
OperationStatus
.Done)
260
{
261
decoded =
new
string
(
array
, 0, charsWritten);
262
return
true
;
263
}
264
}
265
finally
266
{
267
ArrayPool<char>
.
Shared
.Return(
array
);
268
}
269
decoded =
null
;
270
return
false
;
271
}
272
}
System.Buffers.ArrayPool.Shared
static ArrayPool< T > Shared
Definition
ArrayPool.cs:7
System.Buffers.ArrayPool
Definition
ArrayPool.cs:4
System.ByteArrayHelpers.EqualsOrdinalAsciiIgnoreCase
static bool EqualsOrdinalAsciiIgnoreCase(string left, ReadOnlySpan< byte > right)
Definition
ByteArrayHelpers.cs:5
System.ByteArrayHelpers
Definition
ByteArrayHelpers.cs:4
System.InvalidOperationException
Definition
InvalidOperationException.cs:9
System.Net.Http.Headers.HttpHeaderParser
Definition
HttpHeaderParser.cs:8
System.Net.Http.Headers.KnownHeader.KnownValues
string[] KnownValues
Definition
KnownHeader.cs:16
System.Net.Http.Headers.KnownHeader.HeaderType
HttpHeaderType HeaderType
Definition
KnownHeader.cs:14
System.Net.Http.Headers.KnownHeader.Parser
HttpHeaderParser Parser
Definition
KnownHeader.cs:12
System.Net.Http.Headers.KnownHeader.Name
string Name
Definition
KnownHeader.cs:10
System.Net.Http.Headers.KnownHeader
Definition
KnownHeader.cs:9
System.Net.Http.Headers.KnownHeaders.ContentType
static readonly KnownHeader ContentType
Definition
KnownHeaders.cs:101
System.Net.Http.Headers.KnownHeaders.TryGetKnownHeader
static KnownHeader TryGetKnownHeader(string name)
Definition
KnownHeaders.cs:548
System.Net.Http.Headers.KnownHeaders.Location
static readonly KnownHeader Location
Definition
KnownHeaders.cs:143
System.Net.Http.Headers.KnownHeaders
Definition
KnownHeaders.cs:6
System.Net.Http.Headers.QPackStaticTable.HeaderLookup
static HeaderDescriptor string value[] HeaderLookup
Definition
QPackStaticTable.cs:5
System.Net.Http.Headers.QPackStaticTable
Definition
QPackStaticTable.cs:4
System.Net.Http.HttpRuleParser.GetTokenString
static string GetTokenString(ReadOnlySpan< byte > input)
Definition
HttpRuleParser.cs:87
System.Net.Http.HttpRuleParser.IsToken
static bool IsToken(string input)
Definition
HttpRuleParser.cs:63
System.Net.Http.HttpRuleParser.DefaultHttpEncoding
static Encoding DefaultHttpEncoding
Definition
HttpRuleParser.cs:9
System.Net.Http.HttpRuleParser
Definition
HttpRuleParser.cs:6
System.StringComparer.OrdinalIgnoreCase
static StringComparer OrdinalIgnoreCase
Definition
StringComparer.cs:23
System.StringComparer
Definition
StringComparer.cs:12
System.Text.Encoding
Definition
Encoding.cs:15
System.Text.Unicode.Utf8.ToUtf16
static unsafe OperationStatus ToUtf16(ReadOnlySpan< byte > source, Span< char > destination, out int bytesRead, out int charsWritten, bool replaceInvalidSequences=true, bool isFinalBlock=true)
Definition
Utf8.cs:54
System.Text.Unicode.Utf8
Definition
Utf8.cs:8
string
System.IEquatable
Definition
IEquatable.cs:4
System.Buffers.OperationStatus
OperationStatus
Definition
OperationStatus.cs:4
System.Buffers
Definition
Base64.cs:7
System.Diagnostics.CodeAnalysis
Definition
AllowNullAttribute.cs:1
System.Net.Http.Headers.HttpHeaderType
HttpHeaderType
Definition
HttpHeaderType.cs:5
System.Net.Http.Headers
Definition
AltSvcHeaderParser.cs:4
System.Text.Unicode
Definition
GraphemeClusterBreakType.cs:1
System.Text
Definition
ConsoleEncoding.cs:1
System.ExceptionArgument.text
@ text
System.ExceptionArgument.index
@ index
System.ExceptionArgument.other
@ other
System.ExceptionArgument.input
@ input
System.ExceptionArgument.obj
@ obj
System.ExceptionArgument.array
@ array
System.StringComparison
StringComparison
Definition
StringComparison.cs:4
System.Net.Http.Headers.HeaderDescriptor.HeaderType
HttpHeaderType HeaderType
Definition
HeaderDescriptor.cs:19
System.Net.Http.Headers.HeaderDescriptor.GetHashCode
override int GetHashCode()
Definition
HeaderDescriptor.cs:53
System.Net.Http.Headers.HeaderDescriptor.Parser
HttpHeaderParser Parser
Definition
HeaderDescriptor.cs:16
System.Net.Http.Headers.HeaderDescriptor.Equals
override bool Equals(object obj)
Definition
HeaderDescriptor.cs:58
System.Net.Http.Headers.HeaderDescriptor.TryGetStaticQPackHeader
static bool TryGetStaticQPackHeader(int index, out HeaderDescriptor descriptor, [NotNullWhen(true)] out string knownValue)
Definition
HeaderDescriptor.cs:97
System.Net.Http.Headers.HeaderDescriptor.AsCustomHeader
HeaderDescriptor AsCustomHeader()
Definition
HeaderDescriptor.cs:110
System.Net.Http.Headers.HeaderDescriptor.HeaderDescriptor
HeaderDescriptor(string headerName)
Definition
HeaderDescriptor.cs:38
System.Net.Http.Headers.HeaderDescriptor.Name
string Name
Definition
HeaderDescriptor.cs:14
System.Net.Http.Headers.HeaderDescriptor.TryGet
static bool TryGet(ReadOnlySpan< byte > headerName, out HeaderDescriptor descriptor)
Definition
HeaderDescriptor.cs:80
System.Net.Http.Headers.HeaderDescriptor.TryGet
static bool TryGet(string headerName, out HeaderDescriptor descriptor)
Definition
HeaderDescriptor.cs:63
System.Net.Http.Headers.HeaderDescriptor.GetKnownContentType
static string GetKnownContentType(ReadOnlySpan< byte > contentTypeValue)
Definition
HeaderDescriptor.cs:151
System.Net.Http.Headers.HeaderDescriptor.HeaderDescriptor
HeaderDescriptor(KnownHeader knownHeader)
Definition
HeaderDescriptor.cs:32
System.Net.Http.Headers.HeaderDescriptor._knownHeader
readonly KnownHeader _knownHeader
Definition
HeaderDescriptor.cs:12
System.Net.Http.Headers.HeaderDescriptor.TryDecodeUtf8
static bool TryDecodeUtf8(ReadOnlySpan< byte > input, [NotNullWhen(true)] out string decoded)
Definition
HeaderDescriptor.cs:254
System.Net.Http.Headers.HeaderDescriptor.GetHeaderValue
string GetHeaderValue(ReadOnlySpan< byte > headerValue, Encoding valueEncoding)
Definition
HeaderDescriptor.cs:115
System.Net.Http.Headers.HeaderDescriptor._headerName
readonly string _headerName
Definition
HeaderDescriptor.cs:10
System.Net.Http.Headers.HeaderDescriptor.Equals
bool Equals(HeaderDescriptor other)
Definition
HeaderDescriptor.cs:44
System.Net.Http.Headers.HeaderDescriptor
Definition
HeaderDescriptor.cs:9
System.ReadOnlySpan.Length
int Length
Definition
ReadOnlySpan.cs:70
System.ReadOnlySpan
Definition
ReadOnlySpan.cs:14
source
System.Net.Http
System.Net.Http.Headers
HeaderDescriptor.cs
Generated by
1.10.0