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.
|
||||
// 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
|
||||
{
|
||||
public class ServerAddress
|
||||
{
|
||||
public string Host { get; internal set; }
|
||||
public string Path { get; internal set; }
|
||||
public int Port { get; internal set; }
|
||||
public string Scheme { get; internal set; }
|
||||
public string Host { get; private set; }
|
||||
public string Path { get; private set; }
|
||||
public int Port { get; private 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.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using Microsoft.AspNet.Hosting.Server;
|
||||
using Microsoft.Framework.Configuration;
|
||||
|
||||
|
|
@ -25,20 +24,10 @@ namespace Kestrel
|
|||
}
|
||||
foreach (var url in urls.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
string scheme;
|
||||
string host;
|
||||
int port;
|
||||
string path;
|
||||
if (DeconstructUrl(url, out scheme, out host, out port, out path))
|
||||
var address = ServerAddress.FromUrl(url);
|
||||
if(address != null)
|
||||
{
|
||||
Addresses.Add(
|
||||
new ServerAddress
|
||||
{
|
||||
Scheme = scheme,
|
||||
Host = host,
|
||||
Port = port,
|
||||
Path = path
|
||||
});
|
||||
Addresses.Add(address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -52,66 +41,5 @@ namespace Kestrel
|
|||
}
|
||||
|
||||
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