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; }
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); } }
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); }
/// <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 ); }
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; }
/// <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); }
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; }
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; }
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; }
private void CloseSocket() { if (_socket == null) { return; } try { _socket.Close(); } catch { } finally { _socket = null; } RemoveConnection(); }
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; } }
public Stream CreateNetworkStream(IAcceptSocket acceptSocket, bool ownsSocket) { var netSocket = (NetAcceptSocket)acceptSocket; return(new SocketStream(netSocket.Socket, ownsSocket)); }
/// <summary> Constructor </summary> public AdkSocketBinding( IAcceptSocket socket, ILog log ) : this(socket) { fLog = log; }
/// <summary> Constructor </summary> public AdkSocketBinding(IAcceptSocket socket, ILog log) : this( socket ) { fLog = log; }
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; } }