aboutsummaryrefslogtreecommitdiffstats
path: root/doc/src/manual/cowboy_rest.ezdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/manual/cowboy_rest.ezdoc')
-rw-r--r--doc/src/manual/cowboy_rest.ezdoc561
1 files changed, 561 insertions, 0 deletions
diff --git a/doc/src/manual/cowboy_rest.ezdoc b/doc/src/manual/cowboy_rest.ezdoc
new file mode 100644
index 0000000..4d13530
--- /dev/null
+++ b/doc/src/manual/cowboy_rest.ezdoc
@@ -0,0 +1,561 @@
+::: 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. All
+parameter values are treated in a case sensitive manner except the
+`charset` parameter, if present, which is case insensitive.
+
+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, POST, PUT, PATCH, DELETE
+* 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. All
+parameter values are treated in a case sensitive manner except the
+`charset` parameter, if present, which is case insensitive.
+
+The `ProvideResource` value is the name of the callback that will
+be called if the content-type matches. It will only be called when
+a representation of the resource needs to be returned. It is defined
+as follow.
+
+* Methods: GET, HEAD
+* 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() | binary() | 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. The value must be in
+the same format as the etag header, including quotes.
+
+: 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.