コード例 #1
0
        public async ValueTask <IDispatchResult> HandleAsync(ModuleHttpRequest request, CancellationToken cancellation)
        {
            if (_server == null || !(_server is IModuleServer moduleServer))
            {
                return(DispatchFailure());
            }

            var httpRequestExecutor = moduleServer.RequestExecutor;

            // The server is not yet started or is disposed.
            if (httpRequestExecutor == null)
            {
                return(DispatchFailure());
            }

            var response = await httpRequestExecutor.ExecuteAsync(request, cancellation);

            // This is a special case that should be respected in order to invoke the next http module handler
            // or the next pipeline step in the senders http request pipeline.
            if (response.StatusCode == 404)
            {
                return(DispatchFailure());
            }

            return(Success(response));
        }
コード例 #2
0
        public async ValueTask <ModuleHttpResponse> ExecuteAsync(ModuleHttpRequest request, CancellationToken cancellation)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var requestMessage  = request;
            var responseStream  = new MemoryStream();
            var requestFeature  = BuildRequestFeature(requestMessage);
            var responseFeature = BuildResponseFeature(responseStream);
            var features        = BuildFeatureCollection(requestFeature, responseFeature);
            var context         = _application.CreateContext(features);

            try
            {
                await _application.ProcessRequestAsync(context);

                var responseMessage = BuildResponseMessage(responseStream, responseFeature);

                ExceptionHelper.HandleExceptions(() => _application.DisposeContext(context, exception: null), _logger);

                return(responseMessage);
            }
            catch (Exception exc)
            {
                ExceptionHelper.HandleExceptions(() => _application.DisposeContext(context, exc), _logger);

                throw;
            }
        }
コード例 #3
0
        private static HttpRequestFeature BuildRequestFeature(ModuleHttpRequest message)
        {
            var requestFeature = new HttpRequestFeature
            {
                Method      = message.Method,
                Path        = message.Path,
                PathBase    = message.PathBase,
                Protocol    = message.Protocol,
                QueryString = message.QueryString,
                RawTarget   = message.RawTarget,
                Scheme      = message.Scheme,
                Body        = new MemoryStream(message.Body),
                Headers     = new HeaderDictionary()
            };

            foreach (var header in message.Headers)
            {
                requestFeature.Headers.Add(header.Key, new StringValues(header.Value));
            }

            return(requestFeature);
        }
コード例 #4
0
        private static async Task <ModuleHttpRequest> PackRequestMessage(HttpContext context)
        {
            var requestFeature = GetRequestFeature(context);

            var result = new ModuleHttpRequest
            {
                Method                           = requestFeature.Method,
                Path                             = requestFeature.Path,
                PathBase                         = requestFeature.PathBase,
                Protocol                         = requestFeature.Protocol,
                QueryString                      = requestFeature.QueryString,
                RawTarget                        = requestFeature.RawTarget,
                Scheme                           = requestFeature.Scheme,
                Body                             = requestFeature.Body == null?Array.Empty <byte>() : await requestFeature.Body.ToArrayAsync(),
                                         Headers = new Dictionary <string, string[]>()
            };

            foreach (var entry in requestFeature.Headers)
            {
                result.Headers.Add(entry.Key, entry.Value.ToArray());
            }

            return(result);
        }
コード例 #5
0
 private async Task <IDispatchResult> DispatchToEndPointAsync(EndPointAddress endPoint, ModuleHttpRequest moduleHttpRequest, CancellationToken cancellation)
 {
     return(await _dispatcher.DispatchAsync(new DispatchDataDictionary <ModuleHttpRequest>(moduleHttpRequest), publish : false, endPoint, cancellation));
 }