同步机架请求和响应

时间:2016-03-30 09:39:59

标签: ruby-on-rails mime-types rack rackattack

在我的rails 4应用中,我想对htmlhtml请求js做出回应。在请求为html类型时,渲染工作正常,但当请求为js时,html文件不会在屏幕上呈现(尽管在命令行中它表示已渲染) )。

限制请求有不同的方案,因此也可以通过html POSTjs POST请求触发限制代码。

Rack::Attack.throttle(key, limit: from_config(key, :limit), period: from_config(key, :period)) do |req|
  if req.path.ends_with?(from_config(key, :path).to_s) && from_config(key, :method) == req.env['REQUEST_METHOD']
    ### This is the snippet I try to change the req type with but not working
    if req.media_type == 'application/javascript'
      req.media_type = 'text/html'
    end
    ##### till here
    req.ip
  end
end

这是我正在尝试渲染的内容。如您所见,这是html回复。

Rack::Attack.throttled_response = lambda do |env|
  [429, {}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]]
end

我该怎么办?

更新

这是我的最新版本,但无法弄清楚如何检查请求content_type:

Rack::Attack.throttled_response = lambda do |env|
  retry_after = (env['rack.attack.match_data'] || {})[10]
  if env['rack.attack.content_type'] == 'text/html'
    [429, {'Retry-After' => retry_after.to_s}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]]
  elsif env['rack.attack.content_type'] == 'application/javascript'
    [429, {'Retry-After' => retry_after.to_s}, window.location.href = '/429.html']
  end
end

docs:https://github.com/kickstarter/rack-attack

1 个答案:

答案 0 :(得分:1)

我同意@max。原则上,您不应该使用HTML来响应专门针对JS的请求。

但要回答这部分问题:

  

如何检查请求content_type:

请尝试检查:

req.env['HTTP_ACCEPT']

<强>解释

  1. req is an object that subclasses Rack::Request
  2. Rack prepends HTTP_到客户端的HTTP请求标头,并将其添加到env哈希。
  3. Accept标题中的
  4. HTTP clients can indicate what MIME types they accept,与Content-Type标题相对,可以指示他们向您发送的数据类型。