public MessagePump(IOptions <HttpSysOptions> options, ILoggerFactory loggerFactory, IAuthenticationSchemeProvider authentication) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (loggerFactory == null) { throw new ArgumentNullException(nameof(loggerFactory)); } _options = options.Value; Listener = new HttpSysListener(_options, loggerFactory); _logger = LogHelper.CreateLogger(loggerFactory, typeof(MessagePump)); if (_options.Authentication.Schemes != AuthenticationSchemes.None) { authentication.AddScheme(new AuthenticationScheme(HttpSysDefaults.AuthenticationScheme, displayName: null, handlerType: typeof(AuthenticationHandler))); } Features = new FeatureCollection(); _serverAddresses = new ServerAddressesFeature(); Features.Set <IServerAddressesFeature>(_serverAddresses); _processRequest = new Action <object>(ProcessRequestAsync); _maxAccepts = _options.MaxAccepts; }
internal RequestContext(HttpSysListener server, NativeRequestContext memoryBlob) { // TODO: Verbose log Server = server; _memoryBlob = memoryBlob; Request = new Request(this, _memoryBlob); Response = new Response(this); AllowSynchronousIO = server.Options.AllowSynchronousIO; }
private static void IOCompleted(AsyncAcceptContext asyncResult, uint errorCode, uint numBytes) { bool complete = false; try { if (errorCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS && errorCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_MORE_DATA) { asyncResult.Tcs.TrySetException(new HttpSysException((int)errorCode)); complete = true; } else { HttpSysListener server = asyncResult.Server; if (errorCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS) { // at this point we have received an unmanaged HTTP_REQUEST and memoryBlob // points to it we need to hook up our authentication handling code here. try { if (server.ValidateRequest(asyncResult._nativeRequestContext) && server.ValidateAuth(asyncResult._nativeRequestContext)) { RequestContext requestContext = new RequestContext(server, asyncResult._nativeRequestContext); asyncResult.Tcs.TrySetResult(requestContext); complete = true; } } catch (Exception) { server.SendError(asyncResult._nativeRequestContext.RequestId, StatusCodes.Status400BadRequest); throw; } finally { // The request has been handed to the user, which means this code can't reuse the blob. Reset it here. if (complete) { asyncResult._nativeRequestContext = null; } else { asyncResult.AllocateNativeRequest(size: asyncResult._nativeRequestContext.Size); } } } else { // (uint)backingBuffer.Length - AlignmentPadding asyncResult.AllocateNativeRequest(numBytes, asyncResult._nativeRequestContext.RequestId); } // We need to issue a new request, either because auth failed, or because our buffer was too small the first time. if (!complete) { uint statusCode = asyncResult.QueueBeginGetContext(); if (statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS && statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_IO_PENDING) { // someother bad error, possible(?) return values are: // ERROR_INVALID_HANDLE, ERROR_INSUFFICIENT_BUFFER, ERROR_OPERATION_ABORTED asyncResult.Tcs.TrySetException(new HttpSysException((int)statusCode)); complete = true; } } if (!complete) { return; } } if (complete) { asyncResult.Dispose(); } } catch (Exception exception) { // Logged by caller asyncResult.Tcs.TrySetException(exception); asyncResult.Dispose(); } }
internal AsyncAcceptContext(HttpSysListener server) { _server = server; _tcs = new TaskCompletionSource <RequestContext>(); AllocateNativeRequest(); }