2016-01-14 13:35:25 +01:00
|
|
|
= cowboy_req(3)
|
|
|
|
|
|
|
|
== Name
|
|
|
|
|
|
|
|
cowboy_req - HTTP request and response
|
|
|
|
|
|
|
|
== Description
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
The `cowboy_req` module provides functions to access, manipulate
|
|
|
|
and respond to requests.
|
|
|
|
|
|
|
|
The functions in this module follow patterns for their return types,
|
|
|
|
based on the kind of function.
|
|
|
|
|
2014-09-23 16:43:29 +03:00
|
|
|
* access: `Value`
|
|
|
|
* action: `ok | {Result, Req} | {Result, Value, Req}`
|
2014-07-06 13:10:35 +02:00
|
|
|
* modification: `Req`
|
|
|
|
* question: `boolean()`
|
|
|
|
|
|
|
|
Whenever `Req` is returned, you must use this returned value and
|
|
|
|
ignore any previous you may have had. This value contains various
|
2014-09-23 16:43:29 +03:00
|
|
|
values which are necessary for Cowboy to keep track of the request
|
|
|
|
and response states.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
All functions which perform an action should only be called once.
|
|
|
|
This includes reading the request body or replying. Cowboy will
|
2014-09-23 16:43:29 +03:00
|
|
|
throw an error on the second call when it detects suspicious behavior.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
It is highly discouraged to pass the Req object to another process.
|
|
|
|
Doing so and calling `cowboy_req` functions from it leads to
|
|
|
|
undefined behavior.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
== Types
|
|
|
|
|
|
|
|
=== body_opts() = [Option]
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
[source,erlang]
|
|
|
|
----
|
|
|
|
Option = {continue, boolean()}
|
2014-07-06 13:10:35 +02:00
|
|
|
| {length, non_neg_integer()}
|
|
|
|
| {read_length, non_neg_integer()}
|
|
|
|
| {read_timeout, timeout()}
|
|
|
|
| {transfer_decode, transfer_decode_fun(), any()}
|
2016-01-14 13:35:25 +01:00
|
|
|
| {content_decode, content_decode_fun()}
|
|
|
|
----
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Request body reading options.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== cookie_opts() = [Option]
|
|
|
|
|
|
|
|
[source,erlang]
|
|
|
|
----
|
|
|
|
Option = {max_age, non_neg_integer()}
|
|
|
|
| {domain, binary()}
|
|
|
|
| {path, binary()}
|
|
|
|
| {secure, boolean()}
|
|
|
|
| {http_only, boolean()}
|
|
|
|
----
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Cookie options.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== req() - opaque to the user
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
The Req object.
|
|
|
|
|
|
|
|
All functions in this module receive a `Req` as argument,
|
2016-01-14 13:35:25 +01:00
|
|
|
and some of them return a new object labelled `Req2` in
|
2014-07-06 13:10:35 +02:00
|
|
|
the function descriptions below.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
== Request related exports
|
|
|
|
|
|
|
|
=== binding(Name, Req) -> binding(Name, Req, undefined)
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Alias of `cowboy_req:binding/3`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== binding(Name, Req, Default) -> Value
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = atom():: Binding name.
|
|
|
|
Default = any():: Default value.
|
|
|
|
Value = any() | Default:: Binding value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the value for the given binding.
|
|
|
|
|
|
|
|
By default the value is a binary, however constraints may change
|
|
|
|
the type of this value (for example automatically converting
|
|
|
|
numbers to integer).
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== bindings(Req) -> [{Name, Value}]
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = atom():: Binding name.
|
|
|
|
Value = any():: Binding value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return all bindings.
|
|
|
|
|
|
|
|
By default the value is a binary, however constraints may change
|
|
|
|
the type of this value (for example automatically converting
|
|
|
|
numbers to integer).
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== header(Name, Req) -> header(Name, Req, undefined)
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Alias of `cowboy_req:header/3`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== header(Name, Req, Default) -> Value
|
|
|
|
|
|
|
|
Name = binary():: Request header name.
|
|
|
|
Default = any():: Default value.
|
|
|
|
Value = binary() | Default:: Request header value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the value for the given header.
|
|
|
|
|
|
|
|
While header names are case insensitive, this function expects
|
|
|
|
the name to be a lowercase binary.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== headers(Req) -> Headers
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Headers = cowboy:http_headers():: Request headers.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return all headers.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== host(Req) -> Host
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Host = binary():: Requested host.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the requested host.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== host_info(Req) -> HostInfo
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
HostInfo = cowboy_router:tokens() | undefined:: Extra tokens for the host.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the extra tokens from matching against `...` during routing.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== host_url(Req) -> HostURL
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
HostURL = binary() | undefined:: Requested URL, without the path component.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the requested URL excluding the path component.
|
|
|
|
|
|
|
|
This function will always return `undefined` until the
|
2014-09-24 14:39:17 +03:00
|
|
|
`cowboy_router` middleware has been executed.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== match_cookies(Fields, Req) -> Map
|
2014-09-23 16:43:29 +03:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Fields = cowboy:fields():: Cookie fields match rules.
|
|
|
|
Map = map():: Cookie fields matched.
|
2014-09-23 16:43:29 +03:00
|
|
|
|
|
|
|
Match cookies against the given fields.
|
|
|
|
|
|
|
|
Cowboy will only return the cookie values specified in the
|
|
|
|
fields list, and ignore all others. Fields can be either
|
|
|
|
the name of the cookie requested; the name along with a
|
|
|
|
list of constraints; or the name, a list of constraints
|
|
|
|
and a default value in case the cookie is missing.
|
|
|
|
|
|
|
|
This function will crash if the cookie is missing and no
|
|
|
|
default value is provided. This function will also crash
|
|
|
|
if a constraint fails.
|
|
|
|
|
|
|
|
The name of the cookie must be provided as an atom. The
|
|
|
|
key of the returned map will be that atom. The value may
|
|
|
|
be converted through the use of constraints, making this
|
|
|
|
function able to extract, validate and convert values all
|
|
|
|
in one step.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== match_qs(Fields, Req) -> Map
|
2014-09-23 16:43:29 +03:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Fields = cowboy:fields():: Query string fields match rules.
|
|
|
|
Map = map():: Query string fields matched.
|
2014-09-23 16:43:29 +03:00
|
|
|
|
|
|
|
Match the query string against the given fields.
|
|
|
|
|
|
|
|
Cowboy will only return the query string values specified
|
|
|
|
in the fields list, and ignore all others. Fields can be
|
|
|
|
either the key requested; the key along with a list of
|
|
|
|
constraints; or the key, a list of constraints and a
|
|
|
|
default value in case the key is missing.
|
|
|
|
|
|
|
|
This function will crash if the key is missing and no
|
|
|
|
default value is provided. This function will also crash
|
|
|
|
if a constraint fails.
|
|
|
|
|
|
|
|
The key must be provided as an atom. The key of the
|
|
|
|
returned map will be that atom. The value may be converted
|
|
|
|
through the use of constraints, making this function able
|
|
|
|
to extract, validate and convert values all in one step.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== meta(Name, Req) -> meta(Name, Req, undefined)
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Alias for `cowboy_req:meta/3`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== meta(Name, Req, Default) -> Value
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = atom():: Metadata name.
|
|
|
|
Default = any():: Default value.
|
|
|
|
Value = any():: Metadata value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Return metadata about the request.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== method(Req) -> Method
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Method = binary():: Request method.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the method.
|
|
|
|
|
|
|
|
Methods are case sensitive. Standard methods are always uppercase.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== parse_cookies(Req) -> [{Name, Value}]
|
2014-09-23 16:43:29 +03:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = binary():: Cookie name.
|
|
|
|
Value = binary():: Cookie value.
|
2014-09-23 16:43:29 +03:00
|
|
|
|
|
|
|
Parse and return all cookies.
|
|
|
|
|
|
|
|
Cookie names are case sensitive.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== parse_header(Name, Req) -> see below
|
|
|
|
|
|
|
|
Alias of `cowboy_req:parse_header/3`.
|
|
|
|
|
|
|
|
The `parse_header/2` function will call `parser_header/3` with a
|
|
|
|
different default value depending on the header being parsed. The
|
|
|
|
following table summarizes the default values used.
|
|
|
|
|
|
|
|
[cols="<,^",options="header"]
|
|
|
|
|===
|
|
|
|
| Header name | Header value
|
|
|
|
| content-length | `0`
|
|
|
|
| cookie | `[]`
|
|
|
|
| transfer-encoding | `[<<"identity">>]`
|
|
|
|
| Any other header | `undefined`
|
|
|
|
|===
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== parse_header(Name, Req, Default) -> ParsedValue | Default
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = binary():: Request header name.
|
|
|
|
Default = any():: Default value.
|
|
|
|
ParsedValue - see below:: Parsed request header value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Parse the given header.
|
|
|
|
|
|
|
|
While header names are case insensitive, this function expects
|
|
|
|
the name to be a lowercase binary.
|
|
|
|
|
|
|
|
The parsed value differs depending on the header being parsed. The
|
|
|
|
following table summarizes the different types returned.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
[cols="<,^",options="header"]
|
|
|
|
|===
|
|
|
|
| Header name | Type of parsed header value
|
|
|
|
| accept | `[{{Type, SubType, Params}, Quality, AcceptExt}]`
|
|
|
|
| accept-charset | `[{Charset, Quality}]`
|
|
|
|
| accept-encoding | `[{Encoding, Quality}]`
|
|
|
|
| accept-language | `[{LanguageTag, Quality}]`
|
|
|
|
| authorization | `{AuthType, Credentials}`
|
|
|
|
| content-length | `non_neg_integer()`
|
|
|
|
| content-type | `{Type, SubType, ContentTypeParams}`
|
|
|
|
| cookie | `[{binary(), binary()}]`
|
|
|
|
| expect | `[Expect \| {Expect, ExpectValue, Params}]`
|
|
|
|
| if-match | `'*' \| [{weak \| strong, OpaqueTag}]`
|
|
|
|
| if-modified-since | `calendar:datetime()`
|
|
|
|
| if-none-match | `'*' \| [{weak \| strong, OpaqueTag}]`
|
|
|
|
| if-unmodified-since | `calendar:datetime()`
|
|
|
|
| range | `{Unit, [Range]}`
|
|
|
|
| sec-websocket-protocol | `[binary()]`
|
|
|
|
| transfer-encoding | `[binary()]`
|
|
|
|
| upgrade | `[binary()]`
|
|
|
|
| x-forwarded-for | `[binary()]`
|
|
|
|
|===
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Types for the above table:
|
|
|
|
|
|
|
|
* Type = SubType = Charset = Encoding = LanguageTag = binary()
|
|
|
|
* AuthType = Expect = OpaqueTag = Unit = binary()
|
|
|
|
* Params = ContentTypeParams = [{binary(), binary()}]
|
|
|
|
* Quality = 0..1000
|
|
|
|
* AcceptExt = [{binary(), binary()} | binary()]
|
|
|
|
* Credentials - see below
|
|
|
|
* Range = {non_neg_integer(), non_neg_integer() | infinity} | neg_integer()
|
|
|
|
|
|
|
|
The cookie names and values, the values of the sec-websocket-protocol
|
|
|
|
and x-forwarded-for headers, the values in `AcceptExt` and `Params`,
|
|
|
|
the authorization `Credentials`, the `ExpectValue` and `OpaqueTag`
|
|
|
|
are case sensitive. All values in `ContentTypeParams` are case sensitive
|
|
|
|
except the value of the charset parameter, which is case insensitive.
|
|
|
|
All other values are case insensitive and will be returned as lowercase.
|
|
|
|
|
|
|
|
The headers accept, accept-encoding and cookie headers can return
|
2014-09-23 16:43:29 +03:00
|
|
|
an empty list. Some other headers are expected to have a value if provided
|
|
|
|
and may crash if the value is missing.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
The authorization header parsing code currently only supports basic
|
|
|
|
HTTP authentication. The `Credentials` type is thus `{Username, Password}`
|
|
|
|
with `Username` and `Password` being `binary()`.
|
|
|
|
|
|
|
|
The range header value `Range` can take three forms:
|
|
|
|
|
|
|
|
* `{From, To}`: from `From` to `To` units
|
|
|
|
* `{From, infinity}`: everything after `From` units
|
|
|
|
* `-Final`: the final `Final` units
|
|
|
|
|
|
|
|
An `undefined` tuple will be returned if Cowboy doesn't know how
|
|
|
|
to parse the requested header.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== parse_qs(Req) -> [{Name, Value}]
|
2014-09-23 16:43:29 +03:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = binary():: Query string field name.
|
|
|
|
Value = binary() | true:: Query string field value.
|
2014-09-23 16:43:29 +03:00
|
|
|
|
|
|
|
Return the request's query string as a list of tuples.
|
|
|
|
|
|
|
|
The atom `true` is returned for keys which have no value.
|
|
|
|
Keys with no value are different from keys with an empty
|
|
|
|
value in that they do not have a `=` indicating the presence
|
|
|
|
of a value.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== path(Req) -> Path
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Path = binary():: Requested path.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the requested path.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== path_info(Req) -> PathInfo
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
PathInfo = cowboy_router:tokens() | undefined:: Extra tokens for the path.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the extra tokens from matching against `...` during routing.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== peer(Req) -> Peer
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Peer = {inet:ip_address(), inet:port_number()}:: Peer IP address and port number.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the client's IP address and port number.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== port(Req) -> Port
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Port = inet:port_number():: Requested port number.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the request's port.
|
|
|
|
|
|
|
|
The port returned by this function is obtained by parsing
|
|
|
|
the host header. It may be different than the actual port
|
|
|
|
the client used to connect to the Cowboy server.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== qs(Req) -> QueryString
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
QueryString = binary():: Unprocessed query string.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the request's query string.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== set_meta(Name, Value, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = atom():: Metadata name.
|
|
|
|
Value = any():: Metadata value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Set metadata about the request.
|
|
|
|
|
|
|
|
An existing value will be overwritten.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== url(Req) -> URL
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
URL = binary() | undefined:: Requested URL.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the requested URL.
|
|
|
|
|
|
|
|
This function will always return `undefined` until the
|
2014-09-24 14:39:17 +03:00
|
|
|
`cowboy_router` middleware has been executed.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== version(Req) -> Version
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Version = cowboy:http_version():: Client's advertised HTTP version.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the HTTP version used for this request.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
== Request body related exports
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== body(Req) -> body(Req, [])
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Alias of `cowboy_req:body/2`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== body(Req, Opts) -> {ok, Data, Req2} | {more, Data, Req2}
|
|
|
|
|
|
|
|
Opts = [body_opt()]:: Request body reading options.
|
|
|
|
Data = binary():: Data read from the body.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Read the request body.
|
|
|
|
|
|
|
|
This function will read a chunk of the request body. If there is
|
|
|
|
more data to be read after this function call, then a `more` tuple
|
|
|
|
is returned. Otherwise an `ok` tuple is returned.
|
|
|
|
|
|
|
|
Cowboy will automatically send a `100 Continue` reply if
|
|
|
|
required. If this behavior is not desirable, it can be disabled
|
|
|
|
by setting the `continue` option to `false`.
|
|
|
|
|
|
|
|
Cowboy will by default attempt to read up to 8MB of the body,
|
|
|
|
but in chunks of 1MB. It will use a timeout of 15s per chunk.
|
|
|
|
All these values can be changed using the `length`, `read_length`
|
|
|
|
and `read_timeout` options respectively. Note that the size
|
|
|
|
of the data may not be the same as requested as the decoding
|
|
|
|
functions may grow or shrink it, and Cowboy makes not attempt
|
|
|
|
at returning an exact amount.
|
|
|
|
|
|
|
|
Cowboy will properly handle chunked transfer-encoding by
|
|
|
|
default. If any other transfer-encoding or content-encoding
|
|
|
|
has been used for the request, custom decoding functions
|
|
|
|
can be used. The `content_decode` and `transfer_decode`
|
|
|
|
options allow setting the decode functions manually.
|
|
|
|
|
|
|
|
After the body has been streamed fully, Cowboy will remove
|
|
|
|
the transfer-encoding header from the Req object, and add
|
|
|
|
the content-length header if it wasn't already there.
|
|
|
|
|
|
|
|
This function can only be called once. Cowboy will not cache
|
|
|
|
the result of this call.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== body_length(Req) -> Length
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Length = non_neg_integer() | undefined:: Length of the request body.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the length of the request body.
|
|
|
|
|
|
|
|
The length will only be returned if the request does not
|
|
|
|
use any transfer-encoding and if the content-length header
|
|
|
|
is present.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== body_qs(Req) -> body_qs(Req, [{length, 64000}, {read_length, 64000}, {read_timeout, 5000}])
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Alias of `cowboy_req:body_qs/2`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== body_qs(Req, Opts) -> {ok, [{Name, Value}], Req2} | {badlength, Req2}
|
|
|
|
|
|
|
|
Opts = [body_opt()]:: Request body reading options.
|
|
|
|
Name = binary():: Field name.
|
|
|
|
Value = binary() | true:: Field value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return the request body as a list of tuples.
|
|
|
|
|
|
|
|
This function will parse the body assuming the content-type
|
|
|
|
application/x-www-form-urlencoded, commonly used for the
|
|
|
|
query string.
|
|
|
|
|
|
|
|
This function calls `body/2` for reading the body, with the
|
|
|
|
same options it received. By default it will attempt to read
|
|
|
|
a body of 64KB in one chunk, with a timeout of 5s. If the
|
|
|
|
body is larger then a `badlength` tuple is returned.
|
|
|
|
|
|
|
|
This function can only be called once. Cowboy will not cache
|
|
|
|
the result of this call.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== has_body(Req) -> boolean()
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return whether the request has a body.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== part(Req) -> part(Req, [{length, 64000}, {read_length, 64000}, {read_timeout, 5000}])
|
|
|
|
|
|
|
|
Alias of `cowboy_req:part/2`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== part(Req, Opts) -> {ok, Headers, Req2} | {done, Req2}
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Opts = [body_opt()]:: Request body reading options.
|
|
|
|
Headers = cow_multipart:headers():: Part's headers.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Read the headers for the next part of the multipart message.
|
|
|
|
|
|
|
|
Cowboy will skip any data remaining until the beginning of
|
|
|
|
the next part. This includes the preamble to the multipart
|
|
|
|
message but also the body of a previous part if it hasn't
|
|
|
|
been read. Both are skipped automatically when calling this
|
|
|
|
function.
|
|
|
|
|
|
|
|
The headers returned are MIME headers, NOT HTTP headers.
|
|
|
|
They can be parsed using the functions from the `cow_multipart`
|
|
|
|
module. In addition, the `cow_multipart:form_data/1` function
|
|
|
|
can be used to quickly figure out `multipart/form-data` messages.
|
|
|
|
It takes the list of headers and returns whether this part is
|
|
|
|
a simple form field or a file being uploaded.
|
|
|
|
|
|
|
|
Note that once a part has been read, or skipped, it cannot
|
|
|
|
be read again.
|
|
|
|
|
|
|
|
This function calls `body/2` for reading the body, with the
|
|
|
|
same options it received. By default it will only read chunks
|
|
|
|
of 64KB with a timeout of 5s. This is tailored for reading
|
|
|
|
part headers, not for skipping the previous part's body.
|
|
|
|
You might want to consider skipping large parts manually.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== part_body(Req) -> part_body(Req, [])
|
|
|
|
|
|
|
|
Alias of `cowboy_req:part_body/2`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== part_body(Req, Opts) -> {ok, Data, Req2} | {more, Data, Req2}
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Opts = [body_opt()]:: Request body reading options.
|
|
|
|
Data = binary():: Part's body.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Read the body of the current part of the multipart message.
|
|
|
|
|
|
|
|
This function calls `body/2` for reading the body, with the
|
|
|
|
same options it received. It uses the same defaults.
|
|
|
|
|
|
|
|
If there are more data to be read from the socket for this
|
|
|
|
part, the function will return what it could read inside a
|
|
|
|
`more` tuple. Otherwise, it will return an `ok` tuple.
|
|
|
|
|
|
|
|
Calling this function again after receiving a `more` tuple
|
|
|
|
will return another chunk of body. The last chunk will be
|
|
|
|
returned inside an `ok` tuple.
|
|
|
|
|
|
|
|
Note that once the body has been read, fully or partially,
|
|
|
|
it cannot be read again.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
== Response related exports
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== chunk(Data, Req) -> ok
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Data = iodata():: Chunk data to be sent.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Send a chunk of data.
|
|
|
|
|
|
|
|
This function should be called as many times as needed
|
|
|
|
to send data chunks after calling `chunked_reply/{2,3}`.
|
|
|
|
|
|
|
|
When the method is HEAD, no data will actually be sent.
|
|
|
|
|
|
|
|
If the request uses HTTP/1.0, the data is sent directly
|
|
|
|
without wrapping it in an HTTP/1.1 chunk, providing
|
|
|
|
compatibility with older clients.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== chunked_reply(StatusCode, Req) -> chunked_reply(StatusCode, [], Req)
|
|
|
|
|
|
|
|
Alias of `cowboy_req:chunked_reply/3`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== chunked_reply(StatusCode, Headers, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
StatusCode = cowboy:http_status():: Response status code.
|
|
|
|
Headers = cowboy:http_headers():: Response headers.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Send a response using chunked transfer-encoding.
|
|
|
|
|
|
|
|
This function effectively sends the response status line
|
|
|
|
and headers to the client.
|
|
|
|
|
|
|
|
This function will not send any body set previously. After
|
|
|
|
this call the handler must use the `chunk/2` function
|
|
|
|
repeatedly to send the body in as many chunks as needed.
|
|
|
|
|
|
|
|
If the request uses HTTP/1.0, the data is sent directly
|
|
|
|
without wrapping it in an HTTP/1.1 chunk, providing
|
|
|
|
compatibility with older clients.
|
|
|
|
|
|
|
|
This function can only be called once, with the exception
|
|
|
|
of overriding the response in the `onresponse` hook.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== continue(Req) -> ok
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Send a 100 Continue intermediate reply.
|
|
|
|
|
|
|
|
This reply is required before the client starts sending the
|
|
|
|
body when the request contains the `expect` header with the
|
|
|
|
`100-continue` value.
|
|
|
|
|
|
|
|
Cowboy will send this automatically when required. However
|
|
|
|
you may want to do it manually by disabling this behavior
|
|
|
|
with the `continue` body option and then calling this
|
|
|
|
function.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== delete_resp_header(Name, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = binary():: Response header name.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Delete the given response header.
|
|
|
|
|
|
|
|
While header names are case insensitive, this function expects
|
|
|
|
the name to be a lowercase binary.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== has_resp_body(Req) -> boolean()
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return whether a response body has been set.
|
|
|
|
|
|
|
|
This function will return false if a response body has
|
|
|
|
been set with a length of 0.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== has_resp_header(Name, Req) -> boolean()
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = binary():: Response header name.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Return whether the given response header has been set.
|
|
|
|
|
|
|
|
While header names are case insensitive, this function expects
|
|
|
|
the name to be a lowercase binary.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== reply(StatusCode, Req) -> reply(StatusCode, [], Req)
|
|
|
|
|
|
|
|
Alias of `cowboy_req:reply/3`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== reply(StatusCode, Headers, Req) - see below
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Alias of `cowboy_req:reply/4`, with caveats.
|
|
|
|
|
|
|
|
=== reply(StatusCode, Headers, Body, Req) -> Req2
|
|
|
|
|
|
|
|
StatusCode = cowboy:http_status():: Response status code.
|
|
|
|
Headers = cowboy:http_headers():: Response headers.
|
|
|
|
Body = iodata():: Response body.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Send a response.
|
|
|
|
|
|
|
|
This function effectively sends the response status line,
|
|
|
|
headers and body to the client, in a single send function
|
|
|
|
call.
|
|
|
|
|
|
|
|
The `reply/2` and `reply/3` functions will send the body
|
|
|
|
set previously, if any. The `reply/4` function overrides
|
|
|
|
any body set previously and sends `Body` instead.
|
|
|
|
|
|
|
|
If a body function was set, and `reply/2` or `reply/3` was
|
|
|
|
used, it will be called before returning.
|
|
|
|
|
|
|
|
No more data can be sent to the client after this function
|
|
|
|
returns.
|
|
|
|
|
|
|
|
This function can only be called once, with the exception
|
|
|
|
of overriding the response in the `onresponse` hook.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== set_resp_body(Body, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Body = iodata():: Response body.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Set a response body.
|
|
|
|
|
|
|
|
This body will not be sent if `chunked_reply/{2,3}` or
|
|
|
|
`reply/4` is used, as they override it.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== set_resp_body_fun(Fun, Req) -> Req2
|
|
|
|
|
|
|
|
Alias of `cowboy_req:set_resp_body_fun/3`.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== set_resp_body_fun(Length, Fun, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Fun = fun((Socket, Transport) -> ok):: Fun that will send the response body.
|
|
|
|
Socket = inet:socket():: Socket for this connection.
|
|
|
|
Transport = module():: Transport module for this socket.
|
|
|
|
Length = non_neg_integer():: Length of the response body.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Set a fun for sending the response body.
|
|
|
|
|
|
|
|
If a `Length` is provided, it will be sent in the
|
|
|
|
content-length header in the response. It is recommended
|
|
|
|
to set the length if it can be known in advance. Otherwise,
|
|
|
|
the transfer-encoding header will be set to identity.
|
|
|
|
|
|
|
|
This function will only be called if the response is sent
|
|
|
|
using the `reply/2` or `reply/3` function.
|
|
|
|
|
|
|
|
The fun will receive the Ranch `Socket` and `Transport` as
|
|
|
|
arguments. Only send and sendfile operations are supported.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== set_resp_body_fun(chunked, Fun, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Fun = fun((ChunkFun) -> ok):: Fun that will send the response body.
|
|
|
|
ChunkFun = fun((iodata()) -> ok):: Fun to call for every chunk to be sent.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Set a fun for sending the response body using chunked transfer-encoding.
|
|
|
|
|
|
|
|
This function will only be called if the response is sent
|
|
|
|
using the `reply/2` or `reply/3` function.
|
|
|
|
|
|
|
|
The fun will receive another fun as argument. This fun is to
|
|
|
|
be used to send chunks in a similar way to the `chunk/2` function,
|
|
|
|
except the fun only takes one argument, the data to be sent in
|
|
|
|
the chunk.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== set_resp_cookie(Name, Value, Opts, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = iodata():: Cookie name.
|
|
|
|
Value = iodata():: Cookie value.
|
|
|
|
Opts = cookie_opts():: Cookie options.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Set a cookie in the response.
|
|
|
|
|
|
|
|
Cookie names are case sensitive.
|
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
=== set_resp_header(Name, Value, Req) -> Req2
|
2014-07-06 13:10:35 +02:00
|
|
|
|
2016-01-14 13:35:25 +01:00
|
|
|
Name = binary():: Response header name.
|
|
|
|
Value = iodata():: Response header value.
|
2014-07-06 13:10:35 +02:00
|
|
|
|
|
|
|
Set a response header.
|
|
|
|
|
|
|
|
You should use `set_resp_cookie/4` instead of this function
|
|
|
|
to set cookies.
|