【问题标题】:Rails 3 middleware modify request headersRails 3 中间件修改请求标头
【发布时间】:2011-10-21 01:09:38
【问题描述】:

我的设置:Rails 3.0.9、Ruby 1.9.2

我正在开发我的第一个中间件应用程序,似乎所有示例都处理修改响应。我需要特别检查和修改请求标头,删除一些导致 Rack 1.2.3 中的错误阻塞的违规标头。这是典型的 hello world Rack 应用程序。

my_middleware.rb

class MyMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  end
end

有没有人处理请求标头并在 Rack 获取它之前拦截它们的示例?我需要在请求头到达 Rack 进行解析之前修改它。我有这个设置,认为将它放在 Rack 之前可能会奏效,但我不确定执行顺序是否以这种方式强制执行。

application.rb

config.middleware.insert_before Rack::Lock, "MyMiddleware"

【问题讨论】:

    标签: ruby-on-rails-3 rack middleware


    【解决方案1】:

    在您的call 方法中,您应该能够修改env,即机架环境。 Rack 将HTTP_ 附加到每个标头,因此Accept 标头将通过env['HTTP_ACCEPT'] 访问。

    因此,如果您需要删除某些标题,您应该可以执行env.delete('HTTP_ACCEPT') 之类的操作。然后当你做@app.call(env)时,它会使用你修改后的env

    有关env 对象的更多信息,请参阅the Rack documentation(请参阅“环境”)。

    【讨论】:

    • 太好了,我试试看,你知道我的设置是否在 Rack 之前拦截了标头,或者加载中间件的顺序在执行顺序方面是否重要。
    • 我相信 Rack 仍然会先拦截请求,然后将其传递给中间件而不是直接传递给 Rails。但我不是 100% 确定。
    • 如果是这样的话,那我就不行了。我刚刚转储了@app 对象类,它显示Rack::Lock 意味着Rack 已经得到了它。啊。
    • 我正在查看 Rack 的源代码,但找不到任何标头以“HTTP_”为前缀的参考。我一定是找错地方了,在哪里可以找到?
    • 请注意,如果您尝试访问带有连字符 (-) 的标题,则连字符也会变成下划线 (_)。例如,一个名为X-Token 的标头按如下方式访问:env['HTTP_X_TOKEN']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2011-03-22
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多