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 present 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 present 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_FOR =
The address of the client which connected to the proxy.
'HTTP_X_FORWARDED_FOR'
- HTTP_X_FORWARDED_HOST =
The contents of the host/:authority header sent to the proxy.
'HTTP_X_FORWARDED_HOST'
- HTTP_X_FORWARDED_SCHEME =
The value of the scheme sent to the proxy.
'HTTP_X_FORWARDED_SCHEME'
- HTTP_X_FORWARDED_PROTO =
The protocol used to connect to the proxy.
'HTTP_X_FORWARDED_PROTO'
- HTTP_X_FORWARDED_PORT =
The port used to connect to the proxy.
'HTTP_X_FORWARDED_PORT'
- HTTP_X_FORWARDED_SSL =
Another way for specifing https scheme was used.
'HTTP_X_FORWARDED_SSL'
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
The authority of the incoming request as defined by RFC3976.
- #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”.
- #forwarded_authority ⇒ Object
- #forwarded_for ⇒ Object
- #forwarded_port ⇒ Object
- #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
Returns a formatted host, suitable for being used in a URI.
-
#host_authority ⇒ Object
The `HTTP_HOST` header.
- #host_with_port(authority = self.authority) ⇒ Object
-
#hostname ⇒ Object
Returns an address suitable for being to resolve to an address.
- #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
-
#server_authority ⇒ Object
The authority as defined by the `SERVER_NAME` and `SERVER_PORT` variables.
- #server_name ⇒ Object
- #server_port ⇒ 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]
532 533 534 535 536 537 538 |
# File 'lib/rack/request.rb', line 532 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.
543 544 545 546 547 548 549 |
# File 'lib/rack/request.rb', line 543 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
519 520 521 |
# File 'lib/rack/request.rb', line 519 def accept_encoding parse_http_accept_header(get_header("HTTP_ACCEPT_ENCODING")) end |
#accept_language ⇒ Object
523 524 525 |
# File 'lib/rack/request.rb', line 523 def accept_language parse_http_accept_header(get_header("HTTP_ACCEPT_LANGUAGE")) end |
#authority ⇒ Object
The authority of the incoming request as defined by RFC3976. tools.ietf.org/html/rfc3986#section-3.2
In HTTP/1, this is the `host` header. In HTTP/2, this is the `:authority` pseudo-header.
227 228 229 |
# File 'lib/rack/request.rb', line 227 def || || end |
#base_url ⇒ Object
502 503 504 |
# File 'lib/rack/request.rb', line 502 def base_url "#{scheme}://#{host_with_port}" end |
#body ⇒ Object
150 |
# File 'lib/rack/request.rb', line 150 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.
400 401 402 |
# File 'lib/rack/request.rb', line 400 def content_charset media_type_params['charset'] end |
#content_length ⇒ Object
159 |
# File 'lib/rack/request.rb', line 159 def content_length; get_header('CONTENT_LENGTH') end |
#content_type ⇒ Object
271 272 273 274 |
# File 'lib/rack/request.rb', line 271 def content_type content_type = get_header('CONTENT_TYPE') content_type.nil? || content_type.empty? ? nil : content_type end |
#cookies ⇒ Object
256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
# File 'lib/rack/request.rb', line 256 def hash = fetch_header(RACK_REQUEST_COOKIE_HASH) do |key| set_header(key, {}) end string = get_header(HTTP_COOKIE) unless string == get_header(RACK_REQUEST_COOKIE_STRING) hash.replace Utils.(string) set_header(RACK_REQUEST_COOKIE_STRING, string) end hash end |
#delete? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type DELETE
181 |
# File 'lib/rack/request.rb', line 181 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.
497 498 499 500 |
# File 'lib/rack/request.rb', line 497 def delete_param(k) post_value, get_value = self.POST.delete(k), self.GET.delete(k) post_value || get_value 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.
412 413 414 415 416 417 |
# File 'lib/rack/request.rb', line 412 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 |
#forwarded_authority ⇒ Object
344 345 346 347 348 |
# File 'lib/rack/request.rb', line 344 def if value = get_header(HTTP_X_FORWARDED_HOST) wrap_ipv6(split_header(value).first) end end |
#forwarded_for ⇒ Object
330 331 332 333 334 335 336 |
# File 'lib/rack/request.rb', line 330 def forwarded_for if value = get_header(HTTP_X_FORWARDED_FOR) split_header(value).map do || (wrap_ipv6())[1] end end end |
#forwarded_port ⇒ Object
338 339 340 341 342 |
# File 'lib/rack/request.rb', line 338 def forwarded_port if value = get_header(HTTP_X_FORWARDED_PORT) split_header(value).map(&:to_i) end end |
#fullpath ⇒ Object
515 516 517 |
# File 'lib/rack/request.rb', line 515 def fullpath query_string.empty? ? path : "#{path}?#{query_string}" end |
#GET ⇒ Object
Returns the data received in the query string.
426 427 428 429 430 431 432 433 434 |
# File 'lib/rack/request.rb', line 426 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
184 |
# File 'lib/rack/request.rb', line 184 def get?; request_method == GET end |
#head? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type HEAD
187 |
# File 'lib/rack/request.rb', line 187 def head?; request_method == HEAD end |
#host ⇒ Object
Returns a formatted host, suitable for being used in a URI.
296 297 298 |
# File 'lib/rack/request.rb', line 296 def host (self.)[0] end |
#host_authority ⇒ Object
The `HTTP_HOST` header.
281 282 283 |
# File 'lib/rack/request.rb', line 281 def get_header(HTTP_HOST) end |
#host_with_port(authority = self.authority) ⇒ Object
285 286 287 288 289 290 291 292 293 |
# File 'lib/rack/request.rb', line 285 def host_with_port( = self.) host, _, port = () if port == DEFAULT_PORTS[self.scheme] host else end end |
#hostname ⇒ Object
Returns an address suitable for being to resolve to an address. In the case of a domain name or IPv4 address, the result is the same as host
. In the case of IPv6 or future address formats, the square brackets are removed.
304 305 306 |
# File 'lib/rack/request.rb', line 304 def hostname (self.)[1] end |
#ip ⇒ Object
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 |
# File 'lib/rack/request.rb', line 354 def ip remote_addresses = split_header(get_header('REMOTE_ADDR')) external_addresses = reject_trusted_ip_addresses(remote_addresses) unless external_addresses.empty? return external_addresses.first end if forwarded_for = self.forwarded_for unless forwarded_for.empty? # The forwarded for addresses are ordered: client, proxy1, proxy2. # So we reject all the trusted addresses (proxy*) and return the # last client. Or if we trust everyone, we just return the first # address. return reject_trusted_ip_addresses(forwarded_for).last || forwarded_for.first end end # If all the addresses are trusted, and we aren't forwarded, just return # the first remote address, which represents the source of the request. remote_addresses.first end |
#link? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type LINK
193 |
# File 'lib/rack/request.rb', line 193 def link?; request_method == LINK end |
#logger ⇒ Object
160 |
# File 'lib/rack/request.rb', line 160 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
383 384 385 |
# File 'lib/rack/request.rb', line 383 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' }
392 393 394 |
# File 'lib/rack/request.rb', line 392 def media_type_params MediaType.params(content_type) end |
#multithread? ⇒ Boolean
162 |
# File 'lib/rack/request.rb', line 162 def multithread?; get_header(RACK_MULTITHREAD) end |
#options? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type OPTIONS
190 |
# File 'lib/rack/request.rb', line 190 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.
468 469 470 |
# File 'lib/rack/request.rb', line 468 def params self.GET.merge(self.POST) end |
#parseable_data? ⇒ Boolean
Determine whether the request body contains data by checking the request media_type against registered parse-data media-types
421 422 423 |
# File 'lib/rack/request.rb', line 421 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
196 |
# File 'lib/rack/request.rb', line 196 def patch?; request_method == PATCH end |
#path ⇒ Object
511 512 513 |
# File 'lib/rack/request.rb', line 511 def path script_name + path_info end |
#path_info ⇒ Object
154 |
# File 'lib/rack/request.rb', line 154 def path_info; get_header(PATH_INFO).to_s end |
#path_info=(s) ⇒ Object
155 |
# File 'lib/rack/request.rb', line 155 def path_info=(s); set_header(PATH_INFO, s.to_s) end |
#port ⇒ Object
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
# File 'lib/rack/request.rb', line 308 def port if = self. _, _, port = (self.) if port return port end end if forwarded_port = self.forwarded_port return forwarded_port.first end if scheme = self.scheme if port = DEFAULT_PORTS[self.scheme] return port end end self.server_port end |
#POST ⇒ Object
Returns the data received in the request body.
This method support both application/x-www-form-urlencoded and multipart/form-data.
440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 |
# File 'lib/rack/request.rb', line 440 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.end_with?("\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
199 |
# File 'lib/rack/request.rb', line 199 def post?; request_method == POST end |
#put? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type PUT
202 |
# File 'lib/rack/request.rb', line 202 def put?; request_method == PUT end |
#query_string ⇒ Object
158 |
# File 'lib/rack/request.rb', line 158 def query_string; get_header(QUERY_STRING).to_s end |
#referer ⇒ Object Also known as: referrer
the referer of the client
165 |
# File 'lib/rack/request.rb', line 165 def referer; get_header('HTTP_REFERER') end |
#request_method ⇒ Object
157 |
# File 'lib/rack/request.rb', line 157 def request_method; get_header(REQUEST_METHOD) end |
#scheme ⇒ Object
210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/rack/request.rb', line 210 def scheme if get_header(HTTPS) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SSL) == 'on' 'https' elsif forwarded_scheme forwarded_scheme else get_header(RACK_URL_SCHEME) end end |
#script_name ⇒ Object
151 |
# File 'lib/rack/request.rb', line 151 def script_name; get_header(SCRIPT_NAME).to_s end |
#script_name=(s) ⇒ Object
152 |
# File 'lib/rack/request.rb', line 152 def script_name=(s); set_header(SCRIPT_NAME, s.to_s) end |
#server_authority ⇒ Object
The authority as defined by the `SERVER_NAME` and `SERVER_PORT` variables.
233 234 235 236 237 238 239 240 241 242 243 244 |
# File 'lib/rack/request.rb', line 233 def host = self.server_name port = self.server_port if host if port "#{host}:#{port}" else host end end end |
#server_name ⇒ Object
246 247 248 |
# File 'lib/rack/request.rb', line 246 def server_name get_header(SERVER_NAME) end |
#server_port ⇒ Object
250 251 252 253 254 |
# File 'lib/rack/request.rb', line 250 def server_port if port = get_header(SERVER_PORT) Integer(port) end end |
#session ⇒ Object
168 169 170 171 172 |
# File 'lib/rack/request.rb', line 168 def session fetch_header(RACK_SESSION) do |k| set_header RACK_SESSION, default_session end end |
#session_options ⇒ Object
174 175 176 177 178 |
# File 'lib/rack/request.rb', line 174 def fetch_header(RACK_SESSION_OPTIONS) do |k| set_header RACK_SESSION_OPTIONS, {} end end |
#ssl? ⇒ Boolean
350 351 352 |
# File 'lib/rack/request.rb', line 350 def ssl? scheme == 'https' || scheme == 'wss' end |
#trace? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type TRACE
205 |
# File 'lib/rack/request.rb', line 205 def trace?; request_method == TRACE end |
#trusted_proxy?(ip) ⇒ Boolean
527 528 529 |
# File 'lib/rack/request.rb', line 527 def trusted_proxy?(ip) Rack::Request.ip_filter.call(ip) end |
#unlink? ⇒ Boolean
Checks the HTTP request method (or verb) to see if it was of type UNLINK
208 |
# File 'lib/rack/request.rb', line 208 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.
477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
# File 'lib/rack/request.rb', line 477 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.
507 508 509 |
# File 'lib/rack/request.rb', line 507 def url base_url + fullpath end |
#user_agent ⇒ Object
161 |
# File 'lib/rack/request.rb', line 161 def user_agent; get_header('HTTP_USER_AGENT') end |
#values_at(*keys) ⇒ Object
like Hash#values_at
552 553 554 |
# File 'lib/rack/request.rb', line 552 def values_at(*keys) keys.map { |key| params[key] } end |
#xhr? ⇒ Boolean
276 277 278 |
# File 'lib/rack/request.rb', line 276 def xhr? get_header("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest" end |