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