Configure unix pipes via the hostname instead of the scheme.

This commit is contained in:
Stephen Halter 2015-08-20 15:28:05 -07:00
parent a919ea8d0a
commit d0bd2b3dd0
5 changed files with 70 additions and 43 deletions

View File

@ -13,7 +13,7 @@
}, },
"commands": { "commands": {
"run": "Microsoft.AspNet.Server.Kestrel", "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", "kestrel": "Microsoft.AspNet.Server.Kestrel",
"web": "Microsoft.AspNet.Hosting" "web": "Microsoft.AspNet.Hosting"
} }

View File

@ -8,8 +8,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Infrastructure
public const int ListenBacklog = 128; public const int ListenBacklog = 128;
/// <summary> /// <summary>
/// URL scheme for specifying Unix sockets in the configuration. /// Prefix of host name used to specify Unix sockets in the configuration.
/// </summary> /// </summary>
public const string UnixScheme = "unix"; public const string UnixPipeHostPrefix = "unix:/";
} }
} }

View File

@ -103,7 +103,12 @@ namespace Microsoft.AspNet.Server.Kestrel
public IDisposable CreateServer(string scheme, string host, int port, Func<Frame, Task> application) public IDisposable CreateServer(string scheme, string host, int port, Func<Frame, Task> application)
{ {
var listeners = new List<IDisposable>(); var listeners = new List<IDisposable>();
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 try
{ {

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Globalization; using System.Globalization;
using Microsoft.AspNet.Server.Kestrel.Infrastructure;
namespace Microsoft.AspNet.Server.Kestrel namespace Microsoft.AspNet.Server.Kestrel
{ {
@ -17,35 +18,55 @@ namespace Microsoft.AspNet.Server.Kestrel
{ {
url = url ?? string.Empty; url = url ?? string.Empty;
int delimiterStart1 = url.IndexOf("://", StringComparison.Ordinal); int schemeDelimiterStart = url.IndexOf("://", StringComparison.Ordinal);
if (delimiterStart1 < 0) if (schemeDelimiterStart < 0)
{ {
return null; return null;
} }
int delimiterEnd1 = delimiterStart1 + "://".Length; int schemeDelimiterEnd = schemeDelimiterStart + "://".Length;
int delimiterStart3 = url.IndexOf("/", delimiterEnd1, StringComparison.Ordinal); var isUnixPipe = url.IndexOf(Constants.UnixPipeHostPrefix, schemeDelimiterEnd, StringComparison.Ordinal) == schemeDelimiterEnd;
if (delimiterStart3 < 0)
int pathDelimiterStart;
int pathDelimiterEnd;
if (!isUnixPipe)
{ {
delimiterStart3 = url.Length; pathDelimiterStart = url.IndexOf("/", schemeDelimiterEnd, StringComparison.Ordinal);
pathDelimiterEnd = pathDelimiterStart;
} }
int delimiterStart2 = url.LastIndexOf(":", delimiterStart3 - 1, delimiterStart3 - delimiterEnd1, StringComparison.Ordinal); else
int delimiterEnd2 = delimiterStart2 + ":".Length;
if (delimiterStart2 < 0)
{ {
delimiterStart2 = delimiterStart3; pathDelimiterStart = url.IndexOf(":", schemeDelimiterEnd + Constants.UnixPipeHostPrefix.Length, StringComparison.Ordinal);
delimiterEnd2 = delimiterStart3; pathDelimiterEnd = pathDelimiterStart + ":".Length;
} }
if (pathDelimiterStart < 0)
{
pathDelimiterStart = pathDelimiterEnd = url.Length;
}
var serverAddress = new ServerAddress(); var serverAddress = new ServerAddress();
serverAddress.Scheme = url.Substring(0, delimiterStart1); serverAddress.Scheme = url.Substring(0, schemeDelimiterStart);
string portString = url.Substring(delimiterEnd2, delimiterStart3 - delimiterEnd2);
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; int portNumber;
if (int.TryParse(portString, NumberStyles.Integer, CultureInfo.InvariantCulture, out portNumber)) if (int.TryParse(portString, NumberStyles.Integer, CultureInfo.InvariantCulture, out portNumber))
{ {
serverAddress.Host = url.Substring(delimiterEnd1, delimiterStart2 - delimiterEnd1); hasSpecifiedPort = true;
serverAddress.Host = url.Substring(schemeDelimiterEnd, portDelimiterStart - schemeDelimiterEnd);
serverAddress.Port = portNumber; serverAddress.Port = portNumber;
} }
else }
if (!hasSpecifiedPort)
{ {
if (string.Equals(serverAddress.Scheme, "http", StringComparison.OrdinalIgnoreCase)) if (string.Equals(serverAddress.Scheme, "http", StringComparison.OrdinalIgnoreCase))
{ {
@ -55,13 +76,16 @@ namespace Microsoft.AspNet.Server.Kestrel
{ {
serverAddress.Port = 443; serverAddress.Port = 443;
} }
else }
}
if (!hasSpecifiedPort)
{ {
serverAddress.Port = 0; serverAddress.Host = url.Substring(schemeDelimiterEnd, pathDelimiterStart - schemeDelimiterEnd);
} }
serverAddress.Host = url.Substring(delimiterEnd1, delimiterStart3 - delimiterEnd1);
} serverAddress.Path = url.Substring(pathDelimiterEnd);
serverAddress.Path = url.Substring(delimiterStart3);
return serverAddress; return serverAddress;
} }
} }

View File

@ -8,7 +8,6 @@ using Microsoft.AspNet.Hosting.Server;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.Dnx.Runtime; using Microsoft.Dnx.Runtime;
using Microsoft.Framework.Configuration; using Microsoft.Framework.Configuration;
using Constants = Microsoft.AspNet.Server.Kestrel.Infrastructure.Constants;
namespace Microsoft.AspNet.Server.Kestrel namespace Microsoft.AspNet.Server.Kestrel
{ {
@ -43,8 +42,7 @@ namespace Microsoft.AspNet.Server.Kestrel
{ {
disposables.Add(engine.CreateServer( disposables.Add(engine.CreateServer(
address.Scheme, address.Scheme,
// Unix sockets use a file path, not a hostname. address.Host,
address.Scheme == Constants.UnixScheme ? address.Path : address.Host,
address.Port, address.Port,
async frame => async frame =>
{ {