aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener/Net/HttpListenerContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'SocketHttpListener/Net/HttpListenerContext.cs')
-rw-r--r--SocketHttpListener/Net/HttpListenerContext.cs136
1 files changed, 15 insertions, 121 deletions
diff --git a/SocketHttpListener/Net/HttpListenerContext.cs b/SocketHttpListener/Net/HttpListenerContext.cs
index 1bf39589d..f4679568a 100644
--- a/SocketHttpListener/Net/HttpListenerContext.cs
+++ b/SocketHttpListener/Net/HttpListenerContext.cs
@@ -7,145 +7,39 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Text;
using SocketHttpListener.Net.WebSockets;
using SocketHttpListener.Primitives;
+using System.Threading.Tasks;
namespace SocketHttpListener.Net
{
- public sealed class HttpListenerContext
+ public sealed unsafe partial class HttpListenerContext
{
- HttpListenerRequest request;
- HttpListenerResponse response;
- IPrincipal user;
- HttpConnection cnc;
- string error;
- int err_status = 400;
- private readonly ICryptoProvider _cryptoProvider;
- private readonly IMemoryStreamFactory _memoryStreamFactory;
- private readonly ITextEncoding _textEncoding;
+ internal HttpListener _listener;
+ private HttpListenerResponse _response;
+ private IPrincipal _user;
- internal HttpListenerContext(HttpConnection cnc, ILogger logger, ICryptoProvider cryptoProvider, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem)
- {
- this.cnc = cnc;
- _cryptoProvider = cryptoProvider;
- _memoryStreamFactory = memoryStreamFactory;
- _textEncoding = textEncoding;
- request = new HttpListenerRequest(this, _textEncoding);
- response = new HttpListenerResponse(this, _textEncoding);
- }
-
- internal int ErrorStatus
- {
- get { return err_status; }
- set { err_status = value; }
- }
-
- internal string ErrorMessage
- {
- get { return error; }
- set { error = value; }
- }
-
- internal bool HaveError
- {
- get { return (error != null); }
- }
+ public HttpListenerRequest Request { get; }
- internal HttpConnection Connection
- {
- get { return cnc; }
- }
+ public IPrincipal User => _user;
- public HttpListenerRequest Request
- {
- get { return request; }
- }
+ // This can be used to cache the results of HttpListener.AuthenticationSchemeSelectorDelegate.
+ internal AuthenticationSchemes AuthenticationSchemes { get; set; }
public HttpListenerResponse Response
{
- get { return response; }
- }
-
- public IPrincipal User
- {
- get { return user; }
- }
-
- internal void ParseAuthentication(AuthenticationSchemes expectedSchemes)
- {
- if (expectedSchemes == AuthenticationSchemes.Anonymous)
- return;
-
- // TODO: Handle NTLM/Digest modes
- string header = request.Headers["Authorization"];
- if (header == null || header.Length < 2)
- return;
-
- string[] authenticationData = header.Split(new char[] { ' ' }, 2);
- if (string.Equals(authenticationData[0], "basic", StringComparison.OrdinalIgnoreCase))
+ get
{
- user = ParseBasicAuthentication(authenticationData[1]);
+ return _response;
}
- // TODO: throw if malformed -> 400 bad request
}
- internal IPrincipal ParseBasicAuthentication(string authData)
+ public Task<HttpListenerWebSocketContext> AcceptWebSocketAsync(string subProtocol)
{
- try
- {
- // Basic AUTH Data is a formatted Base64 String
- //string domain = null;
- string user = null;
- string password = null;
- int pos = -1;
- var authDataBytes = Convert.FromBase64String(authData);
- string authString = _textEncoding.GetDefaultEncoding().GetString(authDataBytes, 0, authDataBytes.Length);
-
- // The format is DOMAIN\username:password
- // Domain is optional
-
- pos = authString.IndexOf(':');
-
- // parse the password off the end
- password = authString.Substring(pos + 1);
-
- // discard the password
- authString = authString.Substring(0, pos);
-
- // check if there is a domain
- pos = authString.IndexOf('\\');
-
- if (pos > 0)
- {
- //domain = authString.Substring (0, pos);
- user = authString.Substring(pos);
- }
- else
- {
- user = authString;
- }
-
- HttpListenerBasicIdentity identity = new HttpListenerBasicIdentity(user, password);
- // TODO: What are the roles MS sets
- return new GenericPrincipal(identity, new string[0]);
- }
- catch (Exception)
- {
- // Invalid auth data is swallowed silently
- return null;
- }
+ return AcceptWebSocketAsync(subProtocol, HttpWebSocket.DefaultReceiveBufferSize, WebSocket.DefaultKeepAliveInterval);
}
- public HttpListenerWebSocketContext AcceptWebSocket(string protocol)
+ public Task<HttpListenerWebSocketContext> AcceptWebSocketAsync(string subProtocol, TimeSpan keepAliveInterval)
{
- if (protocol != null)
- {
- if (protocol.Length == 0)
- throw new ArgumentException("An empty string.", "protocol");
-
- if (!protocol.IsToken())
- throw new ArgumentException("Contains an invalid character.", "protocol");
- }
-
- return new HttpListenerWebSocketContext(this, protocol, _cryptoProvider, _memoryStreamFactory);
+ return AcceptWebSocketAsync(subProtocol, HttpWebSocket.DefaultReceiveBufferSize, keepAliveInterval);
}
}