Exemple #1
0
        /// <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.");
        }
    }
Exemple #2
0
        /// <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;
 }