Module: Rack::Request::Helpers
- Included in:
- Rack::Request
- Defined in:
- lib/rack/request.rb
Constant Summary collapse
- FORM_DATA_MEDIA_TYPES =
The set of form-data media-types. Requests that do not indicate one of the media types presents in this list will not be eligible for form-data / param parsing.
[ 'application/x-www-form-urlencoded', 'multipart/form-data' ]
- PARSEABLE_DATA_MEDIA_TYPES =
The set of media-types. Requests that do not indicate one of the media types presents in this list will not be eligible for param parsing like soap attachments or generic multiparts
[ 'multipart/related', 'multipart/mixed' ]
- DEFAULT_PORTS =
Default ports depending on scheme. Used to decide whether or not to include the port in a generated URI.
{ 'http' => 80, 'https' => 443, 'coffee' => 80 }
- HTTP_X_FORWARDED_SCHEME =
'HTTP_X_FORWARDED_SCHEME'.freeze
- HTTP_X_FORWARDED_PROTO =
'HTTP_X_FORWARDED_PROTO'.freeze
- HTTP_X_FORWARDED_HOST =
'HTTP_X_FORWARDED_HOST'.freeze
- HTTP_X_FORWARDED_PORT =
'HTTP_X_FORWARDED_PORT'.freeze
- HTTP_X_FORWARDED_SSL =
'HTTP_X_FORWARDED_SSL'.freeze
Instance Method Summary collapse
-
#[](key) ⇒ Object
shortcut for
request.params[key]
. -
#[]=(key, value) ⇒ Object
shortcut for
request.params[key] = value
. - #accept_encoding ⇒ Object
- #accept_language ⇒ Object
- #authority ⇒ Object
- #base_url ⇒ Object
- #body ⇒ Object
-
#content_charset ⇒ Object
The character set of the request body if a “charset” media type parameter was given, or nil if no “charset” was specified.
- #content_length ⇒ Object
- #content_type ⇒ Object
- #cookies ⇒ Object
-
#delete? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type DELETE.
-
#delete_param(k) ⇒ Object
Destructively delete a parameter, whether it’s in GET or POST.
-
#form_data? ⇒ Boolean
Determine whether the request body contains form-data by checking the request Content-Type for one of the media-types: “application/x-www-form-urlencoded” or “multipart/form-data”.
- #fullpath ⇒ Object
-
#GET ⇒ Object
Returns the data received in the query string.
-
#get? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type GET.
-
#head? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type HEAD.
- #host ⇒ Object
- #host_with_port ⇒ Object
- #ip ⇒ Object
-
#link? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type LINK.
- #logger ⇒ Object
-
#media_type ⇒ Object
The media type (type/subtype) portion of the CONTENT_TYPE header without any media type parameters.
-
#media_type_params ⇒ Object
The media type parameters provided in CONTENT_TYPE as a Hash, or an empty Hash if no CONTENT_TYPE or media-type parameters were provided.
- #multithread? ⇒ Boolean
-
#options? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type OPTIONS.
-
#params ⇒ Object
The union of GET and POST data.
-
#parseable_data? ⇒ Boolean
Determine whether the request body contains data by checking the request media_type against registered parse-data media-types.
-
#patch? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type PATCH.
- #path ⇒ Object
- #path_info ⇒ Object
- #path_info=(s) ⇒ Object
- #port ⇒ Object
-
#POST ⇒ Object
Returns the data received in the request body.
-
#post? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type POST.
-
#put? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type PUT.
- #query_string ⇒ Object
-
#referer ⇒ Object
(also: #referrer)
the referer of the client.
- #request_method ⇒ Object
- #scheme ⇒ Object
- #script_name ⇒ Object
- #script_name=(s) ⇒ Object
- #session ⇒ Object
- #session_options ⇒ Object
- #ssl? ⇒ Boolean
-
#trace? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type TRACE.
- #trusted_proxy?(ip) ⇒ Boolean
-
#unlink? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type UNLINK.
-
#update_param(k, v) ⇒ Object
Destructively update a parameter, whether it’s in GET and/or POST.
-
#url ⇒ Object
Tries to return a remake of the original request URL as a string.
- #user_agent ⇒ Object
-
#values_at(*keys) ⇒ Object
like Hash#values_at.
- #xhr? ⇒ Boolean
Instance Method Details
#[](key) ⇒ Object
shortcut for request.params[key]
424 425 426 427 428 429 430 |
# File 'lib/rack/request.rb', line 424 def [](key) if $verbose warn("Request#[] is deprecated and will be removed in a future version of Rack. Please use request.params[] instead") end params[key.to_s] end |
#[]=(key, value) ⇒ Object
shortcut for request.params[key] = value
Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
435 436 437 438 439 440 441 |
# File 'lib/rack/request.rb', line 435 def []=(key, value) if $verbose warn("Request#[]= is deprecated and will be removed in a future version of Rack. Please use request.params[]= instead") end params[key.to_s] = value end |
#accept_encoding ⇒ Object
411 412 413 |
# File 'lib/rack/request.rb', line 411 def accept_encoding parse_http_accept_header(get_header("HTTP_ACCEPT_ENCODING")) end |
#accept_language ⇒ Object
415 416 417 |
# File 'lib/rack/request.rb', line 415 def accept_language parse_http_accept_header(get_header("HTTP_ACCEPT_LANGUAGE")) end |
#authority ⇒ Object
200 201 202 |
# File 'lib/rack/request.rb', line 200 def get_header(SERVER_NAME) + ':' + get_header(SERVER_PORT) end |
#base_url ⇒ Object
392 393 394 395 396 |
# File 'lib/rack/request.rb', line 392 def base_url url = "#{scheme}://#{host}" url << ":#{port}" if port != DEFAULT_PORTS[scheme] url end |
#body ⇒ Object
126 |
# File 'lib/rack/request.rb', line 126 def body; get_header(RACK_INPUT) end |
#content_charset ⇒ Object
The character set of the request body if a “charset” media type parameter was given, or nil if no “charset” was specified. Note that, per RFC2616, text/* media types that specify no explicit charset are to be considered ISO-8859-1.
290 291 292 |
# File 'lib/rack/request.rb', line 290 def content_charset media_type_params['charset'] end |
#content_length ⇒ Object
135 |
# File 'lib/rack/request.rb', line 135 def content_length; get_header('CONTENT_LENGTH') end |
#content_type ⇒ Object
216 217 218 219 |
# File 'lib/rack/request.rb', line 216 def content_type content_type = get_header('CONTENT_TYPE') content_type.nil? || content_type.empty? ? nil : content_type end |
#cookies ⇒ Object
204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/rack/request.rb', line 204 def hash = fetch_header(RACK_REQUEST_COOKIE_HASH) do |k| set_header(k, {}) end string = get_header HTTP_COOKIE return hash if string == get_header(RACK_REQUEST_COOKIE_STRING) hash.replace Utils. get_header HTTP_COOKIE set_header(RACK_REQUEST_COOKIE_STRING, string) hash end |
#delete? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type DELETE
157 |
# File 'lib/rack/request.rb', line 157 def delete?; request_method == DELETE end |
#delete_param(k) ⇒ Object
Destructively delete a parameter, whether it’s in GET or POST. Returns the value of the deleted parameter.
If the parameter is in both GET and POST, the POST value takes precedence since that’s how #params works.
env['rack.input']
is not touched.
388 389 390 |
# File 'lib/rack/request.rb', line 388 def delete_param(k) [ self.POST.delete(k), self.GET.delete(k) ].compact.first end |
#form_data? ⇒ Boolean
Determine whether the request body contains form-data by checking the request Content-Type for one of the media-types: “application/x-www-form-urlencoded” or “multipart/form-data”. The list of form-data media types can be modified through the FORM_DATA_MEDIA_TYPES
array.
A request body is also assumed to contain form-data when no Content-Type header is provided and the request_method is POST.
302 303 304 305 306 |
# File 'lib/rack/request.rb', line 302 def form_data? type = media_type meth = get_header(RACK_METHODOVERRIDE_ORIGINAL_METHOD) || get_header(REQUEST_METHOD) (meth == POST && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type) end |
#fullpath ⇒ Object
407 408 409 |
# File 'lib/rack/request.rb', line 407 def fullpath query_string.empty? ? path : "#{path}?#{query_string}" end |
#GET ⇒ Object
Returns the data received in the query string.
315 316 317 318 319 320 321 322 323 |
# File 'lib/rack/request.rb', line 315 def GET if get_header(RACK_REQUEST_QUERY_STRING) == query_string get_header(RACK_REQUEST_QUERY_HASH) else query_hash = parse_query(query_string, '&;') set_header(RACK_REQUEST_QUERY_STRING, query_string) set_header(RACK_REQUEST_QUERY_HASH, query_hash) end end |
#get? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type GET
160 |
# File 'lib/rack/request.rb', line 160 def get?; request_method == GET end |
#head? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type HEAD
163 |
# File 'lib/rack/request.rb', line 163 def head?; request_method == HEAD end |
#host ⇒ Object
233 234 235 236 |
# File 'lib/rack/request.rb', line 233 def host # Remove port number. host_with_port.to_s.sub(/:\d+\z/, '') end |
#host_with_port ⇒ Object
225 226 227 228 229 230 231 |
# File 'lib/rack/request.rb', line 225 def host_with_port if forwarded = get_header(HTTP_X_FORWARDED_HOST) forwarded.split(/,\s?/).last else get_header(HTTP_HOST) || "#{get_header(SERVER_NAME) || get_header(SERVER_ADDR)}:#{get_header(SERVER_PORT)}" end end |
#ip ⇒ Object
256 257 258 259 260 261 262 263 264 265 |
# File 'lib/rack/request.rb', line 256 def ip remote_addrs = split_ip_addresses(get_header('REMOTE_ADDR')) remote_addrs = reject_trusted_ip_addresses(remote_addrs) return remote_addrs.first if remote_addrs.any? forwarded_ips = split_ip_addresses(get_header('HTTP_X_FORWARDED_FOR')) return reject_trusted_ip_addresses(forwarded_ips).last || get_header("REMOTE_ADDR") end |
#link? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type LINK
169 |
# File 'lib/rack/request.rb', line 169 def link?; request_method == LINK end |
#logger ⇒ Object
136 |
# File 'lib/rack/request.rb', line 136 def logger; get_header(RACK_LOGGER) end |
#media_type ⇒ Object
The media type (type/subtype) portion of the CONTENT_TYPE header without any media type parameters. e.g., when CONTENT_TYPE is “text/plain;charset=utf-8”, the media-type is “text/plain”.
For more information on the use of media types in HTTP, see: www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
273 274 275 |
# File 'lib/rack/request.rb', line 273 def media_type MediaType.type(content_type) end |
#media_type_params ⇒ Object
The media type parameters provided in CONTENT_TYPE as a Hash, or an empty Hash if no CONTENT_TYPE or media-type parameters were provided. e.g., when the CONTENT_TYPE is “text/plain;charset=utf-8”, this method responds with the following Hash:
{ 'charset' => 'utf-8' }
282 283 284 |
# File 'lib/rack/request.rb', line 282 def media_type_params MediaType.params(content_type) end |
#multithread? ⇒ Boolean
138 |
# File 'lib/rack/request.rb', line 138 def multithread?; get_header(RACK_MULTITHREAD) end |
#options? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type OPTIONS
166 |
# File 'lib/rack/request.rb', line 166 def ; request_method == OPTIONS end |
#params ⇒ Object
The union of GET and POST data.
Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
357 358 359 360 361 |
# File 'lib/rack/request.rb', line 357 def params self.GET.merge(self.POST) rescue EOFError self.GET.dup end |
#parseable_data? ⇒ Boolean
Determine whether the request body contains data by checking the request media_type against registered parse-data media-types
310 311 312 |
# File 'lib/rack/request.rb', line 310 def parseable_data? PARSEABLE_DATA_MEDIA_TYPES.include?(media_type) end |
#patch? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type PATCH
172 |
# File 'lib/rack/request.rb', line 172 def patch?; request_method == PATCH end |
#path ⇒ Object
403 404 405 |
# File 'lib/rack/request.rb', line 403 def path script_name + path_info end |
#path_info ⇒ Object
130 |
# File 'lib/rack/request.rb', line 130 def path_info; get_header(PATH_INFO).to_s end |
#path_info=(s) ⇒ Object
131 |
# File 'lib/rack/request.rb', line 131 def path_info=(s); set_header(PATH_INFO, s.to_s) end |
#port ⇒ Object
238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/rack/request.rb', line 238 def port if port = host_with_port.split(/:/)[1] port.to_i elsif port = get_header(HTTP_X_FORWARDED_PORT) port.to_i elsif has_header?(HTTP_X_FORWARDED_HOST) DEFAULT_PORTS[scheme] elsif has_header?(HTTP_X_FORWARDED_PROTO) DEFAULT_PORTS[get_header(HTTP_X_FORWARDED_PROTO).split(',')[0]] else get_header(SERVER_PORT).to_i end end |
#POST ⇒ Object
Returns the data received in the request body.
This method support both application/x-www-form-urlencoded and multipart/form-data.
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# File 'lib/rack/request.rb', line 329 def POST if get_header(RACK_INPUT).nil? raise "Missing rack.input" elsif get_header(RACK_REQUEST_FORM_INPUT) == get_header(RACK_INPUT) get_header(RACK_REQUEST_FORM_HASH) elsif form_data? || parseable_data? unless set_header(RACK_REQUEST_FORM_HASH, parse_multipart) form_vars = get_header(RACK_INPUT).read # Fix for Safari Ajax postings that always append \0 # form_vars.sub!(/\0\z/, '') # performance replacement: form_vars.slice!(-1) if form_vars[-1] == ?\0 set_header RACK_REQUEST_FORM_VARS, form_vars set_header RACK_REQUEST_FORM_HASH, parse_query(form_vars, '&') get_header(RACK_INPUT).rewind end set_header RACK_REQUEST_FORM_INPUT, get_header(RACK_INPUT) get_header RACK_REQUEST_FORM_HASH else {} end end |
#post? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type POST
175 |
# File 'lib/rack/request.rb', line 175 def post?; request_method == POST end |
#put? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type PUT
178 |
# File 'lib/rack/request.rb', line 178 def put?; request_method == PUT end |
#query_string ⇒ Object
134 |
# File 'lib/rack/request.rb', line 134 def query_string; get_header(QUERY_STRING).to_s end |
#referer ⇒ Object Also known as: referrer
the referer of the client
141 |
# File 'lib/rack/request.rb', line 141 def referer; get_header('HTTP_REFERER') end |
#request_method ⇒ Object
133 |
# File 'lib/rack/request.rb', line 133 def request_method; get_header(REQUEST_METHOD) end |
#scheme ⇒ Object
186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/rack/request.rb', line 186 def scheme if get_header(HTTPS) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SSL) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SCHEME) get_header(HTTP_X_FORWARDED_SCHEME) elsif get_header(HTTP_X_FORWARDED_PROTO) get_header(HTTP_X_FORWARDED_PROTO).split(',')[0] else get_header(RACK_URL_SCHEME) end end |
#script_name ⇒ Object
127 |
# File 'lib/rack/request.rb', line 127 def script_name; get_header(SCRIPT_NAME).to_s end |
#script_name=(s) ⇒ Object
128 |
# File 'lib/rack/request.rb', line 128 def script_name=(s); set_header(SCRIPT_NAME, s.to_s) end |
#session ⇒ Object
144 145 146 147 148 |
# File 'lib/rack/request.rb', line 144 def session fetch_header(RACK_SESSION) do |k| set_header RACK_SESSION, default_session end end |
#session_options ⇒ Object
150 151 152 153 154 |
# File 'lib/rack/request.rb', line 150 def fetch_header(RACK_SESSION_OPTIONS) do |k| set_header RACK_SESSION_OPTIONS, {} end end |
#ssl? ⇒ Boolean
252 253 254 |
# File 'lib/rack/request.rb', line 252 def ssl? scheme == 'https' end |
#trace? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type TRACE
181 |
# File 'lib/rack/request.rb', line 181 def trace?; request_method == TRACE end |
#trusted_proxy?(ip) ⇒ Boolean
419 420 421 |
# File 'lib/rack/request.rb', line 419 def trusted_proxy?(ip) ip =~ /\A127\.0\.0\.1\Z|\A(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|\A::1\Z|\Afd[0-9a-f]{2}:.+|\Alocalhost\Z|\Aunix\Z|\Aunix:/i end |
#unlink? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type UNLINK
184 |
# File 'lib/rack/request.rb', line 184 def unlink?; request_method == UNLINK end |
#update_param(k, v) ⇒ Object
Destructively update a parameter, whether it’s in GET and/or POST. Returns nil.
The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn’t previously defined, it’s inserted into GET.
env['rack.input']
is not touched.
368 369 370 371 372 373 374 375 376 377 378 379 380 381 |
# File 'lib/rack/request.rb', line 368 def update_param(k, v) found = false if self.GET.has_key?(k) found = true self.GET[k] = v end if self.POST.has_key?(k) found = true self.POST[k] = v end unless found self.GET[k] = v end end |
#url ⇒ Object
Tries to return a remake of the original request URL as a string.
399 400 401 |
# File 'lib/rack/request.rb', line 399 def url base_url + fullpath end |
#user_agent ⇒ Object
137 |
# File 'lib/rack/request.rb', line 137 def user_agent; get_header('HTTP_USER_AGENT') end |
#values_at(*keys) ⇒ Object
like Hash#values_at
444 445 446 |
# File 'lib/rack/request.rb', line 444 def values_at(*keys) keys.map { |key| params[key] } end |
#xhr? ⇒ Boolean
221 222 223 |
# File 'lib/rack/request.rb', line 221 def xhr? get_header("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest" end |