using System; using System.Collections.Generic; using System.IO; using System.Net; using ln.collections; namespace ln.http; public sealed class HttpRequestContext : IDisposable { public Listener Listener { get; } public IPEndPoint LocalEndpoint => Listener.LocalEndpoint; public HttpConnection HttpConnection { get; } public Stream ConnectionStream { get; } public HttpRequest Request { get; protected set; } public HttpResponse Response { get; set; } public HttpRequestContext ParentContext { get; } public HttpPrincipal AuthenticatedPrincipal { get; set; } Dictionary _parameters = new Dictionary(); public HttpRequestContext(HttpRequestContext parentContext, HttpRequest request) : this(parentContext.Listener, parentContext.HttpConnection, parentContext.ConnectionStream, request) { ParentContext = parentContext; } public HttpRequestContext(Listener listener, HttpConnection httpConnection, Stream connectionStream, HttpRequest request) { Listener = listener; Request = request; HttpConnection = httpConnection; ConnectionStream = connectionStream; } protected HttpRequestContext(Listener listener, HttpConnection httpConnection, Stream connectionStream) { Listener = listener; HttpConnection = httpConnection; ConnectionStream = connectionStream; } public void Dispose() { Request?.Dispose(); Response?.Dispose(); } public bool ContainsParameter(string parameterName) => _parameters.ContainsKey(parameterName); public String GetParameter(String parameterName) => GetParameter(parameterName, null); public String GetParameter(String parameterName, String defaultValue) { if (!_parameters.TryGetValue(parameterName, out string value)) value = defaultValue; return value; } public bool TryGetParameter(String parameterName, out string parameterValue) => _parameters.TryGetValue(parameterName, out parameterValue); public void SetParameter(String parameterName, String parameterValue) => _parameters[parameterName] = parameterValue; public IEnumerable ParameterNames => _parameters.Keys; }