Class: ActionDispatch::Http::Headers

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/action_dispatch/http/headers.rb

Overview

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"

Constant Summary collapse

CGI_VARIABLES =
Set.new(%W[
  AUTH_TYPE
  CONTENT_LENGTH
  CONTENT_TYPE
  GATEWAY_INTERFACE
  HTTPS
  PATH_INFO
  PATH_TRANSLATED
  QUERY_STRING
  REMOTE_ADDR
  REMOTE_HOST
  REMOTE_IDENT
  REMOTE_USER
  REQUEST_METHOD
  SCRIPT_NAME
  SERVER_NAME
  SERVER_PORT
  SERVER_PROTOCOL
  SERVER_SOFTWARE
]).freeze
HTTP_HEADER =
/\A[A-Za-z0-9-]+\z/
DEFAULT =

:nodoc:

Object.new

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(request) ⇒ Headers

:nodoc:



52
53
54
# File 'lib/action_dispatch/http/headers.rb', line 52

def initialize(request) # :nodoc:
  @req = request
end

Class Method Details

.from_hash(hash) ⇒ Object



48
49
50
# File 'lib/action_dispatch/http/headers.rb', line 48

def self.from_hash(hash)
  new ActionDispatch::Request.new hash
end

Instance Method Details

#[](key) ⇒ Object

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



57
58
59
# File 'lib/action_dispatch/http/headers.rb', line 57

def [](key)
  @req.get_header env_name(key)
end

#[]=(key, value) ⇒ Object

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



62
63
64
# File 'lib/action_dispatch/http/headers.rb', line 62

def []=(key, value)
  @req.set_header env_name(key), value
end

#add(key, value) ⇒ Object

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



67
68
69
# File 'lib/action_dispatch/http/headers.rb', line 67

def add(key, value)
  @req.add_header env_name(key), value
end

#each(&block) ⇒ Object



93
94
95
# File 'lib/action_dispatch/http/headers.rb', line 93

def each(&block)
  @req.each_header(&block)
end

#envObject



114
# File 'lib/action_dispatch/http/headers.rb', line 114

def env; @req.env.dup; end

#fetch(key, default = DEFAULT) ⇒ Object

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.



85
86
87
88
89
90
91
# File 'lib/action_dispatch/http/headers.rb', line 85

def fetch(key, default = DEFAULT)
  @req.fetch_header(env_name(key)) do
    return default unless default == DEFAULT
    return yield if block_given?
    raise NameError, key
  end
end

#key?(key) ⇒ Boolean Also known as: include?

Returns:

  • (Boolean)


71
72
73
# File 'lib/action_dispatch/http/headers.rb', line 71

def key?(key)
  @req.has_header? env_name(key)
end

#merge(headers_or_env) ⇒ Object

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



99
100
101
102
103
# File 'lib/action_dispatch/http/headers.rb', line 99

def merge(headers_or_env)
  headers = @req.dup.headers
  headers.merge!(headers_or_env)
  headers
end

#merge!(headers_or_env) ⇒ Object

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



108
109
110
111
112
# File 'lib/action_dispatch/http/headers.rb', line 108

def merge!(headers_or_env)
  headers_or_env.each do |key, value|
    @req.set_header env_name(key), value
  end
end