2012-10-30 24 views
2

我建立一個event collector in Clojure用於Snowplow(使用環/的Compojure)和時遇到服務與環透明像素一些麻煩。這是我送的像素代碼:間歇錯誤服務的二進制文件使用Clojure /振鈴

(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,像素被成功地傳遞到我的瀏覽器。但在第二時間 - 並隨後每次 - 環不發送體(和內容長度0)。重新啓動服務器,它是相同的模式。

有幾件事情是不是:

  1. 我複製了這一點使用wget,確認間歇岬是不是一個瀏覽器緩存的問題
  2. 我產生在命令行的"R01GOD..."的base64字符串(cat original.gif | base64),所以知道有沒有問題,有
  3. 像素時的發送成功,我已經驗證了它的內容是正確的(diff original.gif received-pixel.gif

我是新來的Clojure - 我的猜測是有一個在我的代碼中的一些尷尬的動態小鬼,但我需要幫助點滴吧!

回答

5

我想通了,在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)})) 
0

問題是您的pixel變量保存的流。一旦閱讀完畢,就不可能再次閱讀。

而且,你不需要處理編碼問題。 Ring也提供靜態文件。只需返回:

(file-response "/path/to/pixel.gif") 

它也處理不存在的文件。 See the docs也。

相關問題