class ActionDispatch::Http::Headers

Action Dispatch HTTP Headers

Provides access to the request’s HTTP headers from the environment.

env     = { "CONTENT_TYPE" => "text/plain", "HTTP_USER_AGENT" => "curl/7.43.0" }
headers = ActionDispatch::Http::Headers.from_hash(env)
headers["Content-Type"] # => "text/plain"
headers["User-Agent"] # => "curl/7.43.0"

Also note that when headers are mapped to CGI-like variables by the Rack server, both dashes and underscores are converted to underscores. This ambiguity cannot be resolved at this stage anymore. Both underscores and dashes have to be interpreted as if they were originally sent as dashes.

# GET / HTTP/1.1
# ...
# User-Agent: curl/7.43.0
# X_Custom_Header: token

headers["X_Custom_Header"] # => nil
headers["X-Custom-Header"] # => "token"

Constants

CGI_VARIABLES
HTTP_HEADER

Public Class Methods

from_hash(hash) click to toggle source
# File lib/action_dispatch/http/headers.rb, line 54
def self.from_hash(hash)
  new ActionDispatch::Request.new hash
end

Public Instance Methods

[](key) click to toggle source

Returns the value for the given key mapped to @env.

# File lib/action_dispatch/http/headers.rb, line 63
def [](key)
  @req.get_header env_name(key)
end
[]=(key, value) click to toggle source

Sets the given value for the key mapped to @env.

# File lib/action_dispatch/http/headers.rb, line 68
def []=(key, value)
  @req.set_header env_name(key), value
end
add(key, value) click to toggle source

Add a value to a multivalued header like Vary or Accept-Encoding.

# File lib/action_dispatch/http/headers.rb, line 73
def add(key, value)
  @req.add_header env_name(key), value
end
each(&block) click to toggle source
# File lib/action_dispatch/http/headers.rb, line 98
def each(&block)
  @req.each_header(&block)
end
env() click to toggle source
# File lib/action_dispatch/http/headers.rb, line 118
def env; @req.env.dup; end
fetch(key, default = DEFAULT) { || ... } click to toggle source

Returns the value for the given key mapped to @env.

If the key is not found and an optional code block is not provided, raises a KeyError exception.

If the code block is provided, then it will be run and its result returned.

# File lib/action_dispatch/http/headers.rb, line 90
def fetch(key, default = DEFAULT)
  @req.fetch_header(env_name(key)) do
    return default unless default == DEFAULT
    return yield if block_given?
    raise KeyError, key
  end
end
include?(key)
Alias for: key?
key?(key) click to toggle source
# File lib/action_dispatch/http/headers.rb, line 77
def key?(key)
  @req.has_header? env_name(key)
end
Also aliased as: include?
merge(headers_or_env) click to toggle source

Returns a new Http::Headers instance containing the contents of headers_or_env and the original instance.

# File lib/action_dispatch/http/headers.rb, line 104
def merge(headers_or_env)
  headers = @req.dup.headers
  headers.merge!(headers_or_env)
  headers
end
merge!(headers_or_env) click to toggle source

Adds the contents of headers_or_env to original instance entries; duplicate keys are overwritten with the values from headers_or_env.

# File lib/action_dispatch/http/headers.rb, line 112
def merge!(headers_or_env)
  headers_or_env.each do |key, value|
    @req.set_header env_name(key), value
  end
end

Private Instance Methods

env_name(key) click to toggle source

Converts an HTTP header name to an environment variable name if it is not contained within the headers hash.

# File lib/action_dispatch/http/headers.rb, line 123
def env_name(key)
  key = key.to_s
  if HTTP_HEADER.match?(key)
    key = key.upcase
    key.tr!("-", "_")
    key.prepend("HTTP_") unless CGI_VARIABLES.include?(key)
  end
  key
end