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": {
"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"
}

View File

@ -8,8 +8,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Infrastructure
public const int ListenBacklog = 128;
/// <summary>
/// URL scheme for specifying Unix sockets in the configuration.
/// Prefix of host name used to specify Unix sockets in the configuration.
/// </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)
{
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
{

View File

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

View File

@ -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 =>
{