Как и ответ @ Гавриэля, но с использованием 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
Вы можете даже сделать так, чтобы поиски продолжали работать, даже если случай отличается:
def headers
env.
select { |k,v| k.start_with? 'HTTP_'}.
transform_keys { |k| k.sub(/^HTTP_/, '').split('_').map(&:capitalize).join('-') }.
sort.to_h.
tap do |headers|
headers.define_singleton_method :[] do |k|
super(k.split(/[-_]/).map(&:capitalize).join('-'))
end
end
end
Так, например, даже если headers
нормализует ключи и возвращает следующее:
{
Dnt: '1',
Etag: 'W/"ec4454af5ae1bacff1afc5a06a2133f4"',
'X-Xss-Protection': '1; mode=block',
}
вы все равно можете искать заголовки, используя более естественные / общие имена для этих заголовков:
headers['DNT']
headers['ETag']
headers['X-XSS-Protection']