Bar*_*lly 4 rack content-type ruby-on-rails http-headers
我正在编写一个返回HTTP 102(处理)的Rails控制器方法:
render nothing: true, status: :processing, content_type: nil
Run Code Online (Sandbox Code Playgroud)
但是,我得到了Rack::Lint::LintError(通过独角兽):
Content-Type header found in 102 response, not allowed
Run Code Online (Sandbox Code Playgroud)
我没有找到任何明显的方法来禁用此标头.Nilling它response.headers,从hash中删除它,nilling out response.content_type,在render选项中将它作为nil传递,似乎都没有效果.
我在/sf/answers/282272161/中读到,如果缺少Rails会增加标题,但是Rack.然而,它的Rack本身就是在抱怨!
如何禁用标题添加?
或者我最好禁用机架linting?
或者还有其他我想念的东西?
PS:我在Rack源上查看了我正在使用的版本(1.4.5):没有为没有实体主体的状态代码添加Content-Type标头,根据rack-1.4.5/lib/rack/utils.rb包含所有1xx状态代码.所以我不认为它是Rack实际上添加了标题.
PPS:经过几个小时的调试,罪魁祸首是to_a对响应的调用,调用assign_default_content_type_and_charset!actionpack-3.2.11/lib/action_dispatch/http/response.rb:
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
Run Code Online (Sandbox Code Playgroud)
如果没有一些侵入性的黑客行为,例如添加专用中间件或monkeypatching actionpack,我似乎没有太多可以做到这一点ActionDispatch::Response.
为了解决这个问题,我添加了一个新的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
Run Code Online (Sandbox Code Playgroud)
这样配置application.rb:
config.middleware.use "::RemoveContentType"
Run Code Online (Sandbox Code Playgroud)
适用于我的102用例.可以更新解决方案以处理超过1xx的其他状态代码.
| 归档时间: |
|
| 查看次数: |
1149 次 |
| 最近记录: |