aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener/Net/HttpConnection.cs
diff options
context:
space:
mode:
authorstefan <stefan@hegedues.at>2018-09-12 19:26:21 +0200
committerstefan <stefan@hegedues.at>2018-09-12 19:26:21 +0200
commit48facb797ed912e4ea6b04b17d1ff190ac2daac4 (patch)
tree8dae77a31670a888d733484cb17dd4077d5444e8 /SocketHttpListener/Net/HttpConnection.cs
parentc32d8656382a0eacb301692e0084377fc433ae9b (diff)
Update to 3.5.2 and .net core 2.1
Diffstat (limited to 'SocketHttpListener/Net/HttpConnection.cs')
-rw-r--r--SocketHttpListener/Net/HttpConnection.cs94
1 files changed, 54 insertions, 40 deletions
diff --git a/SocketHttpListener/Net/HttpConnection.cs b/SocketHttpListener/Net/HttpConnection.cs
index 05576ea1e..9b4fb8705 100644
--- a/SocketHttpListener/Net/HttpConnection.cs
+++ b/SocketHttpListener/Net/HttpConnection.cs
@@ -13,7 +13,9 @@ using MediaBrowser.Model.Net;
using MediaBrowser.Model.System;
using MediaBrowser.Model.Text;
using SocketHttpListener.Primitives;
+using System.Security.Authentication;
+using System.Threading;
namespace SocketHttpListener.Net
{
sealed class HttpConnection
@@ -22,7 +24,7 @@ namespace SocketHttpListener.Net
const int BufferSize = 8192;
Socket _socket;
Stream _stream;
- EndPointListener _epl;
+ HttpEndPointListener _epl;
MemoryStream _memoryStream;
byte[] _buffer;
HttpListenerContext _context;
@@ -34,21 +36,21 @@ namespace SocketHttpListener.Net
int _reuses;
bool _contextBound;
bool secure;
- int _timeout = 300000; // 90k ms for first request, 15k ms from then on
+ int _timeout = 90000; // 90k ms for first request, 15k ms from then on
+ private Timer _timer;
IPEndPoint local_ep;
HttpListener _lastListener;
- int[] client_cert_errors;
X509Certificate cert;
SslStream ssl_stream;
private readonly ILogger _logger;
private readonly ICryptoProvider _cryptoProvider;
- private readonly IMemoryStreamFactory _memoryStreamFactory;
+ private readonly IStreamHelper _streamHelper;
private readonly ITextEncoding _textEncoding;
private readonly IFileSystem _fileSystem;
private readonly IEnvironmentInfo _environment;
- private HttpConnection(ILogger logger, Socket socket, EndPointListener epl, bool secure, X509Certificate cert, ICryptoProvider cryptoProvider, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
+ public HttpConnection(ILogger logger, Socket socket, HttpEndPointListener epl, bool secure, X509Certificate cert, ICryptoProvider cryptoProvider, IStreamHelper streamHelper, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
{
_logger = logger;
this._socket = socket;
@@ -56,47 +58,37 @@ namespace SocketHttpListener.Net
this.secure = secure;
this.cert = cert;
_cryptoProvider = cryptoProvider;
- _memoryStreamFactory = memoryStreamFactory;
+ _streamHelper = streamHelper;
_textEncoding = textEncoding;
_fileSystem = fileSystem;
_environment = environment;
- }
- private async Task InitStream()
- {
if (secure == false)
{
_stream = new SocketStream(_socket, false);
}
else
{
- //ssl_stream = _epl.Listener.CreateSslStream(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());
- // client_cert = c2;
- // client_cert_errors = new int[] { (int)e };
- // return true;
- //});
- //_stream = ssl_stream.AuthenticatedStream;
-
- ssl_stream = new SslStream(new SocketStream(_socket, false), false);
- await ssl_stream.AuthenticateAsServerAsync(cert).ConfigureAwait(false);
- _stream = ssl_stream;
- }
- Init();
- }
+ ssl_stream = new SslStream(new SocketStream(_socket, false), false, (t, c, ch, e) =>
+ {
+ if (c == null)
+ {
+ return true;
+ }
- public static async Task<HttpConnection> Create(ILogger logger, Socket sock, EndPointListener epl, bool secure, X509Certificate cert, ICryptoProvider cryptoProvider, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
- {
- var connection = new HttpConnection(logger, sock, epl, secure, cert, cryptoProvider, memoryStreamFactory, textEncoding, fileSystem, environment);
+ //var c2 = c as X509Certificate2;
+ //if (c2 == null)
+ //{
+ // c2 = new X509Certificate2(c.GetRawCertData());
+ //}
- await connection.InitStream().ConfigureAwait(false);
+ //_clientCert = c2;
+ //_clientCertErrors = new int[] { (int)e };
+ return true;
+ });
- return connection;
+ _stream = ssl_stream;
+ }
}
public Stream Stream
@@ -107,12 +99,27 @@ namespace SocketHttpListener.Net
}
}
- internal int[] ClientCertificateErrors
+ public async Task Init()
{
- get { return client_cert_errors; }
+ _timer = new Timer(OnTimeout, null, Timeout.Infinite, Timeout.Infinite);
+
+ if (ssl_stream != null)
+ {
+ var enableAsync = true;
+ if (enableAsync)
+ {
+ await ssl_stream.AuthenticateAsServerAsync(cert, false, (SslProtocols)ServicePointManager.SecurityProtocol, false).ConfigureAwait(false);
+ }
+ else
+ {
+ ssl_stream.AuthenticateAsServer(cert, false, (SslProtocols)ServicePointManager.SecurityProtocol, false);
+ }
+ }
+
+ InitInternal();
}
- void Init()
+ private void InitInternal()
{
_contextBound = false;
_requestStream = null;
@@ -123,7 +130,7 @@ namespace SocketHttpListener.Net
_position = 0;
_inputState = InputState.RequestLine;
_lineState = LineState.None;
- _context = new HttpListenerContext(this, _logger, _cryptoProvider, _memoryStreamFactory, _textEncoding, _fileSystem);
+ _context = new HttpListenerContext(this, _textEncoding);
}
public bool IsClosed
@@ -164,6 +171,13 @@ namespace SocketHttpListener.Net
set { _prefix = value; }
}
+ private void OnTimeout(object unused)
+ {
+ //_logger.Info("HttpConnection timer fired");
+ CloseSocket();
+ Unbind();
+ }
+
public void BeginReadRequest()
{
if (_buffer == null)
@@ -211,7 +225,7 @@ namespace SocketHttpListener.Net
{
var supportsDirectSocketAccess = !_context.Response.SendChunked && !isExpect100Continue && !secure;
- _responseStream = new HttpResponseStream(_stream, _context.Response, false, _memoryStreamFactory, _socket, supportsDirectSocketAccess, _environment, _fileSystem, _logger);
+ _responseStream = new HttpResponseStream(_stream, _context.Response, false, _streamHelper, _socket, supportsDirectSocketAccess, _environment, _fileSystem, _logger);
}
return _responseStream;
}
@@ -503,14 +517,14 @@ namespace SocketHttpListener.Net
// Don't close. Keep working.
_reuses++;
Unbind();
- Init();
+ InitInternal();
BeginReadRequest();
return;
}
_reuses++;
Unbind();
- Init();
+ InitInternal();
BeginReadRequest();
return;
}