/// <summary> /// Build configured <see cref="IFluentHttpMiddlewareRunner"/>. /// </summary> /// <param name="httpClient">HTTP client which consumes this.</param> public IFluentHttpMiddlewareRunner Build(IFluentHttpClient httpClient) { var middleware = _middleware.ToList(); middleware.Add(new FluentHttpMiddlewareConfig(typeof(ActionExecuteMiddleware))); var clientContext = new FluentHttpMiddlewareClientContext(httpClient.Identifier); IFluentHttpMiddleware previous = null; for (int i = middleware.Count; i-- > 0;) { var pipe = middleware[i]; var isLast = middleware.Count - 1 == i; var isFirst = i == 0; object[] ctor; if (!isLast) { FluentHttpMiddlewareDelegate next = previous.Invoke; if (pipe.Args == null) { ctor = new object[] { next, clientContext } } ; else { const int additionalCtorArgs = 2; ctor = new object[pipe.Args.Length + additionalCtorArgs]; ctor[0] = next; ctor[1] = clientContext; Array.Copy(pipe.Args, 0, ctor, additionalCtorArgs, pipe.Args.Length); } } else { ctor = new object[] { } }; var instance = (IFluentHttpMiddleware)ActivatorUtilities.CreateInstance(_serviceProvider, pipe.Type, ctor); if (isFirst) { return(new FluentHttpMiddlewareRunner(instance)); } previous = instance; } throw new InvalidOperationException("Middleware wasn't build correctly."); } }
/// <summary> /// Run specified middleware, and finally send the given request. /// </summary> /// <param name="middlewareCollection">Middleware to pipe.</param> /// <param name="request">Request to send.</param> /// <param name="send">Actual send function.</param> /// <returns>Returns response.</returns> public async Task <FluentHttpResponse> Run(IList <MiddlewareConfig> middlewareCollection, FluentHttpRequest request, FluentHttpRequestDelegate send) { if (middlewareCollection.Count == 0) { return(await send(request)); } FluentHttpResponse httpResult = null; IFluentHttpMiddleware previousMiddleware = null; for (int i = middlewareCollection.Count; i-- > 0;) { request.CancellationToken.ThrowIfCancellationRequested(); var middlewareOptions = middlewareCollection[i]; var isLast = middlewareCollection.Count - 1 == i; var isFirst = i == 0; var next = isLast ? send : previousMiddleware.Invoke; object[] ctor; if (middlewareOptions.Args == null) { ctor = new object[] { next } } ; else { ctor = new object[middlewareOptions.Args.Length + 1]; ctor[0] = next; Array.Copy(middlewareOptions.Args, 0, ctor, 1, middlewareOptions.Args.Length); } var instance = (IFluentHttpMiddleware)ActivatorUtilities.CreateInstance(_serviceProvider, middlewareOptions.Type, ctor); if (isFirst) { httpResult = await instance.Invoke(request); } else { previousMiddleware = instance; } } return(httpResult); }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="middleware">Middleware pipeline to execute.</param> public FluentHttpMiddlewareRunner(IFluentHttpMiddleware middleware) { _middleware = middleware; }