Url encoding (2) : URI « Network « C# / C Sharp






Url encoding (2)

       

//
// System.Net.HttpUtility
//
// Author:
//  Gonzalo Paniagua Javier (gonzalo@novell.com)
//
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

using System;
using System.Globalization;
using System.IO;
using System.Text;

namespace Tavis.Http {
    public sealed class HttpUtility {
        private HttpUtility() {
        }

        public static string UrlDecode(string s) {
            return UrlDecode(s, null);
        }

        static char[] GetChars(MemoryStream b, Encoding e) {
            return e.GetChars(b.GetBuffer(), 0, (int)b.Length);
        }

        public static string UrlDecode(string s, Encoding e) {
            if (null == s)
                return null;

            if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1)
                return s;

            if (e == null)
                e = Encoding.GetEncoding(28591);

            StringBuilder output = new StringBuilder();
            long len = s.Length;
            NumberStyles hexa = NumberStyles.HexNumber;
            MemoryStream bytes = new MemoryStream();

            for (int i = 0; i < len; i++) {
                if (s[i] == '%' && i + 2 < len) {
                    if (s[i + 1] == 'u' && i + 5 < len) {
                        if (bytes.Length > 0) {
                            output.Append(GetChars(bytes, e));
                            bytes.SetLength(0);
                        }
                        output.Append((char)Int32.Parse(s.Substring(i + 2, 4), hexa));
                        i += 5;
                    } else {
                        bytes.WriteByte((byte)Int32.Parse(s.Substring(i + 1, 2), hexa));
                        i += 2;
                    }
                    continue;
                }

                if (bytes.Length > 0) {
                    output.Append(GetChars(bytes, e));
                    bytes.SetLength(0);
                }

                if (s[i] == '+') {
                    output.Append(' ');
                } else {
                    output.Append(s[i]);
                }
            }

            if (bytes.Length > 0) {
                output.Append(GetChars(bytes, e));
            }

            bytes = null;
            return output.ToString();
        }

        public static string UrlEncode(string str) {
            return UrlEncode(str, Encoding.UTF8);
        }

        public static string UrlEncode(string s, Encoding Enc) {
            if (s == null)
                return null;

            if (s == "")
                return "";

            byte[] bytes = Enc.GetBytes(s);
            return Encoding.ASCII.GetString(UrlEncodeToBytes(bytes, 0, bytes.Length));
        }

        public static string UrlEncode(byte[] bytes) {
            if (bytes == null)
                return null;

            if (bytes.Length == 0)
                return "";

            return Encoding.ASCII.GetString(UrlEncodeToBytes(bytes, 0, bytes.Length));
        }

        public static string UrlEncode(byte[] bytes, int offset, int count) {
            if (bytes == null)
                return null;

            if (bytes.Length == 0)
                return "";

            return Encoding.ASCII.GetString(UrlEncodeToBytes(bytes, offset, count));
        }

        public static byte[] UrlEncodeToBytes(string str) {
            return UrlEncodeToBytes(str, Encoding.UTF8);
        }

        public static byte[] UrlEncodeToBytes(string str, Encoding e) {
            if (str == null)
                return null;

            if (str == "")
                return new byte[0];

            byte[] bytes = e.GetBytes(str);
            return UrlEncodeToBytes(bytes, 0, bytes.Length);
        }

        public static byte[] UrlEncodeToBytes(byte[] bytes) {
            if (bytes == null)
                return null;

            if (bytes.Length == 0)
                return new byte[0];

            return UrlEncodeToBytes(bytes, 0, bytes.Length);
        }

        static char[] hexChars = "0123456789abcdef".ToCharArray();
        const string notEncoded = "!'()*-._";

        static void UrlEncodeChar(char c, Stream result, bool isUnicode) {
            if (c > 255) {
                //FIXME: what happens when there is an internal error?
                //if (!isUnicode)
                //  throw new ArgumentOutOfRangeException ("c", c, "c must be less than 256");
                int idx;
                int i = (int)c;

                result.WriteByte((byte)'%');
                result.WriteByte((byte)'u');
                idx = i >> 12;
                result.WriteByte((byte)hexChars[idx]);
                idx = (i >> 8) & 0x0F;
                result.WriteByte((byte)hexChars[idx]);
                idx = (i >> 4) & 0x0F;
                result.WriteByte((byte)hexChars[idx]);
                idx = i & 0x0F;
                result.WriteByte((byte)hexChars[idx]);
                return;
            }

            if (c > ' ' && notEncoded.IndexOf(c) != -1) {
                result.WriteByte((byte)c);
                return;
            }
            if (c == ' ') {
                result.WriteByte((byte)'+');
                return;
            }
            if ((c < '0') ||
                (c < 'A' && c > '9') ||
                (c > 'Z' && c < 'a') ||
                (c > 'z')) {
                if (isUnicode && c > 127) {
                    result.WriteByte((byte)'%');
                    result.WriteByte((byte)'u');
                    result.WriteByte((byte)'0');
                    result.WriteByte((byte)'0');
                } else
                    result.WriteByte((byte)'%');

                int idx = ((int)c) >> 4;
                result.WriteByte((byte)hexChars[idx]);
                idx = ((int)c) & 0x0F;
                result.WriteByte((byte)hexChars[idx]);
            } else
                result.WriteByte((byte)c);
        }

        public static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count) {
            if (bytes == null)
                return null;

            int len = bytes.Length;
            if (len == 0)
                return new byte[0];

            if (offset < 0 || offset >= len)
                throw new ArgumentOutOfRangeException("offset");

            if (count < 0 || count > len - offset)
                throw new ArgumentOutOfRangeException("count");

            MemoryStream result = new MemoryStream(count);
            int end = offset + count;
            for (int i = offset; i < end; i++)
                UrlEncodeChar((char)bytes[i], result, false);

            return result.ToArray();
        }

        public static string UrlEncodeUnicode(string str) {
            if (str == null)
                return null;

            return Encoding.ASCII.GetString(UrlEncodeUnicodeToBytes(str));
        }

        public static byte[] UrlEncodeUnicodeToBytes(string str) {
            if (str == null)
                return null;

            if (str == "")
                return new byte[0];

            MemoryStream result = new MemoryStream(str.Length);
            foreach (char c in str) {
                UrlEncodeChar(c, result, true);
            }
            return result.ToArray();
        }
    }
}

   
    
    
    
    
    
    
  








Related examples in the same category

1.Use UriUse Uri
2.Build the hash table of HTML entity references and encode Url
3.Is Relative Url
4.Is Rooted Url
5.Correctly encode a name for a URL.
6.Essentially creates a query string.
7.Uri Class Provides an object representation of a uniform resource identifier (URI) and easy access to the parts of the URI.
8.Initializes a new instance of the Uri class with the specified URI.
9.Initializes a new instance of the Uri class based on the specified base URI and relative URI string.
10.Gets the absolute path of the URI.
11.Gets the absolute URI.
12.Gets the Domain Name System (DNS) host name or IP address and the port number for a server.
13.Determines whether the specified host name is a valid DNS name.
14.Determines whether the specified scheme name is valid.
15.Gets an unescaped host name that is safe to use for DNS resolution.
16.Gets the escaped URI fragment.
17.Gets the decimal value of a hexadecimal digit.
18.Gets the hash code for the URI.
19.Gets the specified portion of a Uri instance.
20.Converts a specified character into its hexadecimal equivalent.
21.Gets the host component of this instance.
22.Gets the type of the host name specified in the URI.
23.Gets whether the port value of the URI is the default for this scheme.
24.Gets a value indicating whether the specified Uri is a file URI.
25.Determines whether a specified character is a valid hexadecimal digit.
26.Gets whether the specified Uri references the local host.
27.Gets whether the specified Uri is a universal naming convention (UNC) path.
28.Gets a local operating-system representation of a file name.
29.Determines the difference between two Uri instances.
30.Gets the original URI string that was passed to the Uri constructor.
31.Gets the AbsolutePath and Query properties separated by a question mark (?).
32.Gets the port number of this URI.
33.Gets any query information included in the specified URI.
34.Gets the scheme name for this URI.
35.Gets an array containing the path segments that make up the specified URI.
36.Gets a canonical string representation for the specified Uri instance.
37.Specifies that the URI is a pointer to a file.
38.Specifies that the URI is accessed through the File Transfer Protocol (FTP).
39.Specifies that the URI is accessed through the Gopher protocol.
40.Specifies that the URI is accessed through the Hypertext Transfer Protocol (HTTP).
41.Specifies that the URI is accessed through the Secure Hypertext Transfer Protocol (HTTPS).
42.Specifies that the URI is an e-mail address and is accessed through the Simple Mail Transport Protocol (SMTP).
43.Specifies that the URI is an Internet news group and is accessed through the Network News Transport Protocol (NNTP).
44.Uri.UriSchemeNntp
45.Indicates that the URI string was completely escaped before the Uri instance was created.
46.Gets the user name, password, or other user-specific information associated with the specified URI.
47.Download text data from the specified URI
48.Expand Uri
49.Expand Relative Uri
50.Parse the query string in the URI into a KeyValuePair
51.Assembles a series of key=value pairs as a URI-escaped query-string.
52.Get Absolute Url For Local File
53.Get Post ID From URL
54.Combine URL
55.Url Encode
56.URL Encoding
57.Url Encode 2
58.Url Encode 3
59.Retrieves the subdomain from the specified URL.
60.Try to parse the url, similar to int.TryParse
61.Is Link Valid