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,51 +18,74 @@ 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);
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 else
{ {
if (string.Equals(serverAddress.Scheme, "http", StringComparison.OrdinalIgnoreCase)) pathDelimiterStart = url.IndexOf(":", schemeDelimiterEnd + Constants.UnixPipeHostPrefix.Length, StringComparison.Ordinal);
{ pathDelimiterEnd = pathDelimiterStart + ":".Length;
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);
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; 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 =>
{ {