예제 #1
0
        public async Task SendAsync_ShouldNotTriggerAlternativeHostIfItIsDisabled()
        {
            // Arrange
            _appSettings.DoHEnabled.Returns(false);
            _appSettings.ActiveAlternativeApiBaseUrl = "alternative.api.url";
            _appSettings.LastPrimaryApiFail          = DateTime.Now;

            var handler = new AlternativeHostHandler(
                new DohClients(new List <string> {
                "provider1", "provider2"
            }, TimeSpan.FromSeconds(10)),
                new MainHostname("https://api.protonvpn.ch"),
                _appSettings,
                "api.protonvpn.ch")
            {
                InnerHandler = _innerHandler
            };

            var client = new HttpClient(handler)
            {
                BaseAddress = _baseAddress
            };

            _innerHandler.Expect(HttpMethod.Get, _baseAddress.ToString()).Respond(HttpStatusCode.OK);

            var result = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, _baseAddress));

            result.RequestMessage.RequestUri.Should().Be(_baseAddress);
        }
예제 #2
0
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);

            builder.RegisterType <ServicePointConfiguration>().SingleInstance();
            builder.RegisterType <ServerManager>().SingleInstance();
            builder.RegisterType <ActiveUrls>().As <IActiveUrls>().SingleInstance();
            builder.RegisterType <ApiAppVersion>().As <IApiAppVersion>().SingleInstance();
            builder.RegisterType <OsEnvironment>().As <IEnvironment>().SingleInstance();
            builder.RegisterType <SystemProcesses>().As <IOsProcesses>().SingleInstance();
            builder.Register(c =>
                             new SafeSystemNetworkInterfaces(
                                 c.Resolve <ILogger>(),
                                 new SystemNetworkInterfaces(
                                     c.Resolve <ILogger>())))
            .As <INetworkInterfaces>().SingleInstance();
            builder.RegisterType <HttpClients>().As <IHttpClients>().SingleInstance();
            builder.Register(c => Schedulers.FromApplicationDispatcher()).As <IScheduler>().SingleInstance();
            builder.Register(c => new TokenStorage(c.Resolve <UserSettings>())).As <ITokenStorage>().SingleInstance();

            builder.Register(c =>
                             new CertificateHandler(
                                 c.Resolve <Common.Configuration.Config>().TlsPinningConfig,
                                 c.Resolve <IReportClient>())).SingleInstance();

            builder.Register(c =>
                             new SafeDnsHandler(
                                 c.Resolve <IEventAggregator>(),
                                 c.Resolve <IDnsClient>())
            {
                InnerHandler = c.Resolve <CertificateHandler>()
            }).SingleInstance();

            builder.Register(c =>
                             new LoggingHandler(
                                 c.Resolve <ILogger>())
            {
                InnerHandler = c.Resolve <SafeDnsHandler>()
            });

            builder.Register(c =>
                             new RetryingHandler(
                                 c.Resolve <Common.Configuration.Config>().ApiTimeout,
                                 c.Resolve <Common.Configuration.Config>().ApiRetries,
                                 (retryCount, response, context) => new SleepDurationProvider(response).Value())
            {
                InnerHandler = c.Resolve <LoggingHandler>()
            }).SingleInstance();

            builder.Register(c =>
                             new OutdatedAppHandler
            {
                InnerHandler = c.Resolve <RetryingHandler>()
            }).SingleInstance();

            builder.Register(c =>
                             new UnauthorizedResponseHandler(
                                 c.Resolve <ITokenClient>(),
                                 c.Resolve <ITokenStorage>(),
                                 c.Resolve <IUserStorage>())
            {
                InnerHandler = c.Resolve <OutdatedAppHandler>()
            }).SingleInstance();

            builder.Register(c =>
                             new CancellingHandler
            {
                InnerHandler = c.Resolve <UnauthorizedResponseHandler>()
            }).SingleInstance();

            builder.Register(c =>
                             new AlternativeHostHandler(c.Resolve <DohClients>(),
                                                        c.Resolve <MainHostname>(),
                                                        c.Resolve <IAppSettings>(),
                                                        c.Resolve <GuestHoleState>(),
                                                        new Uri(c.Resolve <Common.Configuration.Config>().Urls.ApiUrl).Host)
            {
                InnerHandler = c.Resolve <CancellingHandler>()
            }).SingleInstance();

            builder.Register(c =>
                             new TokenClient(
                                 new HttpClient(c.Resolve <RetryingHandler>())
            {
                BaseAddress = c.Resolve <IActiveUrls>().ApiUrl.Uri
            },
                                 c.Resolve <IApiAppVersion>(),
                                 c.Resolve <ITokenStorage>(),
                                 c.Resolve <Common.Configuration.Config>().ApiVersion,
                                 TranslationSource.Instance.CurrentCulture.Name))
            .As <ITokenClient>()
            .SingleInstance();

            builder.Register(c =>
            {
                var certificateHandler = new CertificateHandler(
                    c.Resolve <Common.Configuration.Config>().TlsPinningConfig,
                    c.Resolve <IReportClient>());

                var safeDnsHandler = new SafeDnsHandler(
                    c.Resolve <IEventAggregator>(),
                    c.Resolve <IDnsClient>())
                {
                    InnerHandler = certificateHandler
                };

                var loggingHandler = new LoggingHandler(
                    c.Resolve <ILogger>())
                {
                    InnerHandler = safeDnsHandler
                };

                var retryingHandler = new RetryingHandler(
                    c.Resolve <Common.Configuration.Config>().ApiTimeout,
                    c.Resolve <Common.Configuration.Config>().ApiRetries,
                    (retryCount, response, context) => new SleepDurationProvider(response).Value())
                {
                    InnerHandler = loggingHandler
                };

                var alternativeHostHandler = new AlternativeHostHandler(
                    c.Resolve <DohClients>(),
                    c.Resolve <MainHostname>(),
                    c.Resolve <IAppSettings>(),
                    c.Resolve <GuestHoleState>(),
                    new Uri(c.Resolve <Common.Configuration.Config>().Urls.ApiUrl).Host)
                {
                    InnerHandler = retryingHandler
                };

                return(new ApiClient(
                           new HttpClient(c.Resolve <AlternativeHostHandler>())
                {
                    BaseAddress = c.Resolve <IActiveUrls>().ApiUrl.Uri
                },
                           new HttpClient(alternativeHostHandler)
                {
                    BaseAddress = c.Resolve <IActiveUrls>().ApiUrl.Uri,
                    DefaultRequestHeaders = { ConnectionClose = true }
                },
                           c.Resolve <ILogger>(),
                           c.Resolve <ITokenStorage>(),
                           c.Resolve <IApiAppVersion>(),
                           c.Resolve <Common.Configuration.Config>().ApiVersion,
                           TranslationSource.Instance.CurrentCulture.Name));
            })
            .As <IApiClient>()
            .SingleInstance();

            builder.Register(c => new NLogLoggingConfiguration(c.Resolve <Common.Configuration.Config>().AppLogFolder, "app"))
            .AsSelf().SingleInstance();
            builder.RegisterType <NLogLoggerFactory>().As <ILoggerFactory>().SingleInstance();
            builder.Register(c => c.Resolve <ILoggerFactory>().Logger())
            .As <ILogger>().SingleInstance();
            builder.RegisterType <LogCleaner>().SingleInstance();
            builder.RegisterType <UpdateService>().AsSelf().AsImplementedInterfaces().SingleInstance();
            builder.RegisterType <ServiceClient>().SingleInstance();
            builder.RegisterType <UpdateEvents>().SingleInstance();

            builder.RegisterType <UserValidator>().SingleInstance();

            builder.Register(c => new UserAuth(
                                 c.Resolve <IApiClient>(),
                                 c.Resolve <ILogger>(),
                                 c.Resolve <IUserStorage>(),
                                 c.Resolve <ITokenStorage>())).SingleInstance();

            builder.RegisterType <NetworkClient>().AsImplementedInterfaces().SingleInstance();
            builder.RegisterType <DnsClients>().As <IDnsClients>().SingleInstance();
            builder.Register(c =>
                             new SafeDnsClient(
                                 new DnsClient(
                                     c.Resolve <IDnsClients>(),
                                     c.Resolve <INetworkInterfaces>())))
            .As <IDnsClient>().SingleInstance();

            builder.Register(c =>
                             new CachingReportClient(
                                 new ReportClient(c.Resolve <IActiveUrls>().TlsReportUrl.Uri)))
            .As <IReportClient>()
            .SingleInstance();

            builder.RegisterType <EventClient>().SingleInstance();
            builder.RegisterType <UserInfoHandler>().AsImplementedInterfaces().SingleInstance();

            builder.RegisterType <VpnProfileHandler>().AsImplementedInterfaces().SingleInstance();
            builder.RegisterType <VpnCredentialProvider>().SingleInstance();
            builder.Register(c => new EventTimer(
                                 c.Resolve <EventClient>(),
                                 c.Resolve <Common.Configuration.Config>().EventCheckInterval.RandomizedWithDeviation(0.2)))
            .AsSelf()
            .AsImplementedInterfaces()
            .SingleInstance();
            builder.Register(c => new SafeSystemProxy(c.Resolve <ILogger>(), new SystemProxy()))
            .AsImplementedInterfaces()
            .SingleInstance();
            builder.Register(c => new MainHostname(c.Resolve <Common.Configuration.Config>().Urls.ApiUrl)).SingleInstance();
            builder.Register(c => new DohClients(
                                 c.Resolve <Common.Configuration.Config>().DoHProviders,
                                 c.Resolve <Common.Configuration.Config>().DohClientTimeout))
            .SingleInstance();
            builder.RegisterType <UnhandledExceptionLogging>().SingleInstance();
        }