使用Clojure/Ring服务二进制文件时出现间歇性错误
我正在构建一个for(使用Ring/Compojure),在使用Ring服务透明像素时遇到了一些问题。这是我发送像素的代码:使用Clojure/Ring服务二进制文件时出现间歇性错误,clojure,ring,Clojure,Ring,我正在构建一个for(使用Ring/Compojure),在使用Ring服务透明像素时遇到了一些问题。这是我发送像素的代码: (ns snowplow.clojure-collector.responses (:import (org.apache.commons.codec.binary Base64) (java.io ByteArrayInputStream))) (def pixel-bytes (Base64/decodeBase64 (.getBytes
(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})
当我启动服务器时,当我第一次点击发送像素
的路径时,该像素成功地传送到我的浏览器。但第二次——以及之后的每一次——Ring都不发送正文(内容长度为0)。重新启动服务器,其模式相同
有几件事不是这样的:
wget
复制了这一点,以确认间歇性不是浏览器缓存问题cat original.gif | base64
)生成了“R01GOD…”
base64字符串,因此知道没有问题diff original.gif received pixel.gif
)我是Clojure的新手-我猜我的代码中有一些令人尴尬的动态小精灵,但我需要帮助发现它 发布后不久,我在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)
""
因此,基本上问题在于ByteArrayInputStream
在第一次调用后被清空。可变数据结构
我通过为每个响应生成一个新的ByteArrayInputStream
修复了该错误,其中包括:
:body (ByteArrayInputStream. pixel-bytes)}))
问题是您的
pixel
变量包含一个流。一旦阅读完毕,就不可能再重新阅读
此外,您不需要处理编码问题。Ring还提供静态文件。只需返回:
(file-response "/path/to/pixel.gif")
它还处理不存在的文件。还有