From be593de7452ad57d604d76c8c805c60129805e13 Mon Sep 17 00:00:00 2001 From: Axel Angel Date: Thu, 27 Jun 2019 12:06:59 +0200 Subject: [PATCH 1/2] Directly coerce to DataOutputStream without using output-stream This is problematic because io/output-stream in clojure adds yet an other buffer in the middle which is uncessary since all instances in the code are OutputStream already and DataOutputStream already accepts it, secondly it creates corruption while using different streams like GZIPOutputStream for unknown reasons the BufferedOutputStream introduced by io/output-stream is preventing the last flush thus corrupting the output. --- src/clj_cbor/core.clj | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/clj_cbor/core.clj b/src/clj_cbor/core.clj index 9a55a16..942625b 100644 --- a/src/clj_cbor/core.clj +++ b/src/clj_cbor/core.clj @@ -78,15 +78,6 @@ ;; ## Encoding Functions -(defn- data-output-stream - "Coerce the argument to a `DataOutputStream`." - ^DataOutputStream - [input] - (if (instance? DataOutputStream input) - input - (DataOutputStream. (io/output-stream input)))) - - (defn encode "Encode a single value as CBOR data. @@ -97,11 +88,11 @@ (encode default-codec value)) ([encoder value] (let [buffer (ByteArrayOutputStream.)] - (with-open [output (data-output-stream buffer)] + (with-open [output (DataOutputStream. buffer)] (encode encoder output value)) (.toByteArray buffer))) ([encoder ^OutputStream output value] - (let [data-output (data-output-stream output)] + (let [data-output (DataOutputStream. output)] (codec/write-value encoder data-output value)))) @@ -116,11 +107,11 @@ (encode-seq default-codec values)) ([encoder values] (let [buffer (ByteArrayOutputStream.)] - (with-open [output (data-output-stream buffer)] + (with-open [output (DataOutputStream. buffer)] (encode-seq encoder output values)) (.toByteArray buffer))) ([encoder ^OutputStream output values] - (let [data-output (data-output-stream output)] + (let [data-output (DataOutputStream. output)] (transduce (map (partial encode encoder data-output)) + 0 values)))) From 3181151c49f5683df6bfc87f55b2947ef0045ba8 Mon Sep 17 00:00:00 2001 From: Axel Angel Date: Fri, 28 Jun 2019 11:49:06 +0200 Subject: [PATCH 2/2] Fix issue with double wrapping of DataOutputStream --- src/clj_cbor/core.clj | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/clj_cbor/core.clj b/src/clj_cbor/core.clj index 942625b..b1e6bc8 100644 --- a/src/clj_cbor/core.clj +++ b/src/clj_cbor/core.clj @@ -78,6 +78,15 @@ ;; ## Encoding Functions +(defn- data-output-stream + "Coerce the argument to a `DataOutputStream`." + ^DataOutputStream + [^OutputStream input] + (cond-> input + + (not (instance? DataOutputStream input)) + (DataOutputStream.))) + (defn encode "Encode a single value as CBOR data. @@ -92,7 +101,7 @@ (encode encoder output value)) (.toByteArray buffer))) ([encoder ^OutputStream output value] - (let [data-output (DataOutputStream. output)] + (let [data-output (data-output-stream output)] (codec/write-value encoder data-output value)))) @@ -111,7 +120,7 @@ (encode-seq encoder output values)) (.toByteArray buffer))) ([encoder ^OutputStream output values] - (let [data-output (DataOutputStream. output)] + (let [data-output (data-output-stream output)] (transduce (map (partial encode encoder data-output)) + 0 values))))