Название довольно понятно. Есть ли способ получить заголовки (кроме Rack::Request.env[]
)?
Rack:: Request - как мне получить все заголовки?
Ответ 1
Заголовки HTTP доступны в среде стойки, переданной вашему приложению:
HTTP_
Переменные: Переменные, соответствующие заголовкам HTTP-запроса, предоставленным клиентом (т.е. переменные, имена которых начинаются с HTTP_). Наличие или отсутствие этих переменных должно соответствовать присутствию или отсутствию соответствующего HTTP-заголовка в запросе.
Итак, заголовки HTTP имеют префикс "HTTP_" и добавляются в хэш.
Вот небольшая программа, которая извлекает и отображает их:
require 'rack'
app = Proc.new do |env|
headers = env.select {|k,v| k.start_with? 'HTTP_'}
.collect {|key, val| [key.sub(/^HTTP_/, ''), val]}
.collect {|key, val| "#{key}: #{val}<br>"}
.sort
[200, {'Content-Type' => 'text/html'}, headers]
end
Rack::Server.start :app => app, :Port => 8080
Когда я запускаю это, помимо заголовков HTTP, как показано в Chrome или Firefox, есть "VERSION: HTPP/1.1" (т.е. запись с ключом "HTTP_VERSION" и добавляется значение "HTTP/1.1" к env hash).
Ответ 2
Основываясь на ответе @matt, но это действительно дает заголовки запроса в хеше, как было задано в вопросе:
headers = Hash[*env.select {|k,v| k.start_with? 'HTTP_'}
.collect {|k,v| [k.sub(/^HTTP_/, ''), v]}
.collect {|k,v| [k.split('_').collect(&:capitalize).join('-'), v]}
.sort
.flatten]
В зависимости от того, какое соглашение по ключу вы предпочитаете, вы можете использовать что-то другое вместо: capize.
Ответ 3
Как ответ @Gavriel, но с использованием transform_keys
:
class Request
def headers
env.select { |k,v| k.start_with? 'HTTP_'}.
transform_keys { |k| k.sub(/^HTTP_/, '').split('_').map(&:capitalize).join('-') }
end
end