使用Clojure/Ring为二进制文件提供间歇性错误

Ale*_*ean 2 clojure ring

我正在ClojureSnowplow构建一个事件收集器(使用Ring/Compojure),并且在使用Ring提供透明像素时遇到一些麻烦.这是我发送像素的代码:

(ns snowplow.clojure-collector.responses
  (:import (org.apache.commons.codec.binary Base64)
           (java.io ByteArrayInputStream)))

(def pixel-bytes (Base64/decodeBase64 (.getBytes "R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==")))
(def pixel (ByteArrayInputStream. pixel-bytes))

(defn send-pixel
   []
    {:status  200
     :headers {"Content-Type"   "image/gif"}
     :body    pixel})
Run Code Online (Sandbox Code Playgroud)

当我启动服务器时,第一次点击路径时send-pixel,像素已成功传送到我的浏览器.但是第二次 - 以及每次之后 - Ring都没有发送正文(内容长度为0).重新启动服务器,它是相同的模式.

一些事情不是:

  1. 我已经复制了这个wget,以确认间歇性不是浏览器缓存问题
  2. "R01GOD..."在命令行(cat original.gif | base64)生成了base64字符串,所以知道那里没有问题
  3. 成功发送像素后,我已验证其内容是否正确(diff original.gif received-pixel.gif)

我是Clojure的新手 - 我的猜测是我的代码中有一些令人尴尬的动态gremlin,但我需要帮助发现它!

Ale*_*ean 6

发布后不久我在REPL中发现了问题:

user=> (import (org.apache.commons.codec.binary Base64) (java.io ByteArrayInputStream))
java.io.ByteArrayInputStream
user=> (def pixel-bytes (Base64/decodeBase64 (.getBytes "R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==")))
#'user/pixel-bytes
user=> (def pixel (ByteArrayInputStream. pixel-bytes))
#'user/pixel
user=> (slurp pixel-bytes)
"GIF89a!?\n,L;"
user=> (slurp pixel-bytes)
"GIF89a!?\n,L;"
user=> (slurp pixel)
"GIF89a!?\n,L;"
user=> (slurp pixel)
""
Run Code Online (Sandbox Code Playgroud)

所以基本上问题是ByteArrayInputStream在第一次通话后被清空了.可变数据结构!

我通过ByteArrayInputStream为每个响应生成一个新的修复了错误,其中:

    :body    (ByteArrayInputStream. pixel-bytes)}))
Run Code Online (Sandbox Code Playgroud)