2013-01-18 88 views
1

我試圖在將文件流式傳輸到客戶端之前設置Content-Length標頭。我與它設置:Sinatra文件蒸發的內容長度

response.headers['Content-Length'] = "12341234" 

,然後我做一些事情,如:

steam do |out| 
    file_chunks.each do |chunk| 
    out << chunk 
    end 
    out.close 
end 

然而,當我試圖倒在瀏覽器中的Content-Length頭是空白的文件。有誰知道這是Sinatra問題還是Passenger/Apache問題?

我假設發生了什麼事是這段代碼之間的某一層,當響應實際發送時,它發現它首先發送標題,數據塊爲空,因此即使設置了內容長度爲0它明確。

是否有另一種方式告訴瀏覽器我發送的文件有多大?

編輯

看起來是一個乘客的問題不是一個西納特拉問題。如果我使用瘦命令運行服務器,Content-Length會正確傳遞。我猜這個問題改變了,如果它已經設置,不改變Content-Length?

+0

你不應該用'請求[ '內容長度']'來設置它。迴應是你從請求中得到的迴應。 – BlackHatSamurai

回答

0

這是一個Sinatra問題。它的流API只支持基於EventMachine的服務器。換句話說,API只支持Thin。使用Passenger時,您應該繞過Sinatra流API,並且您應該使用Phusion Passenger支持的the Rack socket hijacking API直接流式傳輸HTTP響應。 Here is an example,演示如何使用Rack套接字劫持API在Phusion Passenger上傳輸Server Sent Events。