Moved address parsing to ServerAddress
This commit is contained in:
parent
98995132de
commit
94dba8ff0e
|
|
@ -1,13 +1,68 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
namespace Kestrel
|
namespace Kestrel
|
||||||
{
|
{
|
||||||
public class ServerAddress
|
public class ServerAddress
|
||||||
{
|
{
|
||||||
public string Host { get; internal set; }
|
public string Host { get; private set; }
|
||||||
public string Path { get; internal set; }
|
public string Path { get; private set; }
|
||||||
public int Port { get; internal set; }
|
public int Port { get; private set; }
|
||||||
public string Scheme { get; internal set; }
|
public string Scheme { get; private set; }
|
||||||
|
|
||||||
|
public static ServerAddress FromUrl(string url)
|
||||||
|
{
|
||||||
|
url = url ?? string.Empty;
|
||||||
|
|
||||||
|
int delimiterStart1 = url.IndexOf("://", StringComparison.Ordinal);
|
||||||
|
if (delimiterStart1 < 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int delimiterEnd1 = delimiterStart1 + "://".Length;
|
||||||
|
|
||||||
|
int delimiterStart3 = url.IndexOf("/", delimiterEnd1, StringComparison.Ordinal);
|
||||||
|
if (delimiterStart3 < 0)
|
||||||
|
{
|
||||||
|
delimiterStart3 = url.Length;
|
||||||
|
}
|
||||||
|
int delimiterStart2 = url.LastIndexOf(":", delimiterStart3 - 1, delimiterStart3 - delimiterEnd1, StringComparison.Ordinal);
|
||||||
|
int delimiterEnd2 = delimiterStart2 + ":".Length;
|
||||||
|
if (delimiterStart2 < 0)
|
||||||
|
{
|
||||||
|
delimiterStart2 = delimiterStart3;
|
||||||
|
delimiterEnd2 = delimiterStart3;
|
||||||
|
}
|
||||||
|
var serverAddress = new ServerAddress();
|
||||||
|
serverAddress.Scheme = url.Substring(0, delimiterStart1);
|
||||||
|
string portString = url.Substring(delimiterEnd2, delimiterStart3 - delimiterEnd2);
|
||||||
|
int portNumber;
|
||||||
|
if (int.TryParse(portString, NumberStyles.Integer, CultureInfo.InvariantCulture, out portNumber))
|
||||||
|
{
|
||||||
|
serverAddress.Host = url.Substring(delimiterEnd1, delimiterStart2 - delimiterEnd1);
|
||||||
|
serverAddress.Port = portNumber;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (string.Equals(serverAddress.Scheme, "http", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
serverAddress.Port = 80;
|
||||||
|
}
|
||||||
|
else if (string.Equals(serverAddress.Scheme, "https", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
serverAddress.Port = 443;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
serverAddress.Port = 0;
|
||||||
|
}
|
||||||
|
serverAddress.Host = url.Substring(delimiterEnd1, delimiterStart3 - delimiterEnd1);
|
||||||
|
}
|
||||||
|
serverAddress.Path = url.Substring(delimiterStart3);
|
||||||
|
return serverAddress;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
|
||||||
using Microsoft.AspNet.Hosting.Server;
|
using Microsoft.AspNet.Hosting.Server;
|
||||||
using Microsoft.Framework.Configuration;
|
using Microsoft.Framework.Configuration;
|
||||||
|
|
||||||
|
|
@ -25,20 +24,10 @@ namespace Kestrel
|
||||||
}
|
}
|
||||||
foreach (var url in urls.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
|
foreach (var url in urls.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
|
||||||
{
|
{
|
||||||
string scheme;
|
var address = ServerAddress.FromUrl(url);
|
||||||
string host;
|
if(address != null)
|
||||||
int port;
|
|
||||||
string path;
|
|
||||||
if (DeconstructUrl(url, out scheme, out host, out port, out path))
|
|
||||||
{
|
{
|
||||||
Addresses.Add(
|
Addresses.Add(address);
|
||||||
new ServerAddress
|
|
||||||
{
|
|
||||||
Scheme = scheme,
|
|
||||||
Host = host,
|
|
||||||
Port = port,
|
|
||||||
Path = path
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -52,66 +41,5 @@ namespace Kestrel
|
||||||
}
|
}
|
||||||
|
|
||||||
public IList<ServerAddress> Addresses { get; private set; }
|
public IList<ServerAddress> Addresses { get; private set; }
|
||||||
|
|
||||||
internal static bool DeconstructUrl(
|
|
||||||
string url,
|
|
||||||
out string scheme,
|
|
||||||
out string host,
|
|
||||||
out int port,
|
|
||||||
out string path)
|
|
||||||
{
|
|
||||||
url = url ?? string.Empty;
|
|
||||||
|
|
||||||
int delimiterStart1 = url.IndexOf("://", StringComparison.Ordinal);
|
|
||||||
if (delimiterStart1 < 0)
|
|
||||||
{
|
|
||||||
scheme = null;
|
|
||||||
host = null;
|
|
||||||
port = 0;
|
|
||||||
path = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int delimiterEnd1 = delimiterStart1 + "://".Length;
|
|
||||||
|
|
||||||
int delimiterStart3 = url.IndexOf("/", delimiterEnd1, StringComparison.Ordinal);
|
|
||||||
if (delimiterStart3 < 0)
|
|
||||||
{
|
|
||||||
delimiterStart3 = url.Length;
|
|
||||||
}
|
|
||||||
int delimiterStart2 = url.LastIndexOf(":", delimiterStart3 - 1, delimiterStart3 - delimiterEnd1, StringComparison.Ordinal);
|
|
||||||
int delimiterEnd2 = delimiterStart2 + ":".Length;
|
|
||||||
if (delimiterStart2 < 0)
|
|
||||||
{
|
|
||||||
delimiterStart2 = delimiterStart3;
|
|
||||||
delimiterEnd2 = delimiterStart3;
|
|
||||||
}
|
|
||||||
|
|
||||||
scheme = url.Substring(0, delimiterStart1);
|
|
||||||
string portString = url.Substring(delimiterEnd2, delimiterStart3 - delimiterEnd2);
|
|
||||||
int portNumber;
|
|
||||||
if (int.TryParse(portString, NumberStyles.Integer, CultureInfo.InvariantCulture, out portNumber))
|
|
||||||
{
|
|
||||||
host = url.Substring(delimiterEnd1, delimiterStart2 - delimiterEnd1);
|
|
||||||
port = portNumber;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (string.Equals(scheme, "http", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
port = 80;
|
|
||||||
}
|
|
||||||
else if (string.Equals(scheme, "https", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
port = 443;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
port = 0;
|
|
||||||
}
|
|
||||||
host = url.Substring(delimiterEnd1, delimiterStart3 - delimiterEnd1);
|
|
||||||
}
|
|
||||||
path = url.Substring(delimiterStart3);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue