diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 8fa276d0c5..899732b65b 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -13,7 +13,7 @@ }, "commands": { "run": "Microsoft.AspNet.Server.Kestrel", - "run-socket": "Microsoft.AspNet.Server.Kestrel --server.urls unix:///tmp/kestrel-test.sock", + "run-socket": "Microsoft.AspNet.Server.Kestrel --server.urls http://unix:/tmp/kestrel-test.sock", "kestrel": "Microsoft.AspNet.Server.Kestrel", "web": "Microsoft.AspNet.Hosting" } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/Constants.cs index 76b5f1bd5d..06a2bed9d6 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/Constants.cs @@ -8,8 +8,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Infrastructure public const int ListenBacklog = 128; /// - /// URL scheme for specifying Unix sockets in the configuration. + /// Prefix of host name used to specify Unix sockets in the configuration. /// - public const string UnixScheme = "unix"; + public const string UnixPipeHostPrefix = "unix:/"; } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs b/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs index 61331e9798..161ba83d07 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs @@ -103,7 +103,12 @@ namespace Microsoft.AspNet.Server.Kestrel public IDisposable CreateServer(string scheme, string host, int port, Func application) { var listeners = new List(); - var usingPipes = scheme == Constants.UnixScheme; + var usingPipes = host.StartsWith(Constants.UnixPipeHostPrefix); + if (usingPipes) + { + // Subtract one because we want to include the '/' character that starts the path. + host = host.Substring(Constants.UnixPipeHostPrefix.Length - 1); + } try { diff --git a/src/Microsoft.AspNet.Server.Kestrel/ServerAddress.cs b/src/Microsoft.AspNet.Server.Kestrel/ServerAddress.cs index 845baf11bc..44fcf94d5c 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/ServerAddress.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/ServerAddress.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel { @@ -17,51 +18,74 @@ namespace Microsoft.AspNet.Server.Kestrel { url = url ?? string.Empty; - int delimiterStart1 = url.IndexOf("://", StringComparison.Ordinal); - if (delimiterStart1 < 0) + int schemeDelimiterStart = url.IndexOf("://", StringComparison.Ordinal); + if (schemeDelimiterStart < 0) { return null; } - int delimiterEnd1 = delimiterStart1 + "://".Length; + int schemeDelimiterEnd = schemeDelimiterStart + "://".Length; - int delimiterStart3 = url.IndexOf("/", delimiterEnd1, StringComparison.Ordinal); - if (delimiterStart3 < 0) + var isUnixPipe = url.IndexOf(Constants.UnixPipeHostPrefix, schemeDelimiterEnd, StringComparison.Ordinal) == schemeDelimiterEnd; + + int pathDelimiterStart; + int pathDelimiterEnd; + if (!isUnixPipe) { - 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; + pathDelimiterStart = url.IndexOf("/", schemeDelimiterEnd, StringComparison.Ordinal); + pathDelimiterEnd = pathDelimiterStart; } 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); + pathDelimiterStart = url.IndexOf(":", schemeDelimiterEnd + Constants.UnixPipeHostPrefix.Length, StringComparison.Ordinal); + pathDelimiterEnd = pathDelimiterStart + ":".Length; } - serverAddress.Path = url.Substring(delimiterStart3); + + if (pathDelimiterStart < 0) + { + pathDelimiterStart = pathDelimiterEnd = url.Length; + } + + var serverAddress = new ServerAddress(); + serverAddress.Scheme = url.Substring(0, schemeDelimiterStart); + + var hasSpecifiedPort = false; + if (!isUnixPipe) + { + int portDelimiterStart = url.LastIndexOf(":", pathDelimiterStart - 1, pathDelimiterStart - schemeDelimiterEnd, StringComparison.Ordinal); + if (portDelimiterStart >= 0) + { + int portDelimiterEnd = portDelimiterStart + ":".Length; + + string portString = url.Substring(portDelimiterEnd, pathDelimiterStart - portDelimiterEnd); + int portNumber; + if (int.TryParse(portString, NumberStyles.Integer, CultureInfo.InvariantCulture, out portNumber)) + { + hasSpecifiedPort = true; + serverAddress.Host = url.Substring(schemeDelimiterEnd, portDelimiterStart - schemeDelimiterEnd); + serverAddress.Port = portNumber; + } + } + + if (!hasSpecifiedPort) + { + if (string.Equals(serverAddress.Scheme, "http", StringComparison.OrdinalIgnoreCase)) + { + serverAddress.Port = 80; + } + else if (string.Equals(serverAddress.Scheme, "https", StringComparison.OrdinalIgnoreCase)) + { + serverAddress.Port = 443; + } + } + } + + if (!hasSpecifiedPort) + { + serverAddress.Host = url.Substring(schemeDelimiterEnd, pathDelimiterStart - schemeDelimiterEnd); + } + + serverAddress.Path = url.Substring(pathDelimiterEnd); + return serverAddress; } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs b/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs index 0631303cac..0163e9dc16 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs @@ -8,7 +8,6 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http.Features; using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; -using Constants = Microsoft.AspNet.Server.Kestrel.Infrastructure.Constants; namespace Microsoft.AspNet.Server.Kestrel { @@ -43,8 +42,7 @@ namespace Microsoft.AspNet.Server.Kestrel { disposables.Add(engine.CreateServer( address.Scheme, - // Unix sockets use a file path, not a hostname. - address.Scheme == Constants.UnixScheme ? address.Path : address.Host, + address.Host, address.Port, async frame => {