Синхронизировать запрос и ответ стойки

В моем приложении rails 4 я бы хотел ответить html как для html а также js запрос. В тот момент, когда запрос html тип рендеринга работает нормально, но когда запрос js тогда html-файл не отображается на экране (хотя в командной строке он говорит, что он отображается).

Существуют разные сценарии ограничения запросов, поэтому код газа может быть вызван html POST а также js 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

документы: https://github.com/kickstarter/rack-attack

1 ответ

Я согласен с @max. В принципе, вы не должны отвечать HTML-запросом специально для JS.

Но чтобы ответить на эту часть вопроса:

как проверить запрос content_type:

Попробуйте проверить это вместо этого:

req.env['HTTP_ACCEPT']

объяснение

  1. req это объект, который подклассы Rack::Request,
  2. Стойка готовится HTTP_ к заголовкам HTTP-запроса клиента и добавляет их к env хэш.
  3. HTTP-клиенты могут указать, какие типы MIME они принимают в Accept заголовок, в отличие от Content-Type заголовок, где они могут указать, какой тип данных они отправляют вам.
Другие вопросы по тегам