From 9277ead4c1fae1b43cc646cf160953213150baff Mon Sep 17 00:00:00 2001 From: Bruno Gale Date: Sun, 27 Sep 2026 10:43:02 +0200 Subject: [PATCH] fix(functions): send the caller's content-type instead of dropping it --- .../Functions.Tests/ClientContractTests.cs | 11 +++++++++++ packages/Functions/Functions/Client.cs | 16 +++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/Functions/Functions.Tests/ClientContractTests.cs b/packages/Functions/Functions.Tests/ClientContractTests.cs index 6ae0fc36..bea1aa1e 100644 --- a/packages/Functions/Functions.Tests/ClientContractTests.cs +++ b/packages/Functions/Functions.Tests/ClientContractTests.cs @@ -171,6 +171,17 @@ public async Task Invoke_ShouldPreferOptionHeadersOverDynamicHeaders() this.HeaderOf("x-shared").Should().Be("from-options"); } + [TestMethod] + public async Task Invoke_ShouldSendOptionContentType_GivenLowercaseHeaderName() + { + this.RespondWith(200, "ok"); + await this.client.Invoke(FunctionName, options: new InvokeFunctionOptions + { + Headers = new Dictionary { { "content-type", "text/plain" } } + }); + this.HeaderOf("Content-Type").Should().Be("text/plain"); + } + [TestMethod] public async Task Invoke_ShouldThrowFunctionsException_GivenServerError() { diff --git a/packages/Functions/Functions/Client.cs b/packages/Functions/Functions/Client.cs index 70f2c865..89cb2bba 100644 --- a/packages/Functions/Functions/Client.cs +++ b/packages/Functions/Functions/Client.cs @@ -285,14 +285,20 @@ private static Uri BuildUri(string url) private static HttpRequestMessage BuildRequestMessage(InvokeFunctionOptions options, Uri uri) { - var request = new HttpRequestMessage(options.HttpMethod, uri) - { - Content = new StringContent(JsonSerializer.Serialize(options.Body, SerializerOptions), Encoding.UTF8, "application/json") - }; + var content = new StringContent(JsonSerializer.Serialize(options.Body, SerializerOptions), Encoding.UTF8, "application/json"); + var request = new HttpRequestMessage(options.HttpMethod, uri) { Content = content }; foreach (var kvp in options.Headers) { - request.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value); + if (string.Equals(kvp.Key, "Content-Type", StringComparison.OrdinalIgnoreCase)) + { + content.Headers.Remove("Content-Type"); + content.Headers.TryAddWithoutValidation("Content-Type", kvp.Value); + } + else + { + request.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value); + } } return request;