// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.ObjectModel; using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Http.Connections; using Microsoft.AspNetCore.Http.Connections.Client; using Microsoft.AspNetCore.Http.Connections.Internal; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.SignalR.Client { public static class HubConnectionBuilderHttpExtensions { public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, string url) { hubConnectionBuilder.WithUrlCore(new Uri(url), null, _ => { }); return hubConnectionBuilder; } public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, string url, Action configureHttpConnection) { hubConnectionBuilder.WithUrlCore(new Uri(url), null, configureHttpConnection); return hubConnectionBuilder; } public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, string url, HttpTransportType transports) { hubConnectionBuilder.WithUrlCore(new Uri(url), transports, _ => { }); return hubConnectionBuilder; } public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, string url, HttpTransportType transports, Action configureHttpConnection) { hubConnectionBuilder.WithUrlCore(new Uri(url), transports, configureHttpConnection); return hubConnectionBuilder; } public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, Uri url) { hubConnectionBuilder.WithUrlCore(url, null, _ => { }); return hubConnectionBuilder; } public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, Uri url, Action configureHttpConnection) { hubConnectionBuilder.WithUrlCore(url, null, configureHttpConnection); return hubConnectionBuilder; } public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, Uri url, HttpTransportType transports) { hubConnectionBuilder.WithUrlCore(url, null, _ => { }); return hubConnectionBuilder; } public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder hubConnectionBuilder, Uri url, HttpTransportType transports, Action configureHttpConnection) { hubConnectionBuilder.WithUrlCore(url, transports, _ => { }); return hubConnectionBuilder; } private static IHubConnectionBuilder WithUrlCore(this IHubConnectionBuilder hubConnectionBuilder, Uri url, HttpTransportType? transports, Action configureHttpConnection) { hubConnectionBuilder.Services.Configure(o => { o.Url = url; if (transports != null) { o.Transports = transports.Value; } }); if (configureHttpConnection != null) { hubConnectionBuilder.Services.Configure(configureHttpConnection); } hubConnectionBuilder.Services.AddSingleton(services => { var value = services.GetService>().Value; var httpOptions = new HttpOptions { HttpMessageHandlerFactory = value.MessageHandlerFactory, Headers = value._headers != null ? new ReadOnlyDictionary(value._headers) : null, AccessTokenFactory = value.AccessTokenFactory, WebSocketOptions = value.WebSocketOptions, Cookies = value._cookies, Proxy = value.Proxy, UseDefaultCredentials = value.UseDefaultCredentials, ClientCertificates = value._clientCertificates, Credentials = value.Credentials, }; Func createConnection = () => new HttpConnection( value.Url, value.Transports, services.GetService(), httpOptions); return createConnection; }); return hubConnectionBuilder; } } }