internal string UrlDecode(string value, Encoding encoding) { if (value == null) { return(null); } int length = value.Length; UrlDecoder decoder = new UrlDecoder(length, encoding); for (int i = 0; i < length; i++) { char ch = value[i]; if (ch == '+') { ch = ' '; } else if ((ch == '%') && (i < (length - 2))) { if ((value[i + 1] == 'u') && (i < (length - 5))) { int num3 = HttpEncoderUtility.HexToInt(value[i + 2]); int num4 = HttpEncoderUtility.HexToInt(value[i + 3]); int num5 = HttpEncoderUtility.HexToInt(value[i + 4]); int num6 = HttpEncoderUtility.HexToInt(value[i + 5]); if (((num3 < 0) || (num4 < 0)) || ((num5 < 0) || (num6 < 0))) { goto Label_010B; } ch = (char)((((num3 << 12) | (num4 << 8)) | (num5 << 4)) | num6); i += 5; decoder.AddChar(ch); continue; } int num7 = HttpEncoderUtility.HexToInt(value[i + 1]); int num8 = HttpEncoderUtility.HexToInt(value[i + 2]); if ((num7 >= 0) && (num8 >= 0)) { byte b = (byte)((num7 << 4) | num8); i += 2; decoder.AddByte(b); continue; } } Label_010B: if ((ch & 0xff80) == 0) { decoder.AddByte((byte)ch); } else { decoder.AddChar(ch); } } return(decoder.GetString()); }
internal static string CollapsePercentUFromStringInternal(string s, Encoding e) { int count = s.Length; UrlDecoder helper = new UrlDecoder(count, e); // go thorugh the string's chars collapsing just %uXXXX and // appending each char as char int loc = s.IndexOf("%u", StringComparison.Ordinal); if (loc == -1) { return(s); } for (int pos = 0; pos < count; pos++) { char ch = s[pos]; if (ch == '%' && pos < count - 5) { if (s[pos + 1] == 'u') { int h1 = HttpEncoderUtility.HexToInt(s[pos + 2]); int h2 = HttpEncoderUtility.HexToInt(s[pos + 3]); int h3 = HttpEncoderUtility.HexToInt(s[pos + 4]); int h4 = HttpEncoderUtility.HexToInt(s[pos + 5]); if (h1 >= 0 && h2 >= 0 && h3 >= 0 && h4 >= 0) //valid 4 hex chars { ch = (char)((h1 << 12) | (h2 << 8) | (h3 << 4) | h4); pos += 5; // add as char helper.AddChar(ch); continue; } } } if ((ch & 0xFF80) == 0) { helper.AddByte((byte)ch); // 7 bit have to go as bytes because of Unicode } else { helper.AddChar(ch); } } return(Utf16StringValidator.ValidateString(helper.GetString())); }
internal string UrlDecode(byte[] bytes, int offset, int count, Encoding encoding) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } UrlDecoder decoder = new UrlDecoder(count, encoding); for (int i = 0; i < count; i++) { int index = offset + i; byte b = bytes[index]; if (b == 0x2b) { b = 0x20; } else if ((b == 0x25) && (i < (count - 2))) { if ((bytes[index + 1] == 0x75) && (i < (count - 5))) { int num4 = HttpEncoderUtility.HexToInt((char)bytes[index + 2]); int num5 = HttpEncoderUtility.HexToInt((char)bytes[index + 3]); int num6 = HttpEncoderUtility.HexToInt((char)bytes[index + 4]); int num7 = HttpEncoderUtility.HexToInt((char)bytes[index + 5]); if (((num4 < 0) || (num5 < 0)) || ((num6 < 0) || (num7 < 0))) { goto Label_00E7; } char ch = (char)((((num4 << 12) | (num5 << 8)) | (num6 << 4)) | num7); i += 5; decoder.AddChar(ch); continue; } int num8 = HttpEncoderUtility.HexToInt((char)bytes[index + 1]); int num9 = HttpEncoderUtility.HexToInt((char)bytes[index + 2]); if ((num8 >= 0) && (num9 >= 0)) { b = (byte)((num8 << 4) | num9); i += 2; } } Label_00E7: decoder.AddByte(b); } return(decoder.GetString()); }
internal static byte[] UrlDecode(byte[] bytes, int offset, int count) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } int decodedBytesCount = 0; byte[] decodedBytes = new byte[count]; for (int i = 0; i < count; i++) { int pos = offset + i; byte b = bytes[pos]; if (b == '+') { b = (byte)' '; } else if (b == '%' && i < count - 2) { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 1]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); if (h1 >= 0 && h2 >= 0) { // valid 2 hex chars b = (byte)((h1 << 4) | h2); i += 2; } } decodedBytes[decodedBytesCount++] = b; } if (decodedBytesCount < decodedBytes.Length) { byte[] newDecodedBytes = new byte[decodedBytesCount]; Array.Copy(decodedBytes, newDecodedBytes, decodedBytesCount); decodedBytes = newDecodedBytes; } return(decodedBytes); }
internal byte[] UrlDecode(byte[] bytes, int offset, int count) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } int length = 0; byte[] sourceArray = new byte[count]; for (int i = 0; i < count; i++) { int index = offset + i; byte num4 = bytes[index]; if (num4 == 0x2b) { num4 = 0x20; } else if ((num4 == 0x25) && (i < (count - 2))) { int num5 = HttpEncoderUtility.HexToInt((char)bytes[index + 1]); int num6 = HttpEncoderUtility.HexToInt((char)bytes[index + 2]); if ((num5 >= 0) && (num6 >= 0)) { num4 = (byte)((num5 << 4) | num6); i += 2; } } sourceArray[length++] = num4; } if (length < sourceArray.Length) { byte[] destinationArray = new byte[length]; Array.Copy(sourceArray, destinationArray, length); sourceArray = destinationArray; } return(sourceArray); }
internal static string CollapsePercentUFromStringInternal(string s, Encoding e) { int length = s.Length; UrlDecoder decoder = new UrlDecoder(length, e); if (s.IndexOf("%u", StringComparison.Ordinal) == -1) { return(s); } for (int i = 0; i < length; i++) { char ch = s[i]; if (((ch == '%') && (i < (length - 5))) && (s[i + 1] == 'u')) { int num4 = HttpEncoderUtility.HexToInt(s[i + 2]); int num5 = HttpEncoderUtility.HexToInt(s[i + 3]); int num6 = HttpEncoderUtility.HexToInt(s[i + 4]); int num7 = HttpEncoderUtility.HexToInt(s[i + 5]); if (((num4 >= 0) && (num5 >= 0)) && ((num6 >= 0) && (num7 >= 0))) { ch = (char)((((num4 << 12) | (num5 << 8)) | (num6 << 4)) | num7); i += 5; decoder.AddChar(ch); continue; } } if ((ch & 0xff80) == 0) { decoder.AddByte((byte)ch); } else { decoder.AddChar(ch); } } return(decoder.GetString()); }
internal static string UrlDecode(string value, Encoding encoding) { if (value == null) { return(null); } int count = value.Length; UrlDecoder helper = new UrlDecoder(count, encoding); // go through the string's chars collapsing %XX and %uXXXX and // appending each char as char, with exception of %XX constructs // that are appended as bytes for (int pos = 0; pos < count; pos++) { char ch = value[pos]; if (ch == '+') { ch = ' '; } else if (ch == '%' && pos < count - 2) { if (value[pos + 1] == 'u' && pos < count - 5) { int h1 = HttpEncoderUtility.HexToInt(value[pos + 2]); int h2 = HttpEncoderUtility.HexToInt(value[pos + 3]); int h3 = HttpEncoderUtility.HexToInt(value[pos + 4]); int h4 = HttpEncoderUtility.HexToInt(value[pos + 5]); if (h1 >= 0 && h2 >= 0 && h3 >= 0 && h4 >= 0) { // valid 4 hex chars ch = (char)((h1 << 12) | (h2 << 8) | (h3 << 4) | h4); pos += 5; // only add as char helper.AddChar(ch); continue; } } else { int h1 = HttpEncoderUtility.HexToInt(value[pos + 1]); int h2 = HttpEncoderUtility.HexToInt(value[pos + 2]); if (h1 >= 0 && h2 >= 0) { // valid 2 hex chars byte b = (byte)((h1 << 4) | h2); pos += 2; // don't add as char helper.AddByte(b); continue; } } } if ((ch & 0xFF80) == 0) { helper.AddByte((byte)ch); // 7 bit have to go as bytes because of Unicode } else { helper.AddChar(ch); } } return(Utf16StringValidator.ValidateString(helper.GetString())); }
internal static string UrlDecode(byte[] bytes, int offset, int count, Encoding encoding) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } UrlDecoder helper = new UrlDecoder(count, encoding); // go through the bytes collapsing %XX and %uXXXX and appending // each byte as byte, with exception of %uXXXX constructs that // are appended as chars for (int i = 0; i < count; i++) { int pos = offset + i; byte b = bytes[pos]; // The code assumes that + and % cannot be in multibyte sequence if (b == '+') { b = (byte)' '; } else if (b == '%' && i < count - 2) { if (bytes[pos + 1] == 'u' && i < count - 5) { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 3]); int h3 = HttpEncoderUtility.HexToInt((char)bytes[pos + 4]); int h4 = HttpEncoderUtility.HexToInt((char)bytes[pos + 5]); if (h1 >= 0 && h2 >= 0 && h3 >= 0 && h4 >= 0) { // valid 4 hex chars char ch = (char)((h1 << 12) | (h2 << 8) | (h3 << 4) | h4); i += 5; // don't add as byte helper.AddChar(ch); continue; } } else { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 1]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); if (h1 >= 0 && h2 >= 0) { // valid 2 hex chars b = (byte)((h1 << 4) | h2); i += 2; } } } helper.AddByte(b); } return(Utf16StringValidator.ValidateString(helper.GetString())); }
internal static byte[] UrlDecode(byte[] bytes, int offset, int count) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } int decodedBytesCount = 0; byte[] decodedBytes = new byte[count]; for (int i = 0; i < count; i++) { int pos = offset + i; byte b = bytes[pos]; if (b == '+') { b = (byte)' '; } else if (b == '%' && i < count - 2) { if (bytes[pos + 1] == 'u' && i < count - 5) { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 3]); int h3 = HttpEncoderUtility.HexToInt((char)bytes[pos + 4]); int h4 = HttpEncoderUtility.HexToInt((char)bytes[pos + 5]); if (h1 >= 0 && h2 >= 0 && h3 >= 0 && h4 >= 0) { // valid 4 hex chars char ch = (char)((h1 << 12) | (h2 << 8) | (h3 << 4) | h4); i += 5; byte[] chBytes = Encoding.UTF8.GetBytes(new[] { ch }); if (chBytes.Length == 1) { b = chBytes[0]; } else { for (int j = 0; j < chBytes.Length - 1; j++) { decodedBytes[decodedBytesCount++] = chBytes[j]; } b = chBytes[chBytes.Length - 1]; } } } else { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 1]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); if (h1 >= 0 && h2 >= 0) { // valid 2 hex chars b = (byte)((h1 << 4) | h2); i += 2; } } } decodedBytes[decodedBytesCount++] = b; } if (decodedBytesCount < decodedBytes.Length) { byte[] newDecodedBytes = new byte[decodedBytesCount]; Array.Copy(decodedBytes, newDecodedBytes, decodedBytesCount); decodedBytes = newDecodedBytes; } return(decodedBytes); }