From 696b621c0aed7f9709fbda4766ec608143e632a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Tue, 17 Jun 2025 16:36:59 -0400 Subject: [PATCH 1/5] find key with insensitive comparison --- .../Client/RuntimeApiHeaders.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs index 4609a93bf..9e004c9c9 100644 --- a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs +++ b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs @@ -45,18 +45,14 @@ public RuntimeApiHeaders(Dictionary> headers) private string GetHeaderValueRequired(Dictionary> headers, string header) { - return headers[header].FirstOrDefault(); + var headerKey = headers.Keys.FirstOrDefault(k => string.Equals(k, header, StringComparison.OrdinalIgnoreCase)); + return headers[headerKey].FirstOrDefault(); } private string GetHeaderValueOrNull(Dictionary> headers, string header) { - if (headers.TryGetValue(header, out var values)) - { - return values.FirstOrDefault(); - } - - return null; + var headerKey = headers.Keys.FirstOrDefault(k => string.Equals(k, header, StringComparison.OrdinalIgnoreCase)); + return headers[headerKey].FirstOrDefault(); } } - } From f3fd6a81cdfe4f0bb861e2a5b2dad1011945d9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Tue, 17 Jun 2025 16:40:07 -0400 Subject: [PATCH 2/5] fix null return --- .../Client/RuntimeApiHeaders.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs index 9e004c9c9..d76ae19cd 100644 --- a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs +++ b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs @@ -51,8 +51,13 @@ private string GetHeaderValueRequired(Dictionary> he private string GetHeaderValueOrNull(Dictionary> headers, string header) { - var headerKey = headers.Keys.FirstOrDefault(k => string.Equals(k, header, StringComparison.OrdinalIgnoreCase)); - return headers[headerKey].FirstOrDefault(); + var headerKey = headers.Keys.FirstOrDefault(k => string.Equals(k, header, StringComparison.OrdinalIgnoreCase)); + if (headers.TryGetValue(headerKey, out var values)) + { + return values.FirstOrDefault(); + } + + return null; } } } From 0b529e54cc9410a1e202ee5050d808152ab4cd3a Mon Sep 17 00:00:00 2001 From: Garrett Beatty Date: Sun, 6 Jul 2025 20:09:42 -0400 Subject: [PATCH 3/5] add changefile --- .../changes/9f639a1b-3cd4-41ec-9d56-d6e95cb32b14.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .autover/changes/9f639a1b-3cd4-41ec-9d56-d6e95cb32b14.json diff --git a/.autover/changes/9f639a1b-3cd4-41ec-9d56-d6e95cb32b14.json b/.autover/changes/9f639a1b-3cd4-41ec-9d56-d6e95cb32b14.json new file mode 100644 index 000000000..5e6b008a8 --- /dev/null +++ b/.autover/changes/9f639a1b-3cd4-41ec-9d56-d6e95cb32b14.json @@ -0,0 +1,11 @@ +{ + "Projects": [ + { + "Name": "Amazon.Lambda.RuntimeSupport", + "Type": "Patch", + "ChangelogMessages": [ + "Fix issue making HTTP header comparisons be case insensitive" + ] + } + ] +} \ No newline at end of file From 4dc9c8952a339f7c2c769d8047870a5d8701de5a Mon Sep 17 00:00:00 2001 From: Garrett Beatty Date: Sun, 6 Jul 2025 20:38:28 -0400 Subject: [PATCH 4/5] fix import --- .../src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs index d76ae19cd..16c12f375 100644 --- a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs +++ b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs @@ -12,6 +12,7 @@ * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ +using System; using System.Collections.Generic; using System.Linq; From 0ef4dffbb62e97fac413eb57fa2eb4d9753722af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:20:43 -0600 Subject: [PATCH 5/5] make lookup o(1) again essentially creating a case insensitive header dictionary --- .../Client/RuntimeApiHeaders.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs index 16c12f375..03d4d1843 100644 --- a/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs +++ b/Libraries/src/Amazon.Lambda.RuntimeSupport/Client/RuntimeApiHeaders.cs @@ -29,12 +29,14 @@ internal class RuntimeApiHeaders public RuntimeApiHeaders(Dictionary> headers) { - DeadlineMs = GetHeaderValueOrNull(headers, HeaderDeadlineMs); - AwsRequestId = GetHeaderValueRequired(headers, HeaderAwsRequestId); - ClientContextJson = GetHeaderValueOrNull(headers, HeaderClientContext); - CognitoIdentityJson = GetHeaderValueOrNull(headers, HeaderCognitoIdentity); - InvokedFunctionArn = GetHeaderValueOrNull(headers, HeaderInvokedFunctionArn); - TraceId = GetHeaderValueOrNull(headers, HeaderTraceId); + var caseInsensitiveHeaders = new Dictionary>(headers, StringComparer.OrdinalIgnoreCase); + + DeadlineMs = GetHeaderValueOrNull(caseInsensitiveHeaders, HeaderDeadlineMs); + AwsRequestId = GetHeaderValueRequired(caseInsensitiveHeaders, HeaderAwsRequestId); + ClientContextJson = GetHeaderValueOrNull(caseInsensitiveHeaders, HeaderClientContext); + CognitoIdentityJson = GetHeaderValueOrNull(caseInsensitiveHeaders, HeaderCognitoIdentity); + InvokedFunctionArn = GetHeaderValueOrNull(caseInsensitiveHeaders, HeaderInvokedFunctionArn); + TraceId = GetHeaderValueOrNull(caseInsensitiveHeaders, HeaderTraceId); } public string AwsRequestId { get; private set; } @@ -46,14 +48,12 @@ public RuntimeApiHeaders(Dictionary> headers) private string GetHeaderValueRequired(Dictionary> headers, string header) { - var headerKey = headers.Keys.FirstOrDefault(k => string.Equals(k, header, StringComparison.OrdinalIgnoreCase)); - return headers[headerKey].FirstOrDefault(); + return headers[header].FirstOrDefault(); } private string GetHeaderValueOrNull(Dictionary> headers, string header) { - var headerKey = headers.Keys.FirstOrDefault(k => string.Equals(k, header, StringComparison.OrdinalIgnoreCase)); - if (headers.TryGetValue(headerKey, out var values)) + if (headers.TryGetValue(header, out var values)) { return values.FirstOrDefault(); }