From cc08351f537470a2d6c6ede0f0bf92ef67ccc196 Mon Sep 17 00:00:00 2001 From: Matt Mason Date: Thu, 30 Mar 2017 11:47:44 -0700 Subject: [PATCH] Add content headers to script headers object --- .../HttpRequestMessageExtensions.cs | 7 +++---- .../NodeEndToEndTests.cs | 5 +++++ .../PowerShellEndToEndTests.cs | 1 + .../PowerShell/HttpTrigger/run.ps1 | 3 ++- .../HttpRequestMessageExtensions.cs | 20 ++++++++++++++++++- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/WebJobs.Script/Extensions/HttpRequestMessageExtensions.cs b/src/WebJobs.Script/Extensions/HttpRequestMessageExtensions.cs index 5d2e2661c4..ebd9e1f2b9 100644 --- a/src/WebJobs.Script/Extensions/HttpRequestMessageExtensions.cs +++ b/src/WebJobs.Script/Extensions/HttpRequestMessageExtensions.cs @@ -70,9 +70,8 @@ public static IDictionary GetQueryParameterDictionary(this HttpR public static IDictionary GetRawHeaders(this HttpRequestMessage request) { - Dictionary headers = new Dictionary(); - - var allHeadersRaw = request.Headers.ToString(); + var headers = new Dictionary(); + var allHeadersRaw = request.Headers.ToString() + Environment.NewLine + request.Content?.Headers?.ToString(); var rawHeaderLines = allHeadersRaw.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); foreach (var header in rawHeaderLines) @@ -82,7 +81,7 @@ public static IDictionary GetRawHeaders(this HttpRequestMessage string value = header.Substring(idx + 1).Trim(); headers.Add(name, value); } - + return headers; } } diff --git a/test/WebJobs.Script.Tests.Integration/NodeEndToEndTests.cs b/test/WebJobs.Script.Tests.Integration/NodeEndToEndTests.cs index 0d8d019833..4f1aedd255 100644 --- a/test/WebJobs.Script.Tests.Integration/NodeEndToEndTests.cs +++ b/test/WebJobs.Script.Tests.Integration/NodeEndToEndTests.cs @@ -382,6 +382,8 @@ public async Task HttpTrigger_Get(string functionName) request.Headers.Add("test-header", "Test Request Header"); string userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"; request.Headers.Add("user-agent", userAgent); + string accept = "text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8"; + request.Headers.Add("accept", accept); string customHeader = "foo,bar,baz"; request.Headers.Add("custom-1", customHeader); @@ -412,6 +414,7 @@ public async Task HttpTrigger_Get(string functionName) JObject reqHeaders = (JObject)resultObject["reqHeaders"]; Assert.Equal("Test Request Header", reqHeaders["test-header"]); Assert.Equal(userAgent, reqHeaders["user-agent"]); + Assert.Equal(accept, reqHeaders["accept"]); Assert.Equal(customHeader, reqHeaders["custom-1"]); } @@ -736,6 +739,7 @@ public async Task HttpTrigger_Post_PlainText() Content = new StringContent(testData) }; request.SetConfiguration(new HttpConfiguration()); + request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain"); Dictionary arguments = new Dictionary { @@ -752,6 +756,7 @@ public async Task HttpTrigger_Post_PlainText() Assert.Equal(testData, (string)resultObject["reqBody"]); Assert.Equal("string", (string)resultObject["reqRawBodyType"]); Assert.Equal(testData, (string)resultObject["reqRawBody"]); + Assert.Equal("text/plain", resultObject["reqHeaders"]["content-type"]); } [Fact] diff --git a/test/WebJobs.Script.Tests.Integration/PowerShellEndToEndTests.cs b/test/WebJobs.Script.Tests.Integration/PowerShellEndToEndTests.cs index 9853e46d37..5d2d7bca85 100644 --- a/test/WebJobs.Script.Tests.Integration/PowerShellEndToEndTests.cs +++ b/test/WebJobs.Script.Tests.Integration/PowerShellEndToEndTests.cs @@ -183,6 +183,7 @@ public async Task HttpTrigger_Post_PlainText() string result = await response.Content.ReadAsStringAsync(); JObject resultObject = JObject.Parse(result); Assert.Equal(testData, (string)resultObject["result"]["message"]["value"]); + Assert.Equal("text/plain; charset=utf-8", (string)resultObject["result"]["content-type"]); } [Fact] diff --git a/test/WebJobs.Script.Tests.Integration/TestScripts/PowerShell/HttpTrigger/run.ps1 b/test/WebJobs.Script.Tests.Integration/TestScripts/PowerShell/HttpTrigger/run.ps1 index 9a2c58ea6e..7e91fc5931 100644 --- a/test/WebJobs.Script.Tests.Integration/TestScripts/PowerShell/HttpTrigger/run.ps1 +++ b/test/WebJobs.Script.Tests.Integration/TestScripts/PowerShell/HttpTrigger/run.ps1 @@ -20,7 +20,8 @@ else $body = (New-Object PSObject | Add-Member -PassThru NoteProperty message $message | Add-Member -PassThru NoteProperty {user-agent} ${req_headers_user-agent} | - Add-Member -PassThru NoteProperty {custom-1} ${req_headers_custom-1} + Add-Member -PassThru NoteProperty {custom-1} ${req_headers_custom-1} | + Add-Member -PassThru NoteProperty {content-type} ${req_headers_content-type} ) $responseContent = @{result=$body; headers=@{"TEST-HEADER"="Test Response Header"}} | ConvertTo-Json -Compress; diff --git a/test/WebJobs.Script.Tests/Extensions/HttpRequestMessageExtensions.cs b/test/WebJobs.Script.Tests/Extensions/HttpRequestMessageExtensions.cs index fd81b6a8bc..50a5e74ea8 100644 --- a/test/WebJobs.Script.Tests/Extensions/HttpRequestMessageExtensions.cs +++ b/test/WebJobs.Script.Tests/Extensions/HttpRequestMessageExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Net.Http; +using System.Net.Http.Headers; using Xunit; namespace Microsoft.Azure.WebJobs.Script.Tests @@ -79,17 +80,34 @@ public void GetRawHeaders_ReturnsExpectedHeaders() // Multiple headers string userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"; + string accept = "text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8"; string testHeader2 = "foo,bar,baz"; string testHeader3 = "foo bar baz"; request.Headers.Add("User-Agent", userAgent); + request.Headers.Add("Accept", accept); request.Headers.Add("Header2", testHeader2); request.Headers.Add("Header3", testHeader3); + request.Headers.Add("Empty", string.Empty); + var str = request.Headers.ToString(); headers = request.GetRawHeaders(); - Assert.Equal(4, headers.Count); + Assert.Equal(6, headers.Count); Assert.Equal(userAgent, headers["User-Agent"]); + Assert.Equal(accept, headers["Accept"]); Assert.Equal(testHeader1, headers["Header1"]); Assert.Equal(testHeader2, headers["Header2"]); Assert.Equal(testHeader3, headers["Header3"]); + Assert.Equal(string.Empty, headers["Empty"]); + + // Content headers + request.Content = new StringContent("test"); + request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); + request.Content.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse("form-data; name=\"fieldName\"; filename=\"filename.jpg\""); + request.Content.Headers.ContentRange = ContentRangeHeaderValue.Parse("bytes 200-1000/67589"); + headers = request.GetRawHeaders(); + Assert.Equal(9, headers.Count); + Assert.Equal("text/html", headers["Content-Type"]); + Assert.Equal("form-data; name=\"fieldName\"; filename=\"filename.jpg\"", headers["Content-Disposition"]); + Assert.Equal("bytes 200-1000/67589", headers["Content-Range"]); } } }