From 543e818acda8a28198e078c5e2adbab738edceb0 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 10 Mar 2014 17:12:16 -0700 Subject: [PATCH] Add support for host based on Host header --- .../DefaultHttpRequest.cs | 10 +- .../DefaultHttpRequestTests.cs | 95 +++++++++++++++---- 2 files changed, 81 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 9579b7c814..188cf06102 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -117,14 +117,8 @@ namespace Microsoft.AspNet.PipelineCore public override HostString Host { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } + get { return HostString.FromUriComponent(Headers["Host"]); } + set { Headers["Host"] = value.ToUriComponent(); } } public override IReadableStringCollection Query diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index f56039abf9..652edf2927 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; @@ -17,7 +19,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsParsedHeader(long value) { // Arrange - var request = GetRequest(value.ToString(CultureInfo.InvariantCulture)); + var request = GetRequestWithContentLength(value.ToString(CultureInfo.InvariantCulture)); // Act and Assert Assert.Equal(value, request.ContentLength); @@ -27,7 +29,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsNullIfHeaderDoesNotExist() { // Arrange - var request = GetRequest(contentLength: null); + var request = GetRequestWithContentLength(contentLength: null); // Act and Assert Assert.Null(request.ContentLength); @@ -41,30 +43,91 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsNullIfHeaderCannotBeParsed(string contentLength) { // Arrange - var request = GetRequest(contentLength); + var request = GetRequestWithContentLength(contentLength); // Act and Assert Assert.Null(request.ContentLength); } - private static DefaultHttpRequest GetRequest(string contentLength = null) + [Fact] + public void Host_GetsHostFromHeaders() { - var features = new Mock(); - var mockRequestInfo = new Mock(); - var headers = new Dictionary(); + // Arrange + const string expected = "localhost:9001"; + + var headers = new Dictionary(StringComparer.Ordinal) + { + { "Host", new string[]{ expected } }, + }; + + var request = CreateRequest(headers); + + // Act + var host = request.Host; + + // Assert + Assert.Equal(expected, host.Value); + } + + [Fact] + public void Host_DecodesPunyCode() + { + // Arrange + const string expected = "löcalhöst"; + + var headers = new Dictionary(StringComparer.Ordinal) + { + { "Host", new string[]{ "xn--lcalhst-90ae" } }, + }; + + var request = CreateRequest(headers); + + // Act + var host = request.Host; + + // Assert + Assert.Equal(expected, host.Value); + } + + [Fact] + public void Host_EncodesPunyCode() + { + // Arrange + const string expected = "xn--lcalhst-90ae"; + + var headers = new Dictionary(StringComparer.Ordinal); + + var request = CreateRequest(headers); + + // Act + request.Host = new HostString("löcalhöst"); + + // Assert + Assert.Equal(expected, headers["Host"][0]); + } + + private static DefaultHttpRequest CreateRequest(IDictionary headers) + { + var requestInfo = new Mock(); + requestInfo.SetupGet(r => r.Headers).Returns(headers); + + var features = new FeatureCollection(); + features.Add(typeof(IHttpRequestInformation), requestInfo.Object); + + var context = new DefaultHttpContext(features); + return new DefaultHttpRequest(context, features); + } + + private static DefaultHttpRequest GetRequestWithContentLength(string contentLength = null) + { + var headers = new Dictionary(StringComparer.Ordinal); if (contentLength != null) { headers.Add("Content-Length", new[] { contentLength }); } - mockRequestInfo.SetupGet(r => r.Headers) - .Returns(headers); - object requestInfo = mockRequestInfo.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out requestInfo)) - .Returns(true); - var context = new DefaultHttpContext(features.Object); - var request = new DefaultHttpRequest(context, features.Object); - return request; + + return CreateRequest(headers); } } }