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:



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

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

Class Method Details

.from_hash(hash) ⇒ Object



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

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.



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

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

#[]=(key, value) ⇒ Object

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



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

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.



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

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

#each(&block) ⇒ Object



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

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.



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

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)


75
76
77
# File 'lib/action_dispatch/http/headers.rb', line 75

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.



103
104
105
106
107
# File 'lib/action_dispatch/http/headers.rb', line 103

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