Unit tests for custom proxy server

pull/528/head
Koraniar 2020-05-04 12:04:19 -05:00
parent c45a316008
commit d03e80cea6
2 changed files with 61 additions and 15 deletions

View File

@ -153,24 +153,14 @@ namespace winsw
WebRequest request = WebRequest.Create(From); WebRequest request = WebRequest.Create(From);
if (!string.IsNullOrEmpty(Proxy)) if (!string.IsNullOrEmpty(Proxy))
{ {
if (Proxy.Contains("@")) CustomProxyInformation proxyInformation = new CustomProxyInformation(Proxy);
if (proxyInformation.Credentials != null)
{ {
// Extract proxy credentials request.Proxy = new WebProxy(proxyInformation.ServerAddress, false, null, proxyInformation.Credentials);
int credsFrom = Proxy.IndexOf("://") + 3;
int credsTo = Proxy.IndexOf("@");
string completeCredsStr = Proxy.Substring(credsFrom, credsTo - credsFrom);
int credsSeparator = completeCredsStr.IndexOf(":");
string proxyAddress = Proxy.Replace(completeCredsStr + "@", "");
string username = completeCredsStr.Substring(0, credsSeparator);
string password = completeCredsStr.Substring(credsSeparator + 1);
ICredentials credentials = new NetworkCredential(username, password);
request.Proxy = new WebProxy(proxyAddress, false, null, credentials);
} }
else else
{ {
request.Proxy = new WebProxy(Proxy); request.Proxy = new WebProxy(proxyInformation.ServerAddress);
} }
} }
@ -246,8 +236,8 @@ namespace winsw
} }
} }
} }
#if NET20
#if NET20
private static void CopyStream(Stream source, Stream destination) private static void CopyStream(Stream source, Stream destination)
{ {
byte[] buffer = new byte[8192]; byte[] buffer = new byte[8192];
@ -259,4 +249,31 @@ namespace winsw
} }
#endif #endif
} }
public class CustomProxyInformation
{
public string ServerAddress { get; set; }
public NetworkCredential? Credentials { get; set; }
public CustomProxyInformation(string proxy)
{
if (proxy.Contains("@"))
{
// Extract proxy credentials
int credsFrom = proxy.IndexOf("://") + 3;
int credsTo = proxy.LastIndexOf("@");
string completeCredsStr = proxy.Substring(credsFrom, credsTo - credsFrom);
int credsSeparator = completeCredsStr.IndexOf(":");
string username = completeCredsStr.Substring(0, credsSeparator);
string password = completeCredsStr.Substring(credsSeparator + 1);
Credentials = new NetworkCredential(username, password);
ServerAddress = proxy.Replace(completeCredsStr + "@", "");
}
else
{
ServerAddress = proxy;
}
}
}
} }

View File

@ -202,6 +202,35 @@ namespace winswTests
Assert.That(() => GetSingleEntry(sd), Throws.TypeOf<InvalidDataException>().With.Message.StartsWith("Cannot parse <auth> Enum value from string 'digest'")); Assert.That(() => GetSingleEntry(sd), Throws.TypeOf<InvalidDataException>().With.Message.StartsWith("Cannot parse <auth> Enum value from string 'digest'"));
} }
[TestCase("http://", "127.0.0.1:80", "egarcia", "Passw0rd")]
[TestCase("https://", "myurl.com.co:2298", "MyUsername", "P@ssw:rd")]
[TestCase("http://", "192.168.0.8:3030")]
public void Proxy_Credentials(string protocol, string address, string username = null, string password = null)
{
CustomProxyInformation cpi;
if (string.IsNullOrEmpty(username))
{
cpi = new CustomProxyInformation(protocol + address + "/");
}
else
{
cpi = new CustomProxyInformation(protocol + username + ":" + password + "@" + address + "/");
}
Assert.That(cpi.ServerAddress, Is.EqualTo(protocol + address + "/"));
if (string.IsNullOrEmpty(username))
{
Assert.IsNull(cpi.Credentials);
}
else
{
Assert.IsNotNull(cpi.Credentials);
Assert.That(cpi.Credentials.UserName, Is.EqualTo(username));
Assert.That(cpi.Credentials.Password, Is.EqualTo(password));
}
}
private Download GetSingleEntry(ServiceDescriptor sd) private Download GetSingleEntry(ServiceDescriptor sd)
{ {
var downloads = sd.Downloads.ToArray(); var downloads = sd.Downloads.ToArray();