| // | 
| // ListenerPrefix.cs | 
| //    Copied from System.ListenerPrefix | 
| // | 
| // Author: | 
| //    Gonzalo Paniagua Javier (gonzalo@novell.com) | 
| //    Oleg Mihailik (mihailik gmail co_m) | 
| // | 
| // 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.Net; | 
|   | 
| namespace WebSocketSharp.Net { | 
|   | 
|     sealed class ListenerPrefix { | 
|   | 
|         IPAddress []        addresses; | 
|         string              host; | 
|         string              original; | 
|         string              path; | 
|         ushort              port; | 
|         bool                secure; | 
|   | 
|         public HttpListener Listener; | 
|   | 
|         public ListenerPrefix (string prefix) | 
|         { | 
|             original = prefix; | 
|             Parse (prefix); | 
|         } | 
|   | 
|         public IPAddress [] Addresses { | 
|             get { return addresses; } | 
|             set { addresses = value; } | 
|         } | 
|   | 
|         public string Host { | 
|             get { return host; } | 
|         } | 
|   | 
|         public int Port { | 
|             get { return (int) port; } | 
|         } | 
|   | 
|         public string Path { | 
|             get { return path; } | 
|         } | 
|   | 
|         public bool Secure { | 
|             get { return secure; } | 
|         } | 
|   | 
|         void Parse (string uri) | 
|         { | 
|             int default_port = (uri.StartsWith ("http://")) ? 80 : -1; | 
|             if (default_port == -1) { | 
|                 default_port = (uri.StartsWith ("https://")) ? 443 : -1; | 
|                 secure = true; | 
|             } | 
|   | 
|             int length = uri.Length; | 
|             int start_host = uri.IndexOf (':') + 3; | 
|             if (start_host >= length) | 
|                 throw new ArgumentException ("No host specified."); | 
|   | 
|             int colon = uri.IndexOf (':', start_host, length - start_host); | 
|             int root; | 
|             if (colon > 0) { | 
|                 host = uri.Substring (start_host, colon - start_host); | 
|                 root = uri.IndexOf ('/', colon, length - colon); | 
|                 port = (ushort) Int32.Parse (uri.Substring (colon + 1, root - colon - 1)); | 
|                 path = uri.Substring (root); | 
|             } else { | 
|                 root = uri.IndexOf ('/', start_host, length - start_host); | 
|                 host = uri.Substring (start_host, root - start_host); | 
|                 path = uri.Substring (root); | 
|             } | 
|             if (path.Length != 1) | 
|                 path = path.Substring (0, path.Length - 1); | 
|         } | 
|   | 
|         public static void CheckUri (string uri) | 
|         { | 
|             if (uri == null) | 
|                 throw new ArgumentNullException ("uriPrefix"); | 
|   | 
|             int default_port = (uri.StartsWith ("http://")) ? 80 : -1; | 
|             if (default_port == -1) | 
|                 default_port = (uri.StartsWith ("https://")) ? 443 : -1; | 
|             if (default_port == -1) | 
|                 throw new ArgumentException ("Only 'http' and 'https' schemes are supported."); | 
|   | 
|             int length = uri.Length; | 
|             int start_host = uri.IndexOf (':') + 3; | 
|             if (start_host >= length) | 
|                 throw new ArgumentException ("No host specified."); | 
|   | 
|             int colon = uri.IndexOf (':', start_host, length - start_host); | 
|             if (start_host == colon) | 
|                 throw new ArgumentException ("No host specified."); | 
|   | 
|             int root; | 
|             if (colon > 0) { | 
|                 root = uri.IndexOf ('/', colon, length - colon); | 
|                 if (root == -1) | 
|                     throw new ArgumentException ("No path specified."); | 
|   | 
|                 try { | 
|                     int p = Int32.Parse (uri.Substring (colon + 1, root - colon - 1)); | 
|                     if (p <= 0 || p >= 65536) | 
|                         throw new Exception (); | 
|                 } catch { | 
|                     throw new ArgumentException ("Invalid port."); | 
|                 } | 
|             } else { | 
|                 root = uri.IndexOf ('/', start_host, length - start_host); | 
|                 if (root == -1) | 
|                     throw new ArgumentException ("No path specified."); | 
|             } | 
|   | 
|             if (uri [uri.Length - 1] != '/') | 
|                 throw new ArgumentException ("The prefix must end with '/'"); | 
|         } | 
|   | 
|         // Equals and GetHashCode are required to detect duplicates in HttpListenerPrefixCollection. | 
|         public override bool Equals (object o) | 
|         { | 
|             ListenerPrefix other = o as ListenerPrefix; | 
|             if (other == null) | 
|                 return false; | 
|   | 
|             return (original == other.original); | 
|         } | 
|   | 
|         public override int GetHashCode () | 
|         { | 
|             return original.GetHashCode (); | 
|         } | 
|   | 
|         public override string ToString () | 
|         { | 
|             return original; | 
|         } | 
|     } | 
| } |