From e161bc6625982f09657e31173b0150e069e758db Mon Sep 17 00:00:00 2001 From: Kimmo Koskinen Date: Tue, 1 Nov 2022 16:26:18 +0200 Subject: [PATCH 1/3] Ensure :headers is according to Ring spec Fixes the issue https://github.com/FieryCod/holy-lambda-ring-adapter/issues/3 --- src/fierycod/holy_lambda_ring_adapter/core.cljc | 7 ++++++- test/fierycod/holy_lambda_ring_adapter/core_test.clj | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/fierycod/holy_lambda_ring_adapter/core.cljc b/src/fierycod/holy_lambda_ring_adapter/core.cljc index 3f604ec..9cb8504 100644 --- a/src/fierycod/holy_lambda_ring_adapter/core.cljc +++ b/src/fierycod/holy_lambda_ring_adapter/core.cljc @@ -33,7 +33,12 @@ [{:keys [event ctx]}] (let [request-ctx (get event :requestContext) http (get request-ctx :http) - headers (get event :headers) + headers (persistent! (reduce (fn [acc [k v]] + (if (keyword? k) + (assoc! acc (.toLowerCase (name k)) v) + (assoc! acc k v))) + (transient {}) + (get event :headers))) base64? (get event :isBase64Encoded)] (when-not request-ctx (throw (ex-info "Incorrect shape of AWS event. The adapter is compatible with following integrations: HttpApi and RestApi on AWS Api Gateway service. If you're testing locally make sure the event shape is valid e.g. use `sam local start-api` instead of `sam local invoke`." {:ctx :hl-ring-adapter}))) diff --git a/test/fierycod/holy_lambda_ring_adapter/core_test.clj b/test/fierycod/holy_lambda_ring_adapter/core_test.clj index c7f2247..4b93360 100644 --- a/test/fierycod/holy_lambda_ring_adapter/core_test.clj +++ b/test/fierycod/holy_lambda_ring_adapter/core_test.clj @@ -202,7 +202,15 @@ :body "hello world HTTP/1.1", :isBase64Encoded false, :headers {"something" "something"}} - ((hra/ring<->hl-middleware basic-ring-handler-async) request2 identity identity)))))) + ((hra/ring<->hl-middleware basic-ring-handler-async) request2 identity identity))))) + + (t/testing "Ensure :headers is a map of downcase strings as keys" + (t/is (= {"content-type" "application/json"} + (:headers (request->ring-request-test {:event {:path "/foo" + :isBase64Encoded false + :headers {:Content-Type "application/json"} + :requestContext {:httpMethod "GET"}} + :ctx nil})))))) (t/deftest http-api-json-coerce-1 (t/testing "json coercion should work" From 2e6def6633ae2f9de5c4d5d77b11351e8047bb72 Mon Sep 17 00:00:00 2001 From: Vesa Marttila Date: Wed, 4 Jan 2023 17:59:09 +0200 Subject: [PATCH 2/3] Add support for multi value headers --- .../holy_lambda_ring_adapter/core.cljc | 16 ++++++---- .../holy_lambda_ring_adapter/core_test.clj | 31 +++++++++++++++++-- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/fierycod/holy_lambda_ring_adapter/core.cljc b/src/fierycod/holy_lambda_ring_adapter/core.cljc index 9cb8504..c505d82 100644 --- a/src/fierycod/holy_lambda_ring_adapter/core.cljc +++ b/src/fierycod/holy_lambda_ring_adapter/core.cljc @@ -95,12 +95,16 @@ (h/entrypoint [#'HttpApiProxyGateway]) ```" [response] - (let [^impl/RingResponseBody body (:body response) - {:keys [body encoded?]} (impl/to-hl-response-body body)] - {:statusCode (:status response) - :body body - :isBase64Encoded encoded? - :headers (:headers response)})) + (let [^impl/RingResponseBody body (:body response) + {:keys [body encoded?]} (impl/to-hl-response-body body) + [single-value-headers multi-value-headers] ((juxt remove filter) + (comp coll? second) + (:headers response))] + (cond-> {:statusCode (:status response) + :body body + :isBase64Encoded encoded?} + (seq single-value-headers) (assoc :headers (into {} single-value-headers)) + (seq multi-value-headers) (assoc :multiValueHeaders (into {} multi-value-headers))))) (defn ring<->hl-middleware "Middleware that converts Ring Request/Response model to Holy Lambda (AWS Lambda) Request/Response model. diff --git a/test/fierycod/holy_lambda_ring_adapter/core_test.clj b/test/fierycod/holy_lambda_ring_adapter/core_test.clj index 4b93360..fd2e561 100644 --- a/test/fierycod/holy_lambda_ring_adapter/core_test.clj +++ b/test/fierycod/holy_lambda_ring_adapter/core_test.clj @@ -62,6 +62,34 @@ [hl-request] (ring-spec-props (hra/hl-request->ring-request hl-request))) +(t/deftest response-transform + (t/testing "should correctly parse single value headers" + (let [ring-response {:status 200 + :headers {"upgrade-insecure-requests" "1"}}] + (t/is (= {:statusCode 200, + :body nil, + :isBase64Encoded false, + :headers {"upgrade-insecure-requests" "1"}} + (hra/ring-response->hl-response ring-response))))) + (t/testing "should correctly parse multi value headers" + (let [ring-response {:status 200 + :headers {"set-cookie" ["totalOrders=76" "merged-cart=1"]}}] + (t/is (= {:statusCode 200, + :body nil, + :isBase64Encoded false, + :multiValueHeaders {"set-cookie" ["totalOrders=76" "merged-cart=1"]}} + (hra/ring-response->hl-response ring-response))))) + (t/testing "should correctly parse a mix of single and multi value headers" + (let [ring-response {:status 200 + :headers {"upgrade-insecure-requests" "1" + "set-cookie" ["totalOrders=76" "merged-cart=1"]}}] + (t/is (= {:statusCode 200, + :body nil, + :isBase64Encoded false, + :headers {"upgrade-insecure-requests" "1"} + :multiValueHeaders {"set-cookie" ["totalOrders=76" "merged-cart=1"]}} + (hra/ring-response->hl-response ring-response)))))) + (t/deftest http-api-basic-1 (t/testing "should correctly transform request->ring-request #1" (let [hl-request {:event @@ -190,8 +218,7 @@ (handler (request->ring-request-test request1)))) (t/is (= {:statusCode 200, :body "Hello world", - :isBase64Encoded false, - :headers nil} + :isBase64Encoded false} (hra/ring-response->hl-response (handler (request->ring-request-test request2))))) (t/is (= {:statusCode 200, :body "hello world HTTP/1.1", From 5b3625fe7b9dd405388ec19d83beb50530834f97 Mon Sep 17 00:00:00 2001 From: Vesa Marttila Date: Thu, 5 Jan 2023 11:21:56 +0200 Subject: [PATCH 3/3] Use a more data structure appropriate function Co-authored-by: Kimmo Koskinen --- src/fierycod/holy_lambda_ring_adapter/core.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fierycod/holy_lambda_ring_adapter/core.cljc b/src/fierycod/holy_lambda_ring_adapter/core.cljc index c505d82..1b342be 100644 --- a/src/fierycod/holy_lambda_ring_adapter/core.cljc +++ b/src/fierycod/holy_lambda_ring_adapter/core.cljc @@ -98,7 +98,7 @@ (let [^impl/RingResponseBody body (:body response) {:keys [body encoded?]} (impl/to-hl-response-body body) [single-value-headers multi-value-headers] ((juxt remove filter) - (comp coll? second) + (comp coll? val) (:headers response))] (cond-> {:statusCode (:status response) :body body