Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ContentRangeHeaderValue.cs
Go to the documentation of this file.
2using System.Text;
3
5
7{
8 private string _unit;
9
10 private long? _from;
11
12 private long? _to;
13
14 private long? _length;
15
16 public string Unit
17 {
18 get
19 {
20 return _unit;
21 }
22 set
23 {
25 _unit = value;
26 }
27 }
28
29 public long? From => _from;
30
31 public long? To => _to;
32
33 public long? Length => _length;
34
35 public bool HasLength => _length.HasValue;
36
37 public bool HasRange => _from.HasValue;
38
39 public ContentRangeHeaderValue(long from, long to, long length)
40 {
41 if (length < 0)
42 {
43 throw new ArgumentOutOfRangeException("length");
44 }
45 if (to < 0 || to > length)
46 {
47 throw new ArgumentOutOfRangeException("to");
48 }
49 if (from < 0 || from > to)
50 {
51 throw new ArgumentOutOfRangeException("from");
52 }
53 _from = from;
54 _to = to;
56 _unit = "bytes";
57 }
58
60 {
61 if (length < 0)
62 {
63 throw new ArgumentOutOfRangeException("length");
64 }
66 _unit = "bytes";
67 }
68
69 public ContentRangeHeaderValue(long from, long to)
70 {
71 if (to < 0)
72 {
73 throw new ArgumentOutOfRangeException("to");
74 }
75 if (from < 0 || from > to)
76 {
77 throw new ArgumentOutOfRangeException("from");
78 }
79 _from = from;
80 _to = to;
81 _unit = "bytes";
82 }
83
85 {
86 }
87
89 {
90 _from = source._from;
91 _to = source._to;
92 _length = source._length;
93 _unit = source._unit;
94 }
95
96 public override bool Equals([NotNullWhen(true)] object? obj)
97 {
98 if (!(obj is ContentRangeHeaderValue contentRangeHeaderValue))
99 {
100 return false;
101 }
102 if (_from == contentRangeHeaderValue._from && _to == contentRangeHeaderValue._to && _length == contentRangeHeaderValue._length)
103 {
104 return string.Equals(_unit, contentRangeHeaderValue._unit, StringComparison.OrdinalIgnoreCase);
105 }
106 return false;
107 }
108
109 public override int GetHashCode()
110 {
111 int num = StringComparer.OrdinalIgnoreCase.GetHashCode(_unit);
112 if (HasRange)
113 {
114 num = num ^ _from.GetHashCode() ^ _to.GetHashCode();
115 }
116 if (HasLength)
117 {
118 num ^= _length.GetHashCode();
119 }
120 return num;
121 }
122
123 public override string ToString()
124 {
126 stringBuilder.Append(_unit);
127 stringBuilder.Append(' ');
128 if (HasRange)
129 {
130 stringBuilder.Append(_from.Value);
131 stringBuilder.Append('-');
132 stringBuilder.Append(_to.Value);
133 }
134 else
135 {
136 stringBuilder.Append('*');
137 }
138 stringBuilder.Append('/');
139 if (HasLength)
140 {
141 stringBuilder.Append(_length.Value);
142 }
143 else
144 {
145 stringBuilder.Append('*');
146 }
148 }
149
150 public static ContentRangeHeaderValue Parse(string? input)
151 {
152 int index = 0;
154 }
155
156 public static bool TryParse([NotNullWhen(true)] string? input, [NotNullWhen(true)] out ContentRangeHeaderValue? parsedValue)
157 {
158 int index = 0;
159 parsedValue = null;
160 if (GenericHeaderParser.ContentRangeParser.TryParseValue(input, null, ref index, out var parsedValue2))
161 {
162 parsedValue = (ContentRangeHeaderValue)parsedValue2;
163 return true;
164 }
165 return false;
166 }
167
168 internal static int GetContentRangeLength(string input, int startIndex, out object parsedValue)
169 {
170 parsedValue = null;
171 if (string.IsNullOrEmpty(input) || startIndex >= input.Length)
172 {
173 return 0;
174 }
175 int tokenLength = HttpRuleParser.GetTokenLength(input, startIndex);
176 if (tokenLength == 0)
177 {
178 return 0;
179 }
180 string unit = input.Substring(startIndex, tokenLength);
181 int num = startIndex + tokenLength;
182 int whitespaceLength = HttpRuleParser.GetWhitespaceLength(input, num);
183 if (whitespaceLength == 0)
184 {
185 return 0;
186 }
187 num += whitespaceLength;
188 if (num == input.Length)
189 {
190 return 0;
191 }
192 int fromStartIndex = num;
193 int fromLength = 0;
194 int toStartIndex = 0;
195 int toLength = 0;
196 if (!TryGetRangeLength(input, ref num, out fromLength, out toStartIndex, out toLength))
197 {
198 return 0;
199 }
200 if (num == input.Length || input[num] != '/')
201 {
202 return 0;
203 }
204 num++;
206 if (num == input.Length)
207 {
208 return 0;
209 }
210 int lengthStartIndex = num;
211 int lengthLength = 0;
212 if (!TryGetLengthLength(input, ref num, out lengthLength))
213 {
214 return 0;
215 }
216 if (!TryCreateContentRange(input, unit, fromStartIndex, fromLength, toStartIndex, toLength, lengthStartIndex, lengthLength, out parsedValue))
217 {
218 return 0;
219 }
220 return num - startIndex;
221 }
222
223 private static bool TryGetLengthLength(string input, ref int current, out int lengthLength)
224 {
225 lengthLength = 0;
226 if (input[current] == '*')
227 {
228 current++;
229 }
230 else
231 {
232 lengthLength = HttpRuleParser.GetNumberLength(input, current, allowDecimal: false);
233 if (lengthLength == 0 || lengthLength > 19)
234 {
235 return false;
236 }
237 current += lengthLength;
238 }
239 current += HttpRuleParser.GetWhitespaceLength(input, current);
240 return true;
241 }
242
243 private static bool TryGetRangeLength(string input, ref int current, out int fromLength, out int toStartIndex, out int toLength)
244 {
245 fromLength = 0;
246 toStartIndex = 0;
247 toLength = 0;
248 if (input[current] == '*')
249 {
250 current++;
251 }
252 else
253 {
254 fromLength = HttpRuleParser.GetNumberLength(input, current, allowDecimal: false);
255 if (fromLength == 0 || fromLength > 19)
256 {
257 return false;
258 }
259 current += fromLength;
260 current += HttpRuleParser.GetWhitespaceLength(input, current);
261 if (current == input.Length || input[current] != '-')
262 {
263 return false;
264 }
265 current++;
266 current += HttpRuleParser.GetWhitespaceLength(input, current);
267 if (current == input.Length)
268 {
269 return false;
270 }
271 toStartIndex = current;
272 toLength = HttpRuleParser.GetNumberLength(input, current, allowDecimal: false);
273 if (toLength == 0 || toLength > 19)
274 {
275 return false;
276 }
277 current += toLength;
278 }
279 current += HttpRuleParser.GetWhitespaceLength(input, current);
280 return true;
281 }
282
283 private static bool TryCreateContentRange(string input, string unit, int fromStartIndex, int fromLength, int toStartIndex, int toLength, int lengthStartIndex, int lengthLength, [NotNullWhen(true)] out object parsedValue)
284 {
285 parsedValue = null;
286 long result = 0L;
287 if (fromLength > 0 && !HeaderUtilities.TryParseInt64(input, fromStartIndex, fromLength, out result))
288 {
289 return false;
290 }
291 long result2 = 0L;
292 if (toLength > 0 && !HeaderUtilities.TryParseInt64(input, toStartIndex, toLength, out result2))
293 {
294 return false;
295 }
296 if (fromLength > 0 && toLength > 0 && result > result2)
297 {
298 return false;
299 }
300 long result3 = 0L;
301 if (lengthLength > 0 && !HeaderUtilities.TryParseInt64(input, lengthStartIndex, lengthLength, out result3))
302 {
303 return false;
304 }
305 if (toLength > 0 && lengthLength > 0 && result2 >= result3)
306 {
307 return false;
308 }
309 ContentRangeHeaderValue contentRangeHeaderValue = new ContentRangeHeaderValue();
310 contentRangeHeaderValue._unit = unit;
311 if (fromLength > 0)
312 {
313 contentRangeHeaderValue._from = result;
314 contentRangeHeaderValue._to = result2;
315 }
316 if (lengthLength > 0)
317 {
318 contentRangeHeaderValue._length = result3;
319 }
320 parsedValue = contentRangeHeaderValue;
321 return true;
322 }
323
325 {
326 return new ContentRangeHeaderValue(this);
327 }
328}
override bool Equals([NotNullWhen(true)] object? obj)
static ContentRangeHeaderValue Parse(string? input)
static bool TryParse([NotNullWhen(true)] string? input, [NotNullWhen(true)] out ContentRangeHeaderValue? parsedValue)
static bool TryGetRangeLength(string input, ref int current, out int fromLength, out int toStartIndex, out int toLength)
static bool TryGetLengthLength(string input, ref int current, out int lengthLength)
static bool TryCreateContentRange(string input, string unit, int fromStartIndex, int fromLength, int toStartIndex, int toLength, int lengthStartIndex, int lengthLength, [NotNullWhen(true)] out object parsedValue)
static int GetContentRangeLength(string input, int startIndex, out object parsedValue)
ContentRangeHeaderValue(long from, long to, long length)
static readonly GenericHeaderParser ContentRangeParser
static bool TryParseInt64(string value, int offset, int length, out long result)
static void CheckValidToken(string value, string parameterName)
static int GetTokenLength(string input, int startIndex)
static int GetWhitespaceLength(string input, int startIndex)
static int GetNumberLength(string input, int startIndex, bool allowDecimal)
static StringComparer OrdinalIgnoreCase
static string GetStringAndRelease(StringBuilder sb)
static StringBuilder Acquire(int capacity=16)
StringBuilder Append(char value, int repeatCount)