0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 12:40:25 +00:00

Add man pages for parse_qs, match_qs and parse_header

[ci skip]
This commit is contained in:
Loïc Hoguin 2016-11-07 01:11:56 +02:00
parent 0df88c0d0a
commit b2e981ca40
No known key found for this signature in database
GPG key ID: 71366FF21851DF03
4 changed files with 366 additions and 1 deletions

View file

@ -33,7 +33,7 @@ Note that this snippet will crash if the header is missing.
Name:: Name::
Desired HTTP header name as a binary string. Desired HTTP header name as a lowercase binary string.
Req:: Req::

View file

@ -0,0 +1,78 @@
= cowboy_req:match_qs(3)
== Name
cowboy_req:match_qs - Match the query string against constraints
== Description
[source,erlang]
----
match_qs(Fields :: cowboy:fields(), Req :: cowboy_req:req())
-> #{atom() => any()}
----
Parse the query string and match specific values against
constraints.
This function allows easily retrieving expected values
from the query string, validating and converting them
in one call. In addition, the keys are converted to
atoms, making manipulation that much simpler.
== Arguments
Fields::
Fields to retrieve from the query string.
+
See link:man:cowboy(3)[cowboy(3)] for a complete description.
Req::
The Req object.
== Return value
Desired values are returned as a map. The key is the atom
that was given in the list of fields, and the value is the
optionally converted value after applying constraints.
The map contains the same keys that were given in the fields.
An exception is triggered when the match fails.
== Changelog
* *2.0*: Function introduced.
== Examples
.Match fields
[source,erlang]
----
%% ID and Lang are binaries.
#{id := ID, lang := Lang}
= cowboy_req:match_qs([id, lang], Req).
----
.Match fields and apply constraints
[source,erlang]
----
%% ID is an integer and Lang a non-empty binary.
#{id := ID, lang := Lang}
= cowboy_req:match_qs([{id, int}, {lang, nonempty}], Req).
----
.Match fields with default values
[source,erlang]
----
#{lang := Lang}
= cowboy_req:match_qs([{lang, [], <<"en-US">>}], Req).
----
== See also
link:man:cowboy_req(3)[cowboy_req(3)],
link:man:cowboy_req:qs(3)[cowboy_req:qs(3)],
link:man:cowboy_req:parse_qs(3)[cowboy_req:parse_qs(3)]

View file

@ -0,0 +1,229 @@
= cowboy_req:parse_header(3)
== Name
cowboy_req:parse_header - Parse the given HTTP header
== Description
[source,erlang]
----
parse_header(Name, Req) -> ParsedValue | Default
parse_header(Name, Req, Default) -> ParsedValue | Default
Name :: binary()
Req :: cowboy_req:req()
ParsedValue :: any()
Default :: any()
----
Parse the given HTTP header.
The header name must be given as a lowercase binary string.
While header names are case insensitive, Cowboy requires them
to be given as lowercase to function properly.
The type of the parsed value varies depending on
the header. Similarly, the default value when calling
`cowboy_req:parse_header/2` differs depending on the
header.
== Arguments
Name::
Desired HTTP header name as a lowercase binary string.
Req::
The Req object.
Default::
Default value returned when the header is missing.
== Return value
The parsed header value varies depending on the header.
When the header is missing, the default argument is returned.
== Headers
The following snippets detail the types returned by the
different headers. Unless mentioned otherwise, the
default value when the header is missing will be `undefined`:
.accept
[source,erlang]
----
parse_header(<<"accept">>, Req)
-> [{{Type, SubType, Params}, Quality, AcceptExt}]
Type :: binary() %% case insensitive
SubType :: binary() %% case insensitive
Params :: [{Key, Value}]
Quality :: 0..1000
AcceptExt :: [Key | {Key, Value}]
Key :: binary() %% case insensitive
Value :: binary() %% case sensitive
----
.accept-charset, accept-encoding and accept-language
[source,erlang]
----
parse_header(Name, Req) -> [{Value, Quality}]
Name :: <<"accept-charset">>
| <<"accept-encoding">>
| <<"accept-language">>
Value :: binary() %% case insensitive
Quality :: 0..1000
----
.authorization
[source,erlang]
----
parse_header(<<"authorization">>, Req)
-> {basic, Username :: binary(), Password :: binary()}
| {bearer, Token :: binary()}
| {digest, [{Key :: binary(), Value :: binary()}]}
----
// @todo Currently also parses connection. Do we want this? Should it be documented? Use case?
.content-length
[source,erlang]
----
parse_header(<<"content-length">>, Req) -> non_neg_integer()
----
When the content-length header is missing, `0` is returned.
.content-type
[source,erlang]
----
parse_header(<<"content-type">>, Req)
-> {Type, SubType, Params}
Type :: binary() %% case insensitive
SubType :: binary() %% case insensitive
Params :: [{Key, Value}]
Key :: binary() %% case insensitive
Value :: binary() %% case sensitive;
----
Note that the value for the charset parameter is case insensitive
and returned as a lowercase binary string.
.cookie
[source,erlang]
----
parse_header(<<"cookie">>, Req) -> [{Name, Value}]
Name :: binary() %% case sensitive
Value :: binary() %% case sensitive
----
When the cookie header is missing, `[]` is returned.
While an empty cookie header is not valid, some clients do
send it. Cowboy will in this case also return `[]`.
.expect
[source,erlang]
----
parse_header(<<"expect">>, Req) -> continue
----
.if-match and if-none-match
[source,erlang]
----
parse_header(Name, Req)
-> '*' | [{weak | strong, OpaqueTag}]
Name :: <<"if-match">>
| <<"if-none-match">>
OpaqueTag :: binary() %% case sensitive
----
.if-modified-since and if-unmodified-since
[source,erlang]
----
parse_header(Name, Req) -> calendar:datetime()
----
.range
[source,erlang]
----
parse_header(<<"range">>, Req) -> {From, To} | Final
From :: non_neg_integer()
To :: non_neg_integer() | infinity
Final :: neg_integer()
----
// @todo Remove transfer-encoding from the headers parsed by this function.
.sec-websocket-extensions
[source,erlang]
----
parse_header(<<"sec-websocket-extensions">>, Req)
-> [{Extension, Params}]
Extension :: binary() %% case sensitive
Params :: [Key | {Key, Value}]
Key :: binary() %% case sensitive
Value :: binary() %% case sensitive
----
.sec-websocket-protocol and upgrade
[source,erlang]
----
parse_header(Name, Req) -> [Token]
Name :: <<"sec-websocket-protocol">>
| <<"upgrade">>
Token :: binary() %% case insensitive
----
.x-forwarded-for
[source,erlang]
----
parse_header(<<"x-forwarded-for">>, Req) -> [Token]
Token :: binary() %% case sensitive
----
.Unknown headers
[source,erlang]
----
parse_header(_, Req) -> {undefined, RawValue}
----
== Changelog
* *2.0*: Only the parsed header value is returned, it is no longer wrapped in a tuple.
* *1.0*: Function introduced.
== Examples
.Parse the accept header with a custom default value
[source,erlang]
----
%% Accept everything when header is missing.
Accept = cowboy_req:parse_header(<<"accept">>, Req,
[{{<<"*">>, <<"*">>, []}, 1000, []}]).
----
.Parse the content-length header
[source,erlang]
----
%% Default content-length is 0.
Length = cowboy_req:header(<<"content-length">>, Req).
----
== See also
link:man:cowboy_req(3)[cowboy_req(3)],
link:man:cowboy_req:header(3)[cowboy_req:header(3)],
link:man:cowboy_req:headers(3)[cowboy_req:headers(3)]

View file

@ -0,0 +1,58 @@
= cowboy_req:parse_qs(3)
== Name
cowboy_req:parse_qs - Parse the query string
== Description
[source,erlang]
----
parse_qs(Req :: cowboy_req:req())
-> [{Key :: binary(), Value :: binary() | true}]
----
Parse the query string as a list of key/value pairs.
== Arguments
Req::
The Req object.
== Return value
The parsed query string is returned as a list of key/value pairs.
The key is a binary string. The value is either a binary string,
or the atom `true`. Both key and value are case sensitive.
The atom `true` is returned when a key is present in the query
string without a value. For example, in the following URIs
the key `<<"edit">>` will always have the value `true`:
* `/posts/42?edit`
* `/posts/42?edit&exclusive=1`
* `/posts/42?exclusive=1&edit`
* `/posts/42?exclusive=1&edit&from=web`
== Changelog
* *2.0*: The parsed value is not longer cached in the Req object.
* *2.0*: Only the parsed query string is returned, it is no longer wrapped in a tuple.
* *2.0*: Function introduced. Replaces `qs_val/1` and `qs_vals/1`.
== Examples
.Parse the query string and convert the keys to atoms
[source,erlang]
----
ParsedQs = cowboy_req:parse_qs(Req),
AtomsQs = [{binary_to_existing_atom(K, latin1), V}
|| {K, V} <- ParsedQs].
----
== See also
link:man:cowboy_req(3)[cowboy_req(3)],
link:man:cowboy_req:qs(3)[cowboy_req:qs(3)],
link:man:cowboy_req:match_qs(3)[cowboy_req:match_qs(3)]