Mega Code Archive

 
Categories / C# / Network
 

Url Encode

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Pulse.Base {     public class HttpUtility     {         public static string UrlEncode(byte[] bytes)         {             if (bytes == null)             {                 return null;             }             return Encoding.ASCII.GetString(UrlEncodeToBytes(bytes));         }         public static string UrlEncode(string str)         {             if (str == null)             {                 return null;             }             return UrlEncode(str, Encoding.UTF8);         }         public static string UrlEncode(string str, Encoding e)         {             if (str == null)             {                 return null;             }             return Encoding.ASCII.GetString(UrlEncodeToBytes(str, e));         }         public static string UrlEncode(byte[] bytes, int offset, int count)         {             if (bytes == null)             {                 return null;             }             return Encoding.ASCII.GetString(UrlEncodeToBytes(bytes, offset, count));         }         public static byte[] UrlEncodeToBytes(string str, Encoding e)         {             if (str == null)             {                 return null;             }             byte[] bytes = e.GetBytes(str);             return UrlEncodeBytesToBytesInternal(bytes, 0, bytes.Length, false);         }         public static byte[] UrlEncodeToBytes(byte[] bytes)         {             if (bytes == null)             {                 return null;             }             return UrlEncodeToBytes(bytes, 0, bytes.Length);         }         public static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count)         {             if ((bytes == null) && (count == 0))             {                 return null;             }             if (bytes == null)             {                 throw new ArgumentNullException("bytes");             }             if ((offset < 0) || (offset > bytes.Length))             {                 throw new ArgumentOutOfRangeException("offset");             }             if ((count < 0) || ((offset + count) > bytes.Length))             {                 throw new ArgumentOutOfRangeException("count");             }             return UrlEncodeBytesToBytesInternal(bytes, offset, count, true);         }         private static byte[] UrlEncodeBytesToBytesInternal(byte[] bytes, int offset, int count, bool alwaysCreateReturnValue)         {             int num = 0;             int num2 = 0;             for (int i = 0; i < count; i++)             {                 char ch = (char)bytes[offset + i];                 if (ch == ' ')                 {                     num++;                 }                 else if (!IsSafe(ch))                 {                     num2++;                 }             }             if ((!alwaysCreateReturnValue && (num == 0)) && (num2 == 0))             {                 return bytes;             }             byte[] buffer = new byte[count + (num2 * 2)];             int num4 = 0;             for (int j = 0; j < count; j++)             {                 byte num6 = bytes[offset + j];                 char ch2 = (char)num6;                 if (IsSafe(ch2))                 {                     buffer[num4++] = num6;                 }                 else if (ch2 == ' ')                 {                     buffer[num4++] = 0x2b;                 }                 else                 {                     buffer[num4++] = 0x25;                     buffer[num4++] = (byte)IntToHex((num6 >> 4) & 15);                     buffer[num4++] = (byte)IntToHex(num6 & 15);                 }             }             return buffer;         }         internal static bool IsSafe(char ch)         {             if ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'))) || ((ch >= '0') && (ch <= '9')))             {                 return true;             }             switch (ch)             {                 case '\'':                 case '(':                 case ')':                 case '*':                 case '-':                 case '.':                 case '_':                 case '!':                     return true;             }             return false;         }         internal static char IntToHex(int n)         {             if (n <= 9)             {                 return (char)(n + 0x30);             }             return (char)((n - 10) + 0x61);         }     } }