Skip to content
45 changes: 30 additions & 15 deletions Flow.Launcher.Infrastructure/Http/Http.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Interop;
using Flow.Launcher.Plugin;

namespace Flow.Launcher.Infrastructure.Http
{
Expand All @@ -18,6 +20,8 @@ public static class Http

private static HttpClient client = new HttpClient();

public static IPublicAPI API { get; set; }

static Http()
{
// need to be added so it would work on a win10 machine
Expand Down Expand Up @@ -50,25 +54,36 @@ public static HttpProxy Proxy
/// </summary>
public static void UpdateProxy(ProxyProperty property)
{
(WebProxy.Address, WebProxy.Credentials) = property switch
if (string.IsNullOrEmpty(Proxy.Server))
return;

try
{
ProxyProperty.Enabled => Proxy.Enabled switch
(WebProxy.Address, WebProxy.Credentials) = property switch
{
true => Proxy.UserName switch
ProxyProperty.Enabled => Proxy.Enabled switch
{
var userName when !string.IsNullOrEmpty(userName) =>
(new Uri($"http://{Proxy.Server}:{Proxy.Port}"), null),
_ => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"),
new NetworkCredential(Proxy.UserName, Proxy.Password))
true when !string.IsNullOrEmpty(Proxy.Server) => Proxy.UserName switch
{
var userName when string.IsNullOrEmpty(userName) =>
(new Uri($"http://{Proxy.Server}:{Proxy.Port}"), null),
_ => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"),
new NetworkCredential(Proxy.UserName, Proxy.Password))
},
_ => (null, null)
},
false => (null, null)
},
ProxyProperty.Server => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"), WebProxy.Credentials),
ProxyProperty.Port => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"), WebProxy.Credentials),
ProxyProperty.UserName => (WebProxy.Address, new NetworkCredential(Proxy.UserName, Proxy.Password)),
ProxyProperty.Password => (WebProxy.Address, new NetworkCredential(Proxy.UserName, Proxy.Password)),
_ => throw new ArgumentOutOfRangeException()
};
ProxyProperty.Server => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"), WebProxy.Credentials),
ProxyProperty.Port => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"), WebProxy.Credentials),
ProxyProperty.UserName => (WebProxy.Address, new NetworkCredential(Proxy.UserName, Proxy.Password)),
ProxyProperty.Password => (WebProxy.Address, new NetworkCredential(Proxy.UserName, Proxy.Password)),
_ => throw new ArgumentOutOfRangeException()
};
}
catch(UriFormatException e)
{
API.ShowMsg("Please try again", "Unable to parse Http Proxy");
Log.Exception("Flow.Launcher.Infrastructure.Http", "Unable to parse Uri", e);
}
}

public static async Task DownloadAsync([NotNull] string url, [NotNull] string filePath, CancellationToken token = default)
Expand Down
33 changes: 33 additions & 0 deletions Flow.Launcher.Test/HttpTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Text;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Infrastructure.Http;

namespace Flow.Launcher.Test
{
[TestFixture]
class HttpTest
{
[Test]
public void GivenHttpProxy_WhenUpdated_ThenWebProxyShouldAlsoBeUpdatedToTheSame()
{
HttpProxy proxy = new HttpProxy();
Http.Proxy = proxy;

proxy.Enabled = true;
proxy.Server = "127.0.0.1";
Assert.AreEqual(Http.WebProxy.Address, new Uri($"http://{proxy.Server}:{proxy.Port}"));
Assert.IsNull(Http.WebProxy.Credentials);

proxy.UserName = "test";
Assert.NotNull(Http.WebProxy.Credentials);
Assert.AreEqual(Http.WebProxy.Credentials.GetCredential(Http.WebProxy.Address, "Basic").UserName, proxy.UserName);
Assert.AreEqual(Http.WebProxy.Credentials.GetCredential(Http.WebProxy.Address, "Basic").Password, "");

proxy.Password = "test password";
Assert.AreEqual(Http.WebProxy.Credentials.GetCredential(Http.WebProxy.Address, "Basic").Password, proxy.Password);
}
}
}
5 changes: 4 additions & 1 deletion Flow.Launcher/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ await Stopwatch.NormalAsync("|App.OnStartup|Startup cost", async () =>
_settingsVM = new SettingWindowViewModel(_updater, _portable);
_settings = _settingsVM.Settings;

Http.Proxy = _settings.Proxy;

_alphabet.Initialize(_settings);
_stringMatcher = new StringMatcher(_alphabet);
Expand All @@ -71,6 +70,10 @@ await Stopwatch.NormalAsync("|App.OnStartup|Startup cost", async () =>
PluginManager.LoadPlugins(_settings.PluginSettings);
_mainVM = new MainViewModel(_settings);
API = new PublicAPIInstance(_settingsVM, _mainVM, _alphabet);

Http.API = API;
Http.Proxy = _settings.Proxy;

await PluginManager.InitializePlugins(API);
var window = new MainWindow(_settings, _mainVM);

Expand Down