Подтвердить что ты не робот

Rack:: Request - как мне получить все заголовки?

Название довольно понятно. Есть ли способ получить заголовки (кроме Rack::Request.env[])?

4b9b3361

Ответ 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