使用Clojure/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

我正在构建一个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 "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")
    
    它还处理不存在的文件。还有