我正在编写一个返回HTTP 102(处理)的Rails控制器方法:
render nothing: true, status: :processing, content_type: nil
然而,我得到Rack::Lint::LintError
(通过独角兽):
Content-Type header found in 102 response, not allowed
我没有找到任何明显的方法来禁用此标头。在response.headers
中将其取消,将其从哈希中删除,将response.content_type
除去,在渲染选项中将其作为nil传递,似乎都没有效果。
我在https://stackoverflow.com/a/4032459/3712中读到如果缺少Rails会增加标题,但是Rack。然而,它的Rack本身就在抱怨!
如何禁用标题添加?
或者我最好禁用机架linting?
或者我还缺少其他什么东西?
PS:我在Rack源上查看了我正在使用的版本(1.4.5):没有为没有实体主体的状态代码添加Content-Type标头,根据rack-1.4.5/lib/rack/utils.rb
包含所有1xx状态代码。所以我不认为Rack实际上是在添加标题。
PPS:经过几个小时的调试后,罪魁祸首是对响应的to_a
调用,它在actionpack-3.2.11 / lib / action_dispatch / http / response.rb中调用assign_default_content_type_and_charset!
:< / p>
def assign_default_content_type_and_charset!
return if headers[CONTENT_TYPE].present?
@content_type ||= Mime::HTML
@charset ||= self.class.default_charset
type = @content_type.to_s.dup
type << "; charset=#{@charset}" unless @sending_file
headers[CONTENT_TYPE] = type
end
如果没有一些侵入性的黑客行为,例如添加专用中间件或monkeypatching actionpack ActionDispatch::Response
,我似乎无法做很多事情。
答案 0 :(得分:6)
为了解决这个问题,我添加了一个新的Rails中间件类:
class RemoveContentType
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
# ActionDispatch::Response always inserts Content-Type header
# Remove it for status codes that don't allow it
headers.delete('Content-Type') if (100..199).include?(status.to_i)
return [status, headers, body]
end
end
在application.rb
:
config.middleware.use "::RemoveContentType"
为我的用例102工作。可以更新解决方案以处理超过1xx的其他状态代码。