aboutsummaryrefslogtreecommitdiffstats
path: root/manual/cowboy_rest.md
diff options
context:
space:
mode:
Diffstat (limited to 'manual/cowboy_rest.md')
-rw-r--r--manual/cowboy_rest.md552
1 files changed, 552 insertions, 0 deletions
diff --git a/manual/cowboy_rest.md b/manual/cowboy_rest.md
new file mode 100644
index 0000000..4d5862a
--- /dev/null
+++ b/manual/cowboy_rest.md
@@ -0,0 +1,552 @@
+cowboy_rest
+===========
+
+The `cowboy_rest` module implements REST semantics on top of
+the HTTP protocol.
+
+This module cannot be described as a behaviour due to most of
+the callbacks it defines being optional. It has the same
+semantics as a behaviour otherwise.
+
+The only mandatory callback is `init/3`, needed to perform
+the protocol upgrade.
+
+Types
+-----
+
+None.
+
+Meta values
+-----------
+
+### charset
+
+> Type: binary()
+>
+> Negotiated charset.
+>
+> This value may not be defined if no charset was negotiated.
+
+### language
+
+> Type: binary()
+>
+> Negotiated language.
+>
+> This value may not be defined if no language was negotiated.
+
+### media_type
+
+> Type: {binary(), binary(), '*' | [{binary(), binary()}]}
+>
+> Negotiated media-type.
+>
+> The media-type is the content-type, excluding the charset.
+>
+> This value is always defined after the call to
+> `content_types_provided/2`.
+
+Callbacks
+---------
+
+### init({TransportName, ProtocolName}, Req, Opts)
+ -> {upgrade, protocol, cowboy_rest}
+ | {upgrade, protocol, cowboy_rest, Req, Opts}
+
+> Types:
+> * TransportName = tcp | ssl | atom()
+> * ProtocolName = http | atom()
+> * Req = cowboy_req:req()
+> * Opts = any()
+>
+> Upgrade the protocol to `cowboy_rest`.
+>
+> This is the only mandatory callback.
+
+### rest_init(Req, Opts) -> {ok, Req, State}
+
+> Types:
+> * Req = cowboy_req:req()
+> * Opts = any()
+> * State = any()
+>
+> Initialize the state for this request.
+
+### rest_terminate(Req, State) -> ok
+
+> Types:
+> * Req = cowboy_req:req()
+> * State = any()
+>
+> Perform any necessary cleanup of the state.
+>
+> This callback should release any resource currently in use,
+> clear any active timer and reset the process to its original
+> state, as it might be reused for future requests sent on the
+> same connection.
+
+### Callback(Req, State) -> {Value, Req, State} | {halt, Req, State}
+
+> Types:
+> * Callback - one of the REST callbacks described below
+> * Req = cowboy_req:req()
+> * State = any()
+> * Value - see the REST callbacks description below
+>
+> Please see the REST callbacks description below for details
+> on the `Value` type, the default value if the callback is
+> not defined, and more general information on when the
+> callback is called and what its intended use is.
+>
+> The `halt` tuple can be returned to stop REST processing.
+> It is up to the resource code to send a reply before that,
+> otherwise a `204 No Content` will be sent.
+
+REST callbacks description
+--------------------------
+
+### allowed_methods
+
+> * Methods: all
+> * Value type: [binary()]
+> * Default value: [<<"GET">>, <<"HEAD">>, <<"OPTIONS">>]
+>
+> Return the list of allowed methods.
+>
+> Methods are case sensitive. Standard methods are always uppercase.
+
+### allow_missing_post
+
+> * Methods: POST
+> * Value type: boolean()
+> * Default value: true
+>
+> Return whether POST is allowed when the resource doesn't exist.
+>
+> Returning `true` here means that a new resource will be
+> created. The URL to the created resource should also be
+> returned from the `AcceptResource` callback.
+
+### charsets_provided
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: [binary()]
+> * Skip to the next step if undefined
+>
+> Return the list of charsets the resource provides.
+>
+> The list must be ordered in order of preference.
+>
+> If the accept-charset header was not sent, the first charset
+> in the list will be selected. Otherwise Cowboy will select
+> the most appropriate charset from the list.
+>
+> The chosen charset will be set in the `Req` object as the meta
+> value `charset`.
+>
+> While charsets are case insensitive, this callback is expected
+> to return them as lowercase binary.
+
+### content_types_accepted
+
+> * Methods: POST, PUT, PATCH
+> * No default
+>
+> Types:
+> * Value = [{binary() | {Type, SubType, Params}, AcceptResource}]
+> * Type = SubType = binary()
+> * Params = '*' | [{binary(), binary()}]
+> * AcceptResource = atom()
+>
+> Return the list of content-types the resource accepts.
+>
+> The list must be ordered in order of preference.
+>
+> Each content-type can be given either as a binary string or as
+> a tuple containing the type, subtype and parameters.
+>
+> Cowboy will select the most appropriate content-type from the list.
+> If any parameter is acceptable, then the tuple form should be used
+> with parameters set to `'*'`. If the parameters value is set to `[]`
+> only content-type values with no parameters will be accepted.
+>
+> This function will be called for POST, PUT and PATCH requests.
+> It is entirely possible to define different callbacks for different
+> methods if the handling of the request differs. Simply verify
+> what the method is with `cowboy_req:method/1` and return a
+> different list for each methods.
+>
+> The `AcceptResource` value is the name of the callback that will
+> be called if the content-type matches. It is defined as follow.
+>
+> * Value type: true | {true, URL} | false
+> * No default
+>
+> Process the request body.
+>
+> This function should create or update the resource with the
+> information contained in the request body. This information
+> may be full or partial depending on the request method.
+>
+> If the request body was processed successfully, `true` or
+> `{true, URL}` may be returned. If an URL is provided, the
+> response will redirect the client to the location of the
+> resource.
+>
+> If a response body must be sent, the appropriate media-type, charset
+> and language can be retrieved using the `cowboy_req:meta/{2,3}`
+> functions. The respective keys are `media_type`, `charset`
+> and `language`. The body can be set using `cowboy_req:set_resp_body/2`.
+
+### content_types_provided
+
+> * Methods: GET, HEAD
+> * Default value: [{{<<"text">>, <<"html">>, '*'}, to_html}]
+>
+> Types:
+> * Value = [{binary() | {Type, SubType, Params}, ProvideResource}]
+> * Type = SubType = binary()
+> * Params = '*' | [{binary(), binary()}]
+> * ProvideResource = atom()
+>
+> Return the list of content-types the resource provides.
+>
+> The list must be ordered in order of preference.
+>
+> Each content-type can be given either as a binary string or as
+> a tuple containing the type, subtype and parameters.
+>
+> Cowboy will select the most appropriate content-type from the list.
+> If any parameter is acceptable, then the tuple form should be used
+> with parameters set to `'*'`. If the parameters value is set to `[]`
+> only content-type values with no parameters will be accepted.
+>
+> The `ProvideResource` value is the name of the callback that will
+> be called if the content-type matches. It is defined as follow.
+>
+> * Value type: iodata() | {stream, Fun} | {stream, Len, Fun} | {chunked, ChunkedFun}
+> * No default
+>
+> Return the response body.
+>
+> The response body may be provided directly or through a fun.
+> If a fun tuple is returned, the appropriate `set_resp_body_fun`
+> function will be called. Please refer to the documentation for
+> these functions for more information about the types.
+>
+> The call to this callback happens a good time after the call to
+> `content_types_provided/2`, when it is time to start rendering
+> the response body.
+
+### delete_completed
+
+> * Methods: DELETE
+> * Value type: boolean()
+> * Default value: true
+>
+> Return whether the delete action has been completed.
+>
+> This function should return `false` if there is no guarantee
+> that the resource gets deleted immediately from the system,
+> including from any internal cache.
+>
+> When this function returns `false`, a `202 Accepted`
+> response will be sent instead of a `200 OK` or `204 No Content`.
+
+### delete_resource
+
+> * Methods: DELETE
+> * Value type: boolean()
+> * Default value: false
+>
+> Delete the resource.
+>
+> The value returned indicates if the action was successful,
+> regardless of whether the resource is immediately deleted
+> from the system.
+
+### expires
+
+> * Methods: GET, HEAD
+> * Value type: calendar:datetime() | undefined
+> * Default value: undefined
+>
+> Return the date of expiration of the resource.
+>
+> This date will be sent as the value of the expires header.
+
+### forbidden
+
+> * Methods: all
+> * Value type: boolean()
+> * Default value: false
+>
+> Return whether access to the resource is forbidden.
+>
+> A `403 Forbidden` response will be sent if this
+> function returns `true`. This status code means that
+> access is forbidden regardless of authentication,
+> and that the request shouldn't be repeated.
+
+### generate_etag
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: binary() | {weak | strong, binary()}
+> * Default value: undefined
+>
+> Return the entity tag of the resource.
+>
+> This value will be sent as the value of the etag header.
+>
+> If a binary is returned, then the value will be parsed
+> to the tuple form automatically.
+
+### is_authorized
+
+> * Methods: all
+> * Value type: true | {false, AuthHeader}
+> * Default value: true
+>
+> Return whether the user is authorized to perform the action.
+>
+> This function should be used to perform any necessary
+> authentication of the user before attempting to perform
+> any action on the resource.
+>
+> If the authentication fails, the value returned will be sent
+> as the value for the www-authenticate header in the
+> `401 Unauthorized` response.
+
+### is_conflict
+
+> * Methods: PUT
+> * Value type: boolean()
+> * Default value: false
+>
+> Return whether the put action results in a conflict.
+>
+> A `409 Conflict` response will be sent if this function
+> returns `true`.
+
+### known_content_type
+
+> * Methods: all
+> * Value type: boolean()
+> * Default value: true
+>
+> Return whether the content-type is known.
+>
+> This function determines if the server understands the
+> content-type, regardless of its use by the resource.
+
+### known_methods
+
+> * Methods: all
+> * Value type: [binary()]
+> * Default value: [<<"GET">>, <<"HEAD">>, <<"POST">>, <<"PUT">>, <<"PATCH">>, <<"DELETE">>, <<"OPTIONS">>]
+>
+> Return the list of known methods.
+>
+> The full list of methods known by the server should be
+> returned, regardless of their use in the resource.
+>
+> The default value lists the methods Cowboy knows and
+> implement in `cowboy_rest`.
+>
+> Methods are case sensitive. Standard methods are always uppercase.
+
+### languages_provided
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: [binary()]
+> * Skip to the next step if undefined
+>
+> Return the list of languages the resource provides.
+>
+> The list must be ordered in order of preference.
+>
+> If the accept-language header was not sent, the first language
+> in the list will be selected. Otherwise Cowboy will select
+> the most appropriate language from the list.
+>
+> The chosen language will be set in the `Req` object as the meta
+> value `language`.
+>
+> While languages are case insensitive, this callback is expected
+> to return them as lowercase binary.
+
+### last_modified
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: calendar:datetime()
+> * Default value: undefined
+>
+> Return the date of last modification of the resource.
+>
+> This date will be used to test against the if-modified-since
+> and if-unmodified-since headers, and sent as the last-modified
+> header in the response of GET and HEAD requests.
+
+### malformed_request
+
+> * Methods: all
+> * Value type: boolean()
+> * Default value: false
+>
+> Return whether the request is malformed.
+>
+> Cowboy has already performed all the necessary checks
+> by the time this function is called, so few resources
+> are expected to implement it.
+>
+> The check is to be done on the request itself, not on
+> the request body, which is processed later.
+
+### moved_permanently
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: {true, URL} | false
+> * Default value: false
+>
+> Return whether the resource was permanently moved.
+>
+> If it was, its new URL is also returned and sent in the
+> location header in the response.
+
+### moved_temporarily
+
+> * Methods: GET, HEAD, POST, PATCH, DELETE
+> * Value type: {true, URL} | false
+> * Default value: false
+>
+> Return whether the resource was temporarily moved.
+>
+> If it was, its new URL is also returned and sent in the
+> location header in the response.
+
+### multiple_choices
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: boolean()
+> * Default value: false
+>
+> Return whether there are multiple representations of the resource.
+>
+> This function should be used to inform the client if there
+> are different representations of the resource, for example
+> different content-type. If this function returns `true`,
+> the response body should include information about these
+> different representations using `cowboy_req:set_resp_body/2`.
+> The content-type of the response should be the one previously
+> negociated and that can be obtained by calling
+> `cowboy_req:meta(media_type, Req)`.
+
+### options
+
+> * Methods: OPTIONS
+> * Value type: ok
+> * Default value: ok
+>
+> Handle a request for information.
+>
+> The response should inform the client the communication
+> options available for this resource.
+>
+> By default, Cowboy will send a `200 OK` response with the
+> allow header set.
+
+### previously_existed
+
+> * Methods: GET, HEAD, POST, PATCH, DELETE
+> * Value type: boolean()
+> * Default value: false
+>
+> Return whether the resource existed previously.
+
+### resource_exists
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: boolean()
+> * Default value: true
+>
+> Return whether the resource exists.
+>
+> If it exists, conditional headers will be tested before
+> attempting to perform the action. Otherwise, Cowboy will
+> check if the resource previously existed first.
+
+### service_available
+
+> * Methods: all
+> * Value type: boolean()
+> * Default value: true
+>
+> Return whether the service is available.
+>
+> This function can be used to test that all relevant backend
+> systems are up and able to handle requests.
+>
+> A `503 Service Unavailable` response will be sent if this
+> function returns `false`.
+
+### uri_too_long
+
+> * Methods: all
+> * Value type: boolean()
+> * Default value: false
+>
+> Return whether the requested URI is too long.
+>
+> Cowboy has already performed all the necessary checks
+> by the time this function is called, so few resources
+> are expected to implement it.
+>
+> A `414 Request-URI Too Long` response will be sent if this
+> function returns `true`.
+
+### valid_content_headers
+
+> * Methods: all
+> * Value type: boolean()
+> * Default value: true
+>
+> Return whether the content-* headers are valid.
+>
+> This also applies to the transfer-encoding header. This
+> function must return `false` for any unknown content-*
+> headers, or if the headers can't be understood. The
+> function `cowboy_req:parse_header/2` can be used to
+> quickly check the headers can be parsed.
+>
+> A `501 Not Implemented` response will be sent if this
+> function returns `false`.
+
+### valid_entity_length
+
+> * Methods: all
+> * Value type: boolean()
+> * Default value: true
+>
+> Return whether the request body length is within acceptable boundaries.
+>
+> A `413 Request Entity Too Large` response will be sent if this
+> function returns `false`.
+
+### variances
+
+> * Methods: GET, HEAD, POST, PUT, PATCH, DELETE
+> * Value type: [binary()]
+> * Default value: []
+>
+> Return the list of headers that affect the representation of the resource.
+>
+> These request headers return the same resource but with different
+> parameters, like another language or a different content-type.
+>
+> Cowboy will automatically add the accept, accept-language and
+> accept-charset headers to the list if the respective functions
+> were defined in the resource.
+>
+> This operation is performed right before the `resource_exists/2`
+> callback. All responses past that point will contain the vary
+> header which holds this list.