Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ UnescapeString() [2/5]

static unsafe void System.UriHelper.UnescapeString ( char * pStr,
int start,
int end,
ref System::Text::ValueStringBuilder dest,
char rsvd1,
char rsvd2,
char rsvd3,
UnescapeMode unescapeMode,
UriParser syntax,
bool isQuery )
inlinestaticpackage

Definition at line 287 of file UriHelper.cs.

288 {
289 if ((unescapeMode & UnescapeMode.EscapeUnescape) == 0)
290 {
291 dest.Append(pStr + start, end - start);
292 return;
293 }
294 bool flag = false;
295 bool flag2 = Uri.IriParsingStatic(syntax) && (unescapeMode & UnescapeMode.EscapeUnescape) == UnescapeMode.EscapeUnescape;
296 int i = start;
297 while (i < end)
298 {
299 char c = '\0';
300 for (; i < end; i++)
301 {
302 if ((c = pStr[i]) == '%')
303 {
304 if ((unescapeMode & UnescapeMode.Unescape) == 0)
305 {
306 flag = true;
307 break;
308 }
309 if (i + 2 < end)
310 {
311 c = DecodeHexChars(pStr[i + 1], pStr[i + 2]);
312 if (unescapeMode < UnescapeMode.UnescapeAll)
313 {
314 switch (c)
315 {
316 case '\uffff':
317 if ((unescapeMode & UnescapeMode.Escape) == 0)
318 {
319 continue;
320 }
321 flag = true;
322 break;
323 case '%':
324 i += 2;
325 continue;
326 default:
327 if (c == rsvd1 || c == rsvd2 || c == rsvd3)
328 {
329 i += 2;
330 continue;
331 }
332 if ((unescapeMode & UnescapeMode.V1ToStringFlag) == 0 && IsNotSafeForUnescape(c))
333 {
334 i += 2;
335 continue;
336 }
337 if (flag2 && ((c <= '\u009f' && IsNotSafeForUnescape(c)) || (c > '\u009f' && !IriHelper.CheckIriUnicodeRange(c, isQuery))))
338 {
339 i += 2;
340 continue;
341 }
342 break;
343 }
344 break;
345 }
346 if (c != '\uffff')
347 {
348 break;
349 }
350 if (unescapeMode >= UnescapeMode.UnescapeAllOrThrow)
351 {
352 throw new UriFormatException(System.SR.net_uri_BadString);
353 }
354 }
355 else
356 {
357 if (unescapeMode < UnescapeMode.UnescapeAll)
358 {
359 flag = true;
360 break;
361 }
362 if (unescapeMode >= UnescapeMode.UnescapeAllOrThrow)
363 {
364 throw new UriFormatException(System.SR.net_uri_BadString);
365 }
366 }
367 }
368 else if ((unescapeMode & (UnescapeMode.Unescape | UnescapeMode.UnescapeAll)) != (UnescapeMode.Unescape | UnescapeMode.UnescapeAll) && (unescapeMode & UnescapeMode.Escape) != 0)
369 {
370 if (c == rsvd1 || c == rsvd2 || c == rsvd3)
371 {
372 flag = true;
373 break;
374 }
375 if ((unescapeMode & UnescapeMode.V1ToStringFlag) == 0 && (c <= '\u001f' || (c >= '\u007f' && c <= '\u009f')))
376 {
377 flag = true;
378 break;
379 }
380 }
381 }
382 while (start < i)
383 {
384 dest.Append(pStr[start++]);
385 }
386 if (i != end)
387 {
388 if (flag)
389 {
390 EscapeAsciiChar((byte)pStr[i], ref dest);
391 flag = false;
392 i++;
393 }
394 else if (c <= '\u007f')
395 {
396 dest.Append(c);
397 i += 3;
398 }
399 else
400 {
401 int num = PercentEncodingHelper.UnescapePercentEncodedUTF8Sequence(pStr + i, end - i, ref dest, isQuery, flag2);
402 i += num;
403 }
404 start = i;
405 }
406 }
407 }
static string net_uri_BadString
Definition SR.cs:30
Definition SR.cs:7
static bool IsNotSafeForUnescape(char ch)
Definition UriHelper.cs:426
static void EscapeAsciiChar(byte b, ref System.Text.ValueStringBuilder to)
Definition UriHelper.cs:409
static char DecodeHexChars(int first, int second)
Definition UriHelper.cs:415

References System.IriHelper.CheckIriUnicodeRange(), System.UriHelper.DecodeHexChars(), System.UriHelper.EscapeAsciiChar(), System.Uri.IriParsingStatic(), System.UriHelper.IsNotSafeForUnescape(), System.SR.net_uri_BadString, System.start, and System.PercentEncodingHelper.UnescapePercentEncodedUTF8Sequence().