/// <summary> /// Creates a <see cref="IHttpClientContext"/> that handles a connected client. /// </summary> /// <param name="socket">Client socket (accepted by the <see cref="HttpListener"/>).</param> /// <returns> /// A creates <see cref="IHttpClientContext"/>. /// </returns> public IHttpClientContext CreateContext(Socket socket) { var networkStream = new ReusableSocketNetworkStream(socket, true); var remoteEndPoint = (IPEndPoint)socket.RemoteEndPoint; return(CreateContext(false, remoteEndPoint, null, networkStream, socket)); }
/// <summary> /// Create a secure <see cref="IHttpClientContext"/>. /// </summary> /// <param name="socket">Client socket (accepted by the <see cref="HttpListener"/>).</param> /// <param name="certificate">HTTPS certificate to use.</param> /// <param name="protocol">Kind of HTTPS protocol. Usually TLS or SSL.</param> /// <param name="requireClientCert">Require an SSL client certificate</param> /// <returns> /// A created <see cref="IHttpClientContext"/>. /// </returns> public IHttpClientContext CreateSecureContext(Socket socket, X509Certificate certificate, SslProtocols protocol, bool requireClientCert) { var networkStream = new ReusableSocketNetworkStream(socket, true); var remoteEndPoint = (IPEndPoint)socket.RemoteEndPoint; ClientCertificate clientCertificate = null; SslStream sslStream = new SslStream(networkStream, false, delegate(object sender, X509Certificate receivedCertificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { clientCertificate = new ClientCertificate(receivedCertificate, chain, sslPolicyErrors); return(!(requireClientCert && receivedCertificate == null)); } ); try { sslStream.AuthenticateAsServer(certificate, requireClientCert, protocol, false); return(CreateContext(true, remoteEndPoint, clientCertificate, sslStream, socket)); } catch (IOException err) { if (UseTraceLogs) { _logWriter.Write(this, LogPrio.Trace, err.Message); } } catch (ObjectDisposedException err) { if (UseTraceLogs) { _logWriter.Write(this, LogPrio.Trace, err.Message); } } catch (AuthenticationException err) { _logWriter.Write(this, LogPrio.Warning, (err.InnerException != null) ? err.InnerException.Message : err.Message); } return(null); }