自定义"理由短语"以及head / render的状态代码

时间:2017-08-24 17:02:55

标签: ruby-on-rails http

我正在寻找一种在使用

回复时设置自定义reason Phrase的方法
head 450

render status: 450

Rails将使用HTTP/1.1 450 Custom回复,但我正在实施一个需要返回HTTP/1.1 450 Out of Sync的协议。似乎没有办法通过renderhead来实现这一点。至少不是根据文档和简要浏览rails代码。

也许这里有人知道如何做到这一点的聪明伎俩?

2 个答案:

答案 0 :(得分: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

但是,当我在Safari中使用curl或开发人员工具时,他们仍会显示450 CUSTOM。我不确定Rack是否在Rails关闭之后修改了这个,或者工具是否忽略了文本,只显示了默认消息或正在发生的事情。不幸的是,我现在没有时间进一步挖掘。

答案 1 :(得分:-1)

别。如果您的协议依赖于原因短语,那么它就会被设计破坏。

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

  

原因 - 短语元素的存在仅仅是为了提供与数字状态代码相关联的文本描述,主要是出于对交互式文本客户端更常使用的早期Internet应用程序协议的尊重。客户端应该忽略原因短语内容

它也已在HTTP / 2中删除。