/// <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)); }
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); }
/// <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)); }
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); }
/// <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);