From 94dba8ff0e7e6de52f38cdc7c24477fe727ba671 Mon Sep 17 00:00:00 2001 From: Steve Smith Date: Wed, 1 Jul 2015 12:49:18 -0400 Subject: [PATCH] Moved address parsing to ServerAddress --- src/Kestrel/ServerAddress.cs | 63 ++++++++++++++++++++++++-- src/Kestrel/ServerInformation.cs | 78 ++------------------------------ 2 files changed, 62 insertions(+), 79 deletions(-) diff --git a/src/Kestrel/ServerAddress.cs b/src/Kestrel/ServerAddress.cs index b957b62791..dfbe1ff3df 100644 --- a/src/Kestrel/ServerAddress.cs +++ b/src/Kestrel/ServerAddress.cs @@ -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; + } } } \ No newline at end of file diff --git a/src/Kestrel/ServerInformation.cs b/src/Kestrel/ServerInformation.cs index 7df85df587..dfbde7e91d 100644 --- a/src/Kestrel/ServerInformation.cs +++ b/src/Kestrel/ServerInformation.cs @@ -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 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; - } } }