2017-08-24 56 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