예제 #1
0
        /// <inheritdoc />
        public IFluentHttpClient Add(FluentHttpClientOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            if (string.IsNullOrEmpty(options.Identifier))
            {
                throw ClientBuilderValidationException.FieldNotSpecified(nameof(options.Identifier));
            }

            if (Has(options.Identifier))
            {
                throw new ClientBuilderValidationException($"FluentHttpClient '{options.Identifier}' is already registered.");
            }

            if (string.IsNullOrEmpty(options.BaseUrl))
            {
                throw ClientBuilderValidationException.FieldNotSpecified(nameof(options.BaseUrl));
            }

            // todo: find a way how to use DI with additional param (or so) to factory for abstraction.
            var client = (IFluentHttpClient)ActivatorUtilities.CreateInstance <FluentHttpClient>(_serviceProvider, options);

            _clientsMap.Add(options.Identifier, client);
            return(client);
        }
        /// <summary>
        /// Add/register HTTP client from options.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="options">options to register.</param>
        /// <returns>Returns HTTP client created.</returns>
        public static IFluentHttpClient Add(this IFluentHttpClientFactory factory, FluentHttpClientOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var builder = factory.CreateBuilder(options.Identifier)
                          .FromOptions(options);

            return(factory.Add(builder));
        }
예제 #3
0
        private HttpClient Configure(FluentHttpClientOptions options)
        {
            var httpClient = options.HttpMessageHandler == null
                         ? _httpClientFactory.CreateClient(options.Identifier)
                         : new HttpClient(options.HttpMessageHandler);

            httpClient.BaseAddress = new Uri(options.BaseUrl);
            httpClient.DefaultRequestHeaders.Add(HeaderTypes.Accept, Formatters.SelectMany(x => x.SupportedMediaTypes).Select(x => x.MediaType));
            httpClient.Timeout = options.Timeout;

            httpClient.DefaultRequestHeaders.AddRange(options.Headers);

            return(httpClient);
        }
        /// <summary>
        /// Initializes an instance of <see cref="FluentHttpClient"/>.
        /// </summary>
        /// <param name="options"></param>
        /// <param name="serviceProvider"></param>
        /// <param name="middlewareRunner"></param>
        public FluentHttpClient(FluentHttpClientOptions options, IServiceProvider serviceProvider, IFluentHttpMiddlewareRunner middlewareRunner)
        {
            _serviceProvider        = serviceProvider;
            _middlewareRunner       = middlewareRunner;
            _middleware             = options.Middleware;
            _requestBuilderDefaults = options.RequestBuilderDefaults;

            Identifier       = options.Identifier;
            BaseUrl          = options.BaseUrl;
            Formatters       = options.Formatters;
            DefaultFormatter = options.DefaultFormatter;

            RawHttpClient = Configure(options);
            Headers       = RawHttpClient.DefaultRequestHeaders;
        }
        /// <summary>
        /// Set options from the specified options config.
        /// </summary>
        /// <param name="options"></param>
        /// <returns></returns>
        public FluentHttpClientBuilder FromOptions(FluentHttpClientOptions options)
        {
            _timeout   = options.Timeout;
            _baseUrl   = options.BaseUrl;
            Identifier = options.Identifier;
            WithHeaders(options.Headers);
            _middlewareBuilder.AddRange(options.MiddlewareBuilder.GetAll());
            _requestBuilderDefaults = options.RequestBuilderDefaults;
            _httpMessageHandler     = options.HttpMessageHandler;
            var formatters = _formatterOptions.Formatters.Union(options.Formatters, MediaTypeFormatterComparer.Instance).ToList();

            _formatterOptions.Formatters.Clear();
            _formatterOptions.Formatters.AddRange(formatters);
            _formatterOptions.Default = options.DefaultFormatter;

            return(this);
        }
        private HttpClient Configure(FluentHttpClientOptions options)
        {
            var httpClient = options.HttpMessageHandler == null
                                ? new HttpClient()
                                : new HttpClient(options.HttpMessageHandler);

            httpClient.BaseAddress = new Uri(options.BaseUrl);
            httpClient.DefaultRequestHeaders.Add(HeaderTypes.Accept, Formatters.SelectMany(x => x.SupportedMediaTypes).Select(x => x.MediaType));
            httpClient.Timeout = options.Timeout;

            foreach (var headerEntry in options.Headers)
            {
                httpClient.DefaultRequestHeaders.Add(headerEntry.Key, headerEntry.Value);
            }

            return(httpClient);
        }
예제 #7
0
        /// <summary>
        /// Build up HTTP client options.
        /// </summary>
        /// <returns>Returns HTTP client options.</returns>
        public FluentHttpClientOptions Build()
        {
            _formatterOptions.Resort();
            var options = new FluentHttpClientOptions
            {
                Timeout                = _timeout,
                BaseUrl                = _baseUrl,
                Identifier             = Identifier,
                Headers                = _headers,
                Middleware             = _middleware,
                RequestBuilderDefaults = _requestBuilderDefaults,
                HttpMessageHandler     = _httpMessageHandler,
                Formatters             = _formatterOptions.Formatters,
                DefaultFormatter       = _formatterOptions.Default
            };

            return(options);
        }
        /// <summary>
        /// Build a new HTTP client.
        /// </summary>
        /// <typeparam name="THttpClient">HttpClient type</typeparam>
        /// <param name="options"></param>
        public IFluentHttpClient Build <THttpClient>(FluentHttpClientOptions options = null)
            where THttpClient : IFluentHttpClient
        {
            if (options == null)
            {
                options = BuildOptions();
            }

            if (string.IsNullOrEmpty(options.Identifier))
            {
                throw ClientBuilderValidationException.FieldNotSpecified(nameof(options.Identifier));
            }

            if (string.IsNullOrEmpty(options.BaseUrl))
            {
                throw ClientBuilderValidationException.FieldNotSpecified(nameof(options.BaseUrl));
            }

            return(ActivatorUtilities.CreateInstance <THttpClient>(_serviceProvider, options, _fluentHttpClientFactory));
        }
예제 #9
0
        private HttpClient Configure(FluentHttpClientOptions options)
        {
            var httpHandler = new FluentMiddlewareHttpHandler(
                _middlewareRunner,
                this,
                _requestTracker,
                options.HttpMessageHandler
                );

            var httpClient = new HttpClient(httpHandler)
            {
                BaseAddress = new Uri(options.BaseUrl)
            };

            httpClient.DefaultRequestHeaders.Add(HeaderTypes.Accept, Formatters.SelectMany(x => x.SupportedMediaTypes).Select(x => x.MediaType));
            httpClient.Timeout = options.Timeout;

            httpClient.DefaultRequestHeaders.AddRange(options.Headers);

            return(httpClient);
        }
예제 #10
0
        /// <summary>
        /// Initializes an instance of <see cref="FluentHttpClient"/>.
        /// </summary>
        /// <param name="options"></param>
        /// <param name="clientFactory"></param>
        /// <param name="serviceProvider"></param>
        public FluentHttpClient(
            FluentHttpClientOptions options,
            IFluentHttpClientFactory clientFactory,
            IServiceProvider serviceProvider
            )
        {
            _options                = options;
            _clientFactory          = clientFactory;
            _serviceProvider        = serviceProvider;
            _requestBuilderDefaults = options.RequestBuilderDefaults;
            _middlewareBuilder      = options.MiddlewareBuilder;
            _requestTracker         = new RequestTracker();

            Identifier       = options.Identifier;
            BaseUrl          = options.BaseUrl;
            Formatters       = options.Formatters;
            DefaultFormatter = options.DefaultFormatter;

            _middlewareRunner = options.MiddlewareBuilder.Build(this);
            RawHttpClient     = Configure(options);
            Headers           = RawHttpClient.DefaultRequestHeaders;
        }
 /// <summary>
 /// Builds a new HTTP client (with default <see cref="FluentHttpClient"/> implementation).
 /// </summary>
 /// <param name="options"></param>
 public IFluentHttpClient Build(FluentHttpClientOptions options = null)
 => Build <FluentHttpClient>(options);