Moved address parsing to ServerAddress

This commit is contained in:
Steve Smith 2015-07-01 12:49:18 -04:00 committed by Stephen Halter
parent 98995132de
commit 94dba8ff0e
2 changed files with 62 additions and 79 deletions

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}