Пример #1
0
        public HttpConnection(ILogger logger, Socket sock, EndPointListener epl, bool secure, X509Certificate cert)
        {
            _logger     = logger;
            this.sock   = sock;
            this.epl    = epl;
            this.secure = secure;
            this.cert   = cert;
            this.SetSocketTimeout(sock);
            if (secure == false)
            {
                stream = new NetworkStream(sock, false);
            }
            else
            {
                //ssl_stream = epl.Listener.CreateSslStream(new NetworkStream(sock, false), false, (t, c, ch, e) =>
                //{
                //    if (c == null)
                //        return true;
                //    var c2 = c as X509Certificate2;
                //    if (c2 == null)
                //        c2 = new X509Certificate2(c.GetRawCertData());
                //    client_cert = c2;
                //    client_cert_errors = new int[] { (int)e };
                //    return true;
                //});
                //stream = ssl_stream.AuthenticatedStream;

                ssl_stream = new SslStream(new NetworkStream(sock, false), false);
                ssl_stream.AuthenticateAsServer(cert);
                stream = ssl_stream;
            }
            timer = new ResumableTimer(OnTimeout);
            Init();
        }
Пример #2
0
        static EndPointListener GetEPListener(ILogger logger, string host, int port, HttpListener listener, bool secure)
        {
            IPAddress addr;

            if (host == "*" || host == "+")
            {
                addr = GetIpAnyAddress();
            }
            else if (IPAddress.TryParse(host, out addr) == false)
            {
                try
                {
                    IPHostEntry iphost = Dns.GetHostByName(host);
                    if (iphost != null)
                    {
                        addr = iphost.AddressList[0];
                    }
                    else
                    {
                        addr = GetIpAnyAddress();
                    }
                }
                catch
                {
                    addr = GetIpAnyAddress();
                }
            }
            Hashtable p = null;  // Dictionary<int, EndPointListener>

            if (ip_to_endpoints.ContainsKey(addr))
            {
                p = (Hashtable)ip_to_endpoints[addr];
            }
            else
            {
                p = new Hashtable();
                ip_to_endpoints[addr] = p;
            }

            EndPointListener epl = null;

            if (p.ContainsKey(port))
            {
                epl = (EndPointListener)p[port];
            }
            else
            {
                epl     = new EndPointListener(listener, addr, port, secure, listener.Certificate, logger);
                p[port] = epl;
            }

            return(epl);
        }
Пример #3
0
 private HttpConnection(ILogger logger, ISocket sock, EndPointListener epl, bool secure, ICertificate cert, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding)
 {
     _logger              = logger;
     this.sock            = sock;
     this.epl             = epl;
     this.secure          = secure;
     this.cert            = cert;
     _cryptoProvider      = cryptoProvider;
     _memoryStreamFactory = memoryStreamFactory;
     _textEncoding        = textEncoding;
     _streamFactory       = streamFactory;
 }
Пример #4
0
 private HttpConnection(ILogger logger, Socket socket, EndPointListener epl, bool secure, X509Certificate cert, ICryptoProvider cryptoProvider, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
 {
     _logger              = logger;
     this._socket         = socket;
     this._epl            = epl;
     this.secure          = secure;
     this.cert            = cert;
     _cryptoProvider      = cryptoProvider;
     _memoryStreamFactory = memoryStreamFactory;
     _textEncoding        = textEncoding;
     _fileSystem          = fileSystem;
     _environment         = environment;
 }
Пример #5
0
 public static void RemoveEndPoint(EndPointListener epl, IPEndPoint ep)
 {
     lock (ip_to_endpoints)
     {
         // Dictionary<int, EndPointListener> p
         Hashtable p = null;
         p = (Hashtable)ip_to_endpoints[ep.Address];
         p.Remove(ep.Port);
         if (p.Count == 0)
         {
             ip_to_endpoints.Remove(ep.Address);
         }
         epl.Close();
     }
 }
Пример #6
0
        static async Task <EndPointListener> GetEPListener(ILogger logger, string host, int port, HttpListener listener, bool secure)
        {
            var networkManager = listener.NetworkManager;

            IpAddressInfo addr;

            if (host == "*" || host == "+")
            {
                addr = GetIpAnyAddress(listener);
            }
            else if (networkManager.TryParseIpAddress(host, out addr) == false)
            {
                try
                {
                    var all = (await networkManager.GetHostAddressesAsync(host).ConfigureAwait(false));

                    addr = (all.Length == 0 ? null : all[0]) ??
                           GetIpAnyAddress(listener);
                }
                catch
                {
                    addr = GetIpAnyAddress(listener);
                }
            }

            Dictionary <int, EndPointListener> p = null;  // Dictionary<int, EndPointListener>

            if (!ip_to_endpoints.TryGetValue(addr.Address, out p))
            {
                p = new Dictionary <int, EndPointListener>();
                ip_to_endpoints[addr.Address] = p;
            }

            EndPointListener epl = null;

            if (p.ContainsKey(port))
            {
                epl = (EndPointListener)p[port];
            }
            else
            {
                epl     = new EndPointListener(listener, addr, port, secure, listener.Certificate, logger, listener.CryptoProvider, listener.StreamFactory, listener.SocketFactory, listener.MemoryStreamFactory, listener.TextEncoding, listener.FileSystem, listener.EnvironmentInfo);
                p[port] = epl;
            }

            return(epl);
        }
Пример #7
0
 public static void RemoveEndPoint(EndPointListener epl, IpEndPointInfo ep)
 {
     lock (ip_to_endpoints)
     {
         // Dictionary<int, EndPointListener> p
         Dictionary <int, EndPointListener> p;
         if (ip_to_endpoints.TryGetValue(ep.IpAddress.Address, out p))
         {
             p.Remove(ep.Port);
             if (p.Count == 0)
             {
                 ip_to_endpoints.Remove(ep.IpAddress.Address);
             }
         }
         epl.Close();
     }
 }
Пример #8
0
        static void RemovePrefixInternal(ILogger logger, string prefix, HttpListener listener)
        {
            ListenerPrefix lp = new ListenerPrefix(prefix);

            if (lp.Path.IndexOf('%') != -1)
            {
                return;
            }

            if (lp.Path.IndexOf("//", StringComparison.Ordinal) != -1)
            {
                return;
            }

            EndPointListener epl = GetEPListener(logger, lp.Host, lp.Port, listener, lp.Secure).Result;

            epl.RemovePrefix(lp, listener);
        }
Пример #9
0
        static void AddPrefixInternal(ILogger logger, string p, HttpListener listener)
        {
            ListenerPrefix lp = new ListenerPrefix(p);

            if (lp.Path.IndexOf('%') != -1)
            {
                throw new HttpListenerException(400, "Invalid path.");
            }

            if (lp.Path.IndexOf("//", StringComparison.Ordinal) != -1) // TODO: Code?
            {
                throw new HttpListenerException(400, "Invalid path.");
            }

            // listens on all the interfaces if host name cannot be parsed by IPAddress.
            EndPointListener epl = GetEPListener(logger, lp.Host, lp.Port, listener, lp.Secure).Result;

            epl.AddPrefix(lp, listener);
        }
Пример #10
0
        public HttpConnection(ILogger logger, Socket socket, EndPointListener epl, bool secure, X509Certificate cert, ICryptoProvider cryptoProvider, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
        {
            _logger              = logger;
            this._socket         = socket;
            this._epl            = epl;
            this.secure          = secure;
            this.cert            = cert;
            _cryptoProvider      = cryptoProvider;
            _memoryStreamFactory = memoryStreamFactory;
            _textEncoding        = textEncoding;
            _fileSystem          = fileSystem;
            _environment         = environment;

            if (secure == false)
            {
                _stream = new SocketStream(_socket, false);
            }
            else
            {
                ssl_stream = new SslStream(new NetworkStream(_socket, false), false, (t, c, ch, e) =>
                {
                    if (c == null)
                    {
                        return(true);
                    }

                    //var c2 = c as X509Certificate2;
                    //if (c2 == null)
                    //{
                    //    c2 = new X509Certificate2(c.GetRawCertData());
                    //}

                    //_clientCert = c2;
                    //_clientCertErrors = new int[] { (int)e };
                    return(true);
                });

                _stream = ssl_stream;

                ssl_stream.AuthenticateAsServer(cert, false, (SslProtocols)ServicePointManager.SecurityProtocol, false);
            }
            Init();
        }
Пример #11
0
        public static async Task <HttpConnection> Create(ILogger logger, IAcceptSocket sock, EndPointListener epl, bool secure, ICertificate cert, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
        {
            var connection = new HttpConnection(logger, sock, epl, secure, cert, cryptoProvider, streamFactory, memoryStreamFactory, textEncoding, fileSystem, environment);

            await connection.InitStream().ConfigureAwait(false);

            return(connection);
        }