Class: ActionDispatch::Http::Headers

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

Overview

# 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"

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:



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

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

Class Method Details

.from_hash(hash) ⇒ Object



54
55
56
# File 'lib/action_dispatch/http/headers.rb', line 54

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.



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

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

#[]=(key, value) ⇒ Object

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



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

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`.



73
74
75
# File 'lib/action_dispatch/http/headers.rb', line 73

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

#each(&block) ⇒ Object



98
99
100
# File 'lib/action_dispatch/http/headers.rb', line 98

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

#envObject



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

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.



90
91
92
93
94
95
96
# 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

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

Returns:

  • (Boolean)


77
78
79
# File 'lib/action_dispatch/http/headers.rb', line 77

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.



104
105
106
107
108
# 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) ⇒ Object

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



112
113
114
115
116
# 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