2017-08-24 38 views
0

我有自定義「原因短語」與頭部的狀態碼一起/渲染

head 450 

render status: 450 

響應時正在尋找一種方法來設置自定義reason Phrase Rails將回應HTTP/1.1 450 Custom,但我正在實施一個協議,其中HTTP/1.1 450 Out of Sync需要返回。似乎沒有辦法通過renderhead調用真的做到這一點。至少不要根據文檔和簡略介紹rails代碼。

也許這裏有人知道一個聰明的把戲如何做到這一點?

回答

0

我假設你只想添加新的狀態碼+這些自定義代碼的原因,而不是試圖將200 OK變成200 LOL

其部分回答別人也許能在擴大,您可以創建以下的初始化:

require 'rack/utils' 

custom_codes = { 
    "Out Of Sync" => 450 
} 

custom_codes.each do |reason, code| 
    # allow `status: :out_of_sync` 
    Rack::Utils::SYMBOL_TO_STATUS_CODE[reason.tr(' ', '').underscore.to_sym] = code 

    # tell it what reason to use for this status code 
    Rack::Utils::HTTP_STATUS_CODES[code] = reason 
end 

,現在當你這樣做:

head 450 
head :out_of_sync 
render status: 450 
render status: :out_of_sync 

Rails的日誌將顯示:

Completed 450 Out Of Sync in 17ms 

但是,當我使用curl或開發人員時在Safari中,他們仍然顯示450 CUSTOM。我不確定Rack在Rails實施之後是否正在修改此內容,或者工具忽略了文本並僅顯示默認消息或正在進行的操作。不幸的是,我現在沒有時間進一步挖掘。

-1

不要。如果您的協議依賴於上的原因,它會被設計破壞。

https://www.greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.1.2.p.3

原因短語的元素存在,對於被更頻繁地使用較早的互聯網應用協議提供與數字狀態代碼關聯,大多是出於尊重的文本描述的唯一目的交互式文本客戶。客戶端應該忽略原因短語內容

它在HTTP/2中也被刪除。

+0

這不是我的*協議,我正在使用一項依賴於此的服務。我知道客戶應該忽略這個短語,但它並不是,我沒有權力改變它的任何事情。我可以處理它或不使用他們的協議,這不是一個選項。但是,謝謝 – paukul