我正在Clojure为Snowplow构建一个事件收集器(使用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).重新启动服务器,它是相同的模式.
一些事情不是:
wget,以确认间歇性不是浏览器缓存问题"R01GOD..."在命令行(cat original.gif | base64)生成了base64字符串,所以知道那里没有问题diff original.gif received-pixel.gif)我是Clojure的新手 - 我的猜测是我的代码中有一些令人尴尬的动态gremlin,但我需要帮助发现它!
发布后不久我在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)
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |