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:



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

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

Class Method Details

.from_hash(hash) ⇒ Object



50
51
52
# File 'lib/action_dispatch/http/headers.rb', line 50

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.



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

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

#[]=(key, value) ⇒ Object

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



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

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.



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

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

#each(&block) ⇒ Object



95
96
97
# File 'lib/action_dispatch/http/headers.rb', line 95

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

#envObject



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

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.



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

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)


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

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.



101
102
103
104
105
# File 'lib/action_dispatch/http/headers.rb', line 101

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.



110
111
112
113
114
# File 'lib/action_dispatch/http/headers.rb', line 110

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