Bind to specific IP addresses if provided with any
This still only applies to IPv4. #98
This commit is contained in:
parent
a7b65efa75
commit
f0137b7b9e
|
|
@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
var socket = new UvTcpHandle(Log);
|
var socket = new UvTcpHandle(Log);
|
||||||
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
||||||
socket.Bind(new IPEndPoint(IPAddress.Any, port));
|
socket.Bind(host, port);
|
||||||
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
var socket = new UvTcpHandle(Log);
|
var socket = new UvTcpHandle(Log);
|
||||||
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
||||||
socket.Bind(new IPEndPoint(IPAddress.Any, port));
|
socket.Bind(host, port);
|
||||||
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking
|
||||||
_uv.tcp_init(loop, this);
|
_uv.tcp_init(loop, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Bind(IPEndPoint endpoint)
|
public void Bind(string host, int port)
|
||||||
{
|
{
|
||||||
|
var endpoint = CreateIPEndpoint(host, port);
|
||||||
|
|
||||||
Libuv.sockaddr addr;
|
Libuv.sockaddr addr;
|
||||||
var addressText = endpoint.Address.ToString();
|
var addressText = endpoint.Address.ToString();
|
||||||
|
|
||||||
|
|
@ -58,5 +60,29 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking
|
||||||
{
|
{
|
||||||
_uv.tcp_open(this, hSocket);
|
_uv.tcp_open(this, hSocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns an <see cref="IPEndPoint"/> for the given host an port.
|
||||||
|
/// If the host parameter isn't "localhost" or an IP address, use IPAddress.Any.
|
||||||
|
/// </summary>
|
||||||
|
public static IPEndPoint CreateIPEndpoint(string host, int port)
|
||||||
|
{
|
||||||
|
// TODO: IPv6 support
|
||||||
|
IPAddress ip;
|
||||||
|
|
||||||
|
if (!IPAddress.TryParse(host, out ip))
|
||||||
|
{
|
||||||
|
if (string.Equals(host, "localhost", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
ip = IPAddress.Loopback;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ip = IPAddress.Any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new IPEndPoint(ip, port);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Net;
|
||||||
|
using Microsoft.AspNet.Server.Kestrel.Networking;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Server.KestrelTests
|
||||||
|
{
|
||||||
|
public class CreateIPEndpointTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[InlineData("localhost", "127.0.0.1")]
|
||||||
|
[InlineData("10.10.10.10", "10.10.10.10")]
|
||||||
|
[InlineData("randomhost", "0.0.0.0")]
|
||||||
|
public void CorrectIPEndpointsAreCreated(string host, string expectedAddress)
|
||||||
|
{
|
||||||
|
// "0.0.0.0" is IPAddress.Any
|
||||||
|
var endpoint = UvTcpHandle.CreateIPEndpoint(host, 5000);
|
||||||
|
Assert.NotNull(endpoint);
|
||||||
|
Assert.Equal(IPAddress.Parse(expectedAddress), endpoint.Address);
|
||||||
|
Assert.Equal(5000, endpoint.Port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -166,7 +166,7 @@ namespace Microsoft.AspNet.Server.KestrelTests
|
||||||
|
|
||||||
var serverListenTcp = new UvTcpHandle(_logger);
|
var serverListenTcp = new UvTcpHandle(_logger);
|
||||||
serverListenTcp.Init(loop);
|
serverListenTcp.Init(loop);
|
||||||
serverListenTcp.Bind(new IPEndPoint(0, 54321));
|
serverListenTcp.Bind("0.0.0.0", 54321);
|
||||||
serverListenTcp.Listen(128, (_1, status, error, _2) =>
|
serverListenTcp.Listen(128, (_1, status, error, _2) =>
|
||||||
{
|
{
|
||||||
var serverConnectionTcp = new UvTcpHandle(_logger);
|
var serverConnectionTcp = new UvTcpHandle(_logger);
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ namespace Microsoft.AspNet.Server.KestrelTests
|
||||||
loop.Init(_uv);
|
loop.Init(_uv);
|
||||||
var tcp = new UvTcpHandle(_logger);
|
var tcp = new UvTcpHandle(_logger);
|
||||||
tcp.Init(loop);
|
tcp.Init(loop);
|
||||||
tcp.Bind(new IPEndPoint(IPAddress.Loopback, 0));
|
tcp.Bind("localhost", 0);
|
||||||
tcp.Dispose();
|
tcp.Dispose();
|
||||||
loop.Run();
|
loop.Run();
|
||||||
loop.Dispose();
|
loop.Dispose();
|
||||||
|
|
@ -95,7 +95,7 @@ namespace Microsoft.AspNet.Server.KestrelTests
|
||||||
loop.Init(_uv);
|
loop.Init(_uv);
|
||||||
var tcp = new UvTcpHandle(_logger);
|
var tcp = new UvTcpHandle(_logger);
|
||||||
tcp.Init(loop);
|
tcp.Init(loop);
|
||||||
tcp.Bind(new IPEndPoint(IPAddress.Loopback, 54321));
|
tcp.Bind("localhost", 54321);
|
||||||
tcp.Listen(10, (stream, status, error, state) =>
|
tcp.Listen(10, (stream, status, error, state) =>
|
||||||
{
|
{
|
||||||
var tcp2 = new UvTcpHandle(_logger);
|
var tcp2 = new UvTcpHandle(_logger);
|
||||||
|
|
@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Server.KestrelTests
|
||||||
loop.Init(_uv);
|
loop.Init(_uv);
|
||||||
var tcp = new UvTcpHandle(_logger);
|
var tcp = new UvTcpHandle(_logger);
|
||||||
tcp.Init(loop);
|
tcp.Init(loop);
|
||||||
tcp.Bind(new IPEndPoint(IPAddress.Loopback, 54321));
|
tcp.Bind("localhost", 54321);
|
||||||
tcp.Listen(10, (_, status, error, state) =>
|
tcp.Listen(10, (_, status, error, state) =>
|
||||||
{
|
{
|
||||||
Console.WriteLine("Connected");
|
Console.WriteLine("Connected");
|
||||||
|
|
@ -188,7 +188,7 @@ namespace Microsoft.AspNet.Server.KestrelTests
|
||||||
loop.Init(_uv);
|
loop.Init(_uv);
|
||||||
var tcp = new UvTcpHandle(_logger);
|
var tcp = new UvTcpHandle(_logger);
|
||||||
tcp.Init(loop);
|
tcp.Init(loop);
|
||||||
tcp.Bind(new IPEndPoint(IPAddress.Loopback, 54321));
|
tcp.Bind("localhost", 54321);
|
||||||
tcp.Listen(10, (_, status, error, state) =>
|
tcp.Listen(10, (_, status, error, state) =>
|
||||||
{
|
{
|
||||||
Console.WriteLine("Connected");
|
Console.WriteLine("Connected");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue