From c987f5a7eec0d49f1f168716b2044e1e298ad5ee Mon Sep 17 00:00:00 2001 From: Joe McBride Date: Wed, 15 Feb 2017 16:02:50 -0800 Subject: [PATCH] Use FormFeature to populate Request.Form * Populate ContenType and ContentLength to Headers --- src/Alba/FormDataExtensions.cs | 2 ++ src/Alba/HeaderExtensions.cs | 35 +++++++++++++++++++++++ src/Alba/HttpRequestBody.cs | 9 +----- src/Alba/Scenario.cs | 1 + src/Alba/Stubs/StubHttpRequest.cs | 45 +++++++++++++----------------- src/Alba/Stubs/StubHttpResponse.cs | 26 ++++------------- 6 files changed, 63 insertions(+), 55 deletions(-) create mode 100644 src/Alba/HeaderExtensions.cs diff --git a/src/Alba/FormDataExtensions.cs b/src/Alba/FormDataExtensions.cs index 186929b0..cbeac0a5 100644 --- a/src/Alba/FormDataExtensions.cs +++ b/src/Alba/FormDataExtensions.cs @@ -15,6 +15,8 @@ public static class FormDataExtensions { var post = formData(values).Join("&"); + context.Request.ContentLength = post.Length; + var postBytes = Encoding.UTF8.GetBytes(post); var stream = new MemoryStream(); diff --git a/src/Alba/HeaderExtensions.cs b/src/Alba/HeaderExtensions.cs new file mode 100644 index 00000000..8311bb43 --- /dev/null +++ b/src/Alba/HeaderExtensions.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.Net.Http.Headers; + +namespace Alba +{ + public static class HeaderExtensions + { + public static long? GetContentLength(this IHeaderDictionary headers) + { + long length; + var rawValue = headers[HeaderNames.ContentLength]; + + if (rawValue.Count == 1 && + !string.IsNullOrWhiteSpace(rawValue[0]) && + HeaderUtilities.TryParseInt64(rawValue[0], out length)) + { + return length; + } + + return null; + } + + public static void SetContentLength(this IHeaderDictionary headers, long? value) + { + if (value.HasValue) + { + headers[HeaderNames.ContentLength] = HeaderUtilities.FormatInt64(value.Value); + } + else + { + headers.Remove(HeaderNames.ContentLength); + } + } + } +} diff --git a/src/Alba/HttpRequestBody.cs b/src/Alba/HttpRequestBody.cs index 2f7fe448..56245c9f 100644 --- a/src/Alba/HttpRequestBody.cs +++ b/src/Alba/HttpRequestBody.cs @@ -1,10 +1,7 @@ using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Reflection; using System.Text; using System.Xml.Serialization; -using Baseline; using Microsoft.AspNetCore.Http; namespace Alba @@ -40,7 +37,7 @@ public void XmlInputIs(object target) public void JsonInputIs(object target) { - string json = _system.ToJson(target); + var json = _system.ToJson(target); JsonInputIs(json); } @@ -69,10 +66,6 @@ private void writeTextToBody(string json) public void WriteFormData(Dictionary input) { _parent.Request.ContentType(MimeType.HttpFormMimetype); - - //TODO: Is this the real form data length? - _parent.Request.ContentLength = input.Count; - _parent.WriteFormData(input); } diff --git a/src/Alba/Scenario.cs b/src/Alba/Scenario.cs index a232f57b..58a1a061 100644 --- a/src/Alba/Scenario.cs +++ b/src/Alba/Scenario.cs @@ -12,6 +12,7 @@ using Baseline; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Primitives; namespace Alba { diff --git a/src/Alba/Stubs/StubHttpRequest.cs b/src/Alba/Stubs/StubHttpRequest.cs index eb4bb6b7..0c6fb816 100644 --- a/src/Alba/Stubs/StubHttpRequest.cs +++ b/src/Alba/Stubs/StubHttpRequest.cs @@ -4,21 +4,25 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Internal; -using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Alba.Stubs { public class StubHttpRequest : HttpRequest { - public StubHttpRequest(StubHttpContext context) + private readonly FormFeature _formFeature; + + public StubHttpRequest(HttpContext context) { HttpContext = context; + _formFeature = new FormFeature(this); } public override Task ReadFormAsync(CancellationToken cancellationToken = new CancellationToken()) { - throw new NotImplementedException(); + return _formFeature.ReadFormAsync(cancellationToken); } public override HttpContext HttpContext { get; } @@ -36,35 +40,24 @@ public override Task ReadFormAsync(CancellationToken cancellati public override long? ContentLength { - get - { - if (!Headers.ContainsKey("content-length")) - { - return null; - } - - return long.Parse(Headers["content-length"].First()); - } - set - { - Headers["content-length"] = new StringValues(value.ToString()); - } + get { return Headers.GetContentLength(); } + set { Headers.SetContentLength(value); } } public override string ContentType { - get - { - return Headers["content-type"].FirstOrDefault(); - } - set - { - Headers["content-type"] = new StringValues(value); - } + get { return Headers[HeaderNames.ContentType]; } + set { Headers[HeaderNames.ContentType] = value; } } public override Stream Body { get; set; } = new MemoryStream(); - public override bool HasFormContentType { get; } = false; // TODO -- do something here. - public override IFormCollection Form { get; set; } + + public override bool HasFormContentType => _formFeature.HasFormContentType; + + public override IFormCollection Form + { + get { return _formFeature.ReadForm(); } + set { _formFeature.Form = value; } + } } } \ No newline at end of file diff --git a/src/Alba/Stubs/StubHttpResponse.cs b/src/Alba/Stubs/StubHttpResponse.cs index e0b16c93..34b8e62d 100644 --- a/src/Alba/Stubs/StubHttpResponse.cs +++ b/src/Alba/Stubs/StubHttpResponse.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Alba.Stubs { @@ -44,31 +45,14 @@ public override void Redirect(string location, bool permanent) public override long? ContentLength { - get - { - if (!Headers.ContainsKey("content-length")) - { - return null; - } - - return long.Parse(Headers["content-length"].First()); - } - set - { - Headers["content-length"] = new StringValues(value.ToString()); - } + get { return Headers.GetContentLength(); } + set { Headers.SetContentLength(value); } } public override string ContentType { - get - { - return Headers["content-type"].FirstOrDefault(); - } - set - { - Headers["content-type"] = new StringValues(value); - } + get { return Headers[HeaderNames.ContentType]; } + set { Headers[HeaderNames.ContentType] = value; } } public override IResponseCookies Cookies { get; }