2014-06-05 33 views
0

在Sinatra中,如何覆蓋響應中的Content-Length標題以設置我自己的值?使用Rack/Sinatra覆蓋內容長度標題

在我的方法的最後一行返回如下:

[200, {'Content-Type' => component.content_type, 
'Content-Length' => component.content_length.to_s}, component.content.data] 

這樣,我希望能覆蓋內容的價值,但它導致異常:

Unexpected error while processing request: Content-Length header was 2, but should be 0 

我想爲內容長度返回不同的值。有沒有辦法做到這一點?

+0

爲什麼你想覆蓋內容長度 - 這肯定只會導致問題。這種行爲取決於您使用的是哪個服務器(我無法重現您在Sinatra使用的任何默認服務器上看到的錯誤)。你想做什麼? – matt

+0

在這種情況下,用戶代理是一個查詢數據並期待文檔長度而不是文檔本身的SAP系統,即它正在以它自己的方式解釋數據。我使用Thin,如果這有什麼區別的話,儘管我認爲Rack正在處理內容長度的添加,據我瞭解,它有一箇中間件,我還沒有完全理解。 – mydoghasworms

回答

0

這個錯誤是由Rack::Lint middleware引發的,所以快速修復就是不使用那件中間件。取決於你如何開始你的應用程序,但可能會非常棘手 - 如果你使用rackup,Rack會在某些情況下添加它。

更好的解決方案是將您的客戶更改爲使用HTTP HEAD request而不是GET。在Sinatra defining a GET route automatically defines a matching HEAD route。使用HEAD將導致服務器發送標題,但不是正文,並且您應該能夠將Content-Length設置爲任何您想要的。它也將避免Rack::Lint錯誤。

這裏有一個要點,說明如何禁用Rack::Lint

module Rack 
    class Lint 
    def call(env = nil) 
     @app.call(env) 
    end 
    end 
end 

(來自https://gist.github.com/shtirlic/2146256兩者)​​。

+0

是的,使用HEAD請求更有意義。不幸的是,對於這個用戶代理來說,標準合規性並不是一個優先事項,改變它不是一個選擇:-(然而,我可以用一個特定的路由替換某個中間件嗎?是否有代碼示例的鏈接? – mydoghasworms

+0

另外,我不認爲我想要完全禁用Rack :: Lint。現在我知道它在那裏,我不希望那種安全網感覺去。 – mydoghasworms

+0

謝謝,我正在與你的建議,禁用Rack :: Lint,因爲它似乎是最快的,直到我找到一個更好的方式。 – mydoghasworms