diff --git a/http/json-codec/project.clj b/http/json-codec/project.clj index 0992187..4db2d06 100644 --- a/http/json-codec/project.clj +++ b/http/json-codec/project.clj @@ -1,4 +1,4 @@ -(defproject house.jux/http.json-codec "2024.07.15" +(defproject house.jux/http.json-codec "2024.10.07" :description "Ring-style wrapper to transparently encode and decode JSON to/from Clojure values." :url "https://github.com/klauswuestefeld/simple-clj/tree/master/http/json-codec" diff --git a/http/json-codec/src/house/jux__/http/json_codec__.clj b/http/json-codec/src/house/jux__/http/json_codec__.clj index 2927215..37ecdb4 100644 --- a/http/json-codec/src/house/jux__/http/json_codec__.clj +++ b/http/json-codec/src/house/jux__/http/json_codec__.clj @@ -4,23 +4,30 @@ (:import [java.io BufferedReader BufferedWriter InputStream InputStreamReader OutputStreamWriter PipedInputStream PipedOutputStream])) +(defn- input-stream? [value] + (instance? InputStream value)) + +(defn- pipe-json [value] + (let [input (PipedInputStream. (* 1024 32)) ; 32k buffer + output (-> input PipedOutputStream. OutputStreamWriter. BufferedWriter.)] + (future + (try + (json/generate-stream value output) + (finally (.close output)))) + input)) + (defn- pipe-json-if-necessary [value] - (if (nil? value) - "null" - (let [input (PipedInputStream. (* 1024 32)) ; 32k buffer - output (-> input PipedOutputStream. OutputStreamWriter. BufferedWriter.)] - (future - (try - (json/generate-stream value output) - (finally (.close output)))) - input))) + (cond + (nil? value) "null" + (input-stream? value) value + :else (pipe-json value))) (defn- decode [input] (-> input InputStreamReader. BufferedReader. (json/parse-stream keyword))) (defn- decode-if-necessary [body] (cond-> body - (instance? InputStream body) decode)) + (input-stream? body) decode)) (defn wrap [delegate] (fn [request]