예제 #1
0
        private void CreateSocket()
        {
            try
            {
                sock = _socketFactory.CreateSocket(endpoint.IpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, _enableDualMode);
            }
            catch (SocketCreateException ex)
            {
                if (_enableDualMode && endpoint.IpAddress.Equals(IpAddressInfo.IPv6Any) &&
                    (string.Equals(ex.ErrorCode, "AddressFamilyNotSupported", StringComparison.OrdinalIgnoreCase) ||
                     // mono on bsd is throwing this
                     string.Equals(ex.ErrorCode, "ProtocolNotSupported", StringComparison.OrdinalIgnoreCase)))
                {
                    endpoint        = new IpEndPointInfo(IpAddressInfo.Any, endpoint.Port);
                    _enableDualMode = false;
                    sock            = _socketFactory.CreateSocket(endpoint.IpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, _enableDualMode);
                }
                else
                {
                    throw;
                }
            }

            sock.Bind(endpoint);

            // This is the number TcpListener uses.
            sock.Listen(2147483647);

            sock.StartAccept(ProcessAccept, () => _closed);
            _closed = false;
        }
예제 #2
0
        private async void ProcessAccept(IAcceptSocket accepted)
        {
            try
            {
                var listener = this;

                if (listener.secure && listener.cert == null)
                {
                    accepted.Close();
                    return;
                }

                HttpConnection conn = await HttpConnection.Create(_logger, accepted, listener, listener.secure, listener.cert, _cryptoProvider, _streamFactory, _memoryStreamFactory, _textEncoding, _fileSystem, _environment).ConfigureAwait(false);

                //_logger.Debug("Adding unregistered connection to {0}. Id: {1}", accepted.RemoteEndPoint, connectionId);
                lock (listener.unregistered)
                {
                    listener.unregistered[conn] = conn;
                }
                conn.BeginReadRequest();
            }
            catch (Exception ex)
            {
                _logger.ErrorException("Error in ProcessAccept", ex);
            }
        }
예제 #3
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);
        }
예제 #4
0
 /// <summary> Constructor </summary>
 public AdkSocketBinding( IAcceptSocket socket )
 {
     fAcceptSocket = socket;
     fSocketConnections = new ArrayList();
     TimeSpan cleanupInterval = TimeSpan.FromSeconds( (int) (KEEP_ALIVE_TIME/3) );
     fCleanupTimer =
         new Timer
             ( new TimerCallback( Cleanup ), cleanupInterval, cleanupInterval,
               cleanupInterval );
 }
예제 #5
0
 internal ResponseStream(Stream stream, HttpListenerResponse response, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IAcceptSocket socket, bool supportsDirectSocketAccess)
 {
     this.response        = response;
     _memoryStreamFactory = memoryStreamFactory;
     _textEncoding        = textEncoding;
     _fileSystem          = fileSystem;
     _socket = socket;
     _supportsDirectSocketAccess = supportsDirectSocketAccess;
     this.stream = stream;
 }
예제 #6
0
        /// <summary> Constructor </summary>
        public AdkSocketBinding(IAcceptSocket socket)
        {
            fAcceptSocket      = socket;
            fSocketConnections = new ArrayList();
            TimeSpan cleanupInterval = TimeSpan.FromSeconds((int)(KEEP_ALIVE_TIME / 3));

            fCleanupTimer =
                new Timer
                    (new TimerCallback(Cleanup), cleanupInterval, cleanupInterval,
                    cleanupInterval);
        }
예제 #7
0
 internal HttpResponseStream(Stream stream, HttpListenerResponse response, bool ignore_errors, IMemoryStreamFactory memoryStreamFactory, IAcceptSocket socket, bool supportsDirectSocketAccess, IEnvironmentInfo environment, IFileSystem fileSystem, ILogger logger)
 {
     _response            = response;
     _ignore_errors       = ignore_errors;
     _memoryStreamFactory = memoryStreamFactory;
     _socket = socket;
     _supportsDirectSocketAccess = supportsDirectSocketAccess;
     _environment = environment;
     _fileSystem  = fileSystem;
     _logger      = logger;
     _stream      = stream;
 }
예제 #8
0
파일: HttpConnection.cs 프로젝트: vvuk/Emby
 private HttpConnection(ILogger logger, IAcceptSocket 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;
 }
예제 #9
0
 private HttpConnection(ILogger logger, IAcceptSocket socket, EndPointListener epl, bool secure, ICertificate cert, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, 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;
     _streamFactory       = streamFactory;
 }
예제 #10
0
        private void CloseSocket()
        {
            if (_socket == null)
            {
                return;
            }

            try
            {
                _socket.Close();
            }
            catch { }
            finally
            {
                _socket = null;
            }

            RemoveConnection();
        }
예제 #11
0
        internal void Close(bool force)
        {
            if (_socket != null)
            {
                Stream st = GetResponseStream();
                if (st != null)
                {
                    st.Close();
                }

                _responseStream = null;
            }

            if (_socket != null)
            {
                force |= !_context.Request.KeepAlive;
                if (!force)
                {
                    force = (string.Equals(_context.Response.Headers["connection"], "close", StringComparison.OrdinalIgnoreCase));
                }

                if (!force && _context.Request.FlushInput())
                {
                    if (_chunked && _context.Response.ForceCloseChunked == false)
                    {
                        // Don't close. Keep working.
                        _reuses++;
                        Unbind();
                        Init();
                        BeginReadRequest();
                        return;
                    }

                    _reuses++;
                    Unbind();
                    Init();
                    BeginReadRequest();
                    return;
                }

                IAcceptSocket s = _socket;
                _socket = null;
                try
                {
                    if (s != null)
                    {
                        s.Shutdown(true);
                    }
                }
                catch
                {
                }
                finally
                {
                    if (s != null)
                    {
                        s.Close();
                    }
                }
                Unbind();
                RemoveConnection();
                return;
            }
        }
예제 #12
0
        public Stream CreateNetworkStream(IAcceptSocket acceptSocket, bool ownsSocket)
        {
            var netSocket = (NetAcceptSocket)acceptSocket;

            return(new SocketStream(netSocket.Socket, ownsSocket));
        }
예제 #13
0
 /// <summary> Constructor </summary>
 public AdkSocketBinding( IAcceptSocket socket,
                          ILog log )
     : this(socket)
 {
     fLog = log;
 }
예제 #14
0
 /// <summary> Constructor </summary>
 public AdkSocketBinding(IAcceptSocket socket,
                         ILog log)
     : this( socket )
 {
     fLog = log;
 }
예제 #15
0
파일: HttpConnection.cs 프로젝트: vvuk/Emby
        internal void Close(bool force_close)
        {
            if (sock != null)
            {
                if (!context.Request.IsWebSocketRequest || force_close)
                {
                    Stream st = GetResponseStream();
                    if (st != null)
                    {
                        st.Dispose();
                    }

                    o_stream = null;
                }
            }

            if (sock != null)
            {
                force_close |= !context.Request.KeepAlive;
                if (!force_close)
                {
                    force_close = (string.Equals(context.Response.Headers["connection"], "close", StringComparison.OrdinalIgnoreCase));
                }

                /*
                 *              if (!force_close) {
                 * //					bool conn_close = (status_code == 400 || status_code == 408 || status_code == 411 ||
                 * //							status_code == 413 || status_code == 414 || status_code == 500 ||
                 * //							status_code == 503);
                 *                      force_close |= (context.Request.ProtocolVersion <= HttpVersion.Version10);
                 *              }
                 */

                if (!force_close && context.Request.FlushInput())
                {
                    reuses++;
                    Unbind();
                    Init();
                    BeginReadRequest();
                    return;
                }

                IAcceptSocket s = sock;
                sock = null;
                try
                {
                    if (s != null)
                    {
                        s.Shutdown(true);
                    }
                }
                catch
                {
                }
                finally
                {
                    if (s != null)
                    {
                        s.Close();
                    }
                }
                Unbind();
                RemoveConnection();
                return;
            }
        }