From 991d520b5ddc71d39fdecefd3c413c4e7a48d93c Mon Sep 17 00:00:00 2001 From: Per Magnus Petersen Date: Tue, 24 Feb 2026 10:54:52 +0100 Subject: [PATCH] Fix WebSocket price stream by guarding nil responses from ring-defaults ring-defaults middleware (wrap-content-type, wrap-xss-protection) was converting the nil response from the raw WebSocket upgrade handler into a partial response map (headers only, no status), causing the Undertow adapter to attempt ending the already-upgraded exchange. Co-Authored-By: Claude Opus 4.6 --- src/clj/pmagnus/btcdata/web/middleware/core.clj | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/clj/pmagnus/btcdata/web/middleware/core.clj b/src/clj/pmagnus/btcdata/web/middleware/core.clj index dbde6bb..545eb02 100644 --- a/src/clj/pmagnus/btcdata/web/middleware/core.clj +++ b/src/clj/pmagnus/btcdata/web/middleware/core.clj @@ -16,6 +16,14 @@ (update resp :headers assoc "Access-Control-Allow-Origin" origin))))) +(defn- wrap-nil-guard + "Discard responses with no :status — these are artifacts of ring-defaults + middleware wrapping a nil response (e.g., from a raw WebSocket upgrade)." + [handler] + (fn [request] + (let [resp (handler request)] + (when (:status resp) resp)))) + (defn wrap-base [{:keys [site-defaults-config cors-origin]}] (let [origin (or cors-origin (System/getenv "CORS_ORIGIN") @@ -24,4 +32,5 @@ (-> handler (defaults/wrap-defaults (or site-defaults-config defaults/api-defaults)) + (wrap-nil-guard) (wrap-cors origin)))))