Синхронизировать запрос и ответ стойки
В моем приложении 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']
объяснение
req
это объект, который подклассыRack::Request
,- Стойка готовится
HTTP_
к заголовкам HTTP-запроса клиента и добавляет их кenv
хэш. - HTTP-клиенты могут указать, какие типы MIME они принимают в
Accept
заголовок, в отличие отContent-Type
заголовок, где они могут указать, какой тип данных они отправляют вам.