Configure unix pipes via the hostname instead of the scheme.
This commit is contained in:
parent
a919ea8d0a
commit
d0bd2b3dd0
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:/";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 =>
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue