gpt4 book ai didi

clojure - 使用 Clojure/Ring 提供二进制文件时出现间歇性错误

转载 作者:行者123 更新时间:2023-12-02 17:36:48 26 4
gpt4 key购买 nike

我正在构建一个 event collector in 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})

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

有一些事情不是:

  1. 我已使用 wget 复制了此内容,确认间歇性不是浏览器缓存问题
  2. 我生成了 "R01GOD..."命令行中的 base64 字符串 ( cat original.gif | base64 ) 所以知道那里没有问题
  3. 成功发送像素后,我已验证其内容是否正确 ( 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)
""

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

我通过生成新的 ByteArrayInputStream 修复了该错误对于每个响应,带有:

    :body    (ByteArrayInputStream. pixel-bytes)}))

关于clojure - 使用 Clojure/Ring 提供二进制文件时出现间歇性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com