mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 20:30:23 +00:00
Add a guide appendix on migrating from Cowboy 1.0
This commit is contained in:
parent
7eb0072b06
commit
ac426c9ed0
3 changed files with 209 additions and 1 deletions
|
@ -78,7 +78,7 @@ include::sub_protocols.asciidoc[Sub protocols]
|
|||
|
||||
= Additional information
|
||||
|
||||
//include::migrating_from_1.0.asciidoc[Migrating from Cowboy 1.0 to 2.0]
|
||||
include::migrating_from_1.0.asciidoc[Migrating from Cowboy 1.0 to 2.0]
|
||||
|
||||
// @todo Maybe history? Could take info from architecture also.
|
||||
|
||||
|
|
207
doc/src/guide/migrating_from_1.0.asciidoc
Normal file
207
doc/src/guide/migrating_from_1.0.asciidoc
Normal file
|
@ -0,0 +1,207 @@
|
|||
[appendix]
|
||||
== Migrating from Cowboy 1.0 to 2.0
|
||||
|
||||
A lot has changed between Cowboy 1.0 and 2.0. The `cowboy_req`
|
||||
interface in particular has seen a massive revamp. Hooks are
|
||||
gone, their functionality can now be achieved via stream
|
||||
handlers.
|
||||
|
||||
The documentation has seen great work, in particular the
|
||||
manual. Each module and each function now has its own dedicated
|
||||
manual page with full details and examples.
|
||||
|
||||
=== Compatibility
|
||||
|
||||
Compatibility with Erlang/OTP R16, 17 and 18 has been dropped.
|
||||
Erlang/OTP 19.0 or above is required. It is non-trivial to
|
||||
make Cowboy 2.0 work with older Erlang/OTP versions.
|
||||
|
||||
Cowboy 2.0 is not compatible with Cowlib versions older than
|
||||
2.0. It should be compatible with Ranch 1.0 or above, however
|
||||
it has not been tested with Ranch versions older than 1.4.
|
||||
|
||||
Cowboy 2.0 is tested on Arch Linux, Ubuntu, FreeBSD, Windows
|
||||
and OSX. It is tested with every point release (latest patch
|
||||
release) and also with HiPE on the most recent release.
|
||||
|
||||
Cowboy 2.0 now comes with Erlang.mk templates.
|
||||
|
||||
=== Features added
|
||||
|
||||
* The HTTP/2 protocol is now supported.
|
||||
|
||||
* Cowboy no longer uses only one process per connection.
|
||||
It now uses one process per connection plus one process
|
||||
per request by default. This is necessary for HTTP/2.
|
||||
There might be a slight drop in performance for HTTP/1.1
|
||||
connections due to this change.
|
||||
|
||||
* Cowboy internals have largely been reworked in order to
|
||||
support HTTP/2. This opened the way to stream handlers,
|
||||
which are a chain of modules that are called whenever
|
||||
something happens relating to a request/response.
|
||||
|
||||
* The `cowboy_stream_h` stream handler has been added.
|
||||
It provides most of Cowboy's default behavior.
|
||||
|
||||
* The `cowboy_compress_h` stream handler has been added.
|
||||
It compresses responses when possible. It's worth noting
|
||||
that it compresses in more cases than Cowboy 1.0 ever did.
|
||||
|
||||
* Because of the many changes in the internals of Cowboy,
|
||||
many options have been added or modified. Of note is that
|
||||
the Websocket options are now given per handler rather
|
||||
than for the entire listener.
|
||||
|
||||
* Websocket permessage-deflate compression is now supported
|
||||
via the `websocket_compress` option.
|
||||
|
||||
* Static file handlers will now correctly find files found
|
||||
in '.ez' archives.
|
||||
|
||||
* Constraints have been generalized and are now used not only
|
||||
in the router but also in some `cowboy_req` functions. Their
|
||||
interface has also been modified to allow for reverse
|
||||
operations and formatting of errors.
|
||||
|
||||
=== Features removed
|
||||
|
||||
* SPDY support has been removed. Use HTTP/2 instead.
|
||||
|
||||
* Hooks have been removed. Use xref:streams[stream handlers] instead.
|
||||
|
||||
* The undocumented `waiting_stream` hack has been removed.
|
||||
It allowed disabling chunked transfer-encoding for HTTP/1.1.
|
||||
It has no equivalent in Cowboy 2.0. Open a ticket if necessary.
|
||||
|
||||
* Sub protocols still exist, but their interface has largely changed
|
||||
and they are no longer documented for the time being.
|
||||
|
||||
=== Changed behaviors
|
||||
|
||||
* The handler behaviors have been renamed and are now `cowboy_handler`,
|
||||
`cowboy_loop`, `cowboy_rest` and `cowboy_websocket`.
|
||||
|
||||
* Plain HTTP, loop, REST and Websocket handlers have had their
|
||||
init and terminate callbacks unified. They now all use the
|
||||
`init/2` and `terminate/3` callbacks. The latter is now optional.
|
||||
The terminate reason has now been documented for all handlers.
|
||||
|
||||
* The tuple returned to switch to a different handler type has
|
||||
changed. It now takes the form `{Module, Req, State}` or
|
||||
`{Module, Req, State, Opts}`, where `Opts` is a map of options
|
||||
to configure the handler. The timeout and hibernate options
|
||||
must now be specified using this map, where applicable.
|
||||
|
||||
* All behaviors that used to accept `halt` or `shutdown` tuples
|
||||
as a return value no longer do so. The return value is now
|
||||
a `stop` tuple, consistent across Cowboy.
|
||||
|
||||
* Middlewares can no longer return an `error` tuple. They have
|
||||
to send the response and return a `stop` tuple instead.
|
||||
|
||||
* The `known_content_type` REST handler callback has been removed
|
||||
as it was found unnecessary.
|
||||
|
||||
* Websocket handlers have both the normal `init/2` and
|
||||
an optional `websocket_init/1` function. The reason for
|
||||
that exception is that the `websocket_*` callbacks execute
|
||||
in a separate process from the `init/2` callback, and it
|
||||
was therefore not obvious how timers or monitors should
|
||||
be setup properly. They are effectively initializing the
|
||||
handler before and after the HTTP/1.1 upgrade.
|
||||
|
||||
* Websocket handlers can now send frames directly from
|
||||
`websocket_init/1`. The frames will be sent immediately
|
||||
after the handshake.
|
||||
|
||||
* Websocket handler callbacks no longer receive the Req
|
||||
argument. The `init/2` callback still receives it and
|
||||
can be used to extract relevant information. The `terminate/3`
|
||||
callback, if implemented, may still receive the Req
|
||||
(see next bullet point).
|
||||
|
||||
* Websocket handlers have a new `req_filter` option that
|
||||
can be used to customize how much information should be
|
||||
discarded from the Req object after the handshake. Note
|
||||
that the Req object is only available in `terminate/3`
|
||||
past that point.
|
||||
|
||||
* Websocket handlers have their timeout default changed
|
||||
from infinity to 60 seconds.
|
||||
|
||||
=== New functions
|
||||
|
||||
* The `cowboy_req:scheme/1` function has been added.
|
||||
|
||||
* The `cowboy_req:uri/1,2` function has been added, replacing the
|
||||
less powerful functions `cowboy_req:url/1` and `cowboy_req:host_url/1`.
|
||||
|
||||
* The functions `cowboy_req:match_qs/2` and `cowboy_req:match_cookies/2`
|
||||
allow matching query string and cookies against constraints.
|
||||
|
||||
* The function `cowboy_req:set_resp_cookie/3` has been added to
|
||||
complement `cowboy_req:set_resp_cookie/4`.
|
||||
|
||||
* The functions `cowboy_req:resp_header/2,3` and `cowboy_req:resp_headers/1`
|
||||
have been added. They can be used to retrieve response headers
|
||||
that were previously set.
|
||||
|
||||
* The function `cowboy_req:set_resp_headers/2` has been added. It
|
||||
allows setting many response headers at once.
|
||||
|
||||
* The functions `cowboy_req:push/3,4` can be used to push resources
|
||||
for protocols that support it (by default only HTTP/2).
|
||||
|
||||
=== Changed functions
|
||||
|
||||
* The `cowboy:start_http/4` function was renamed to `cowboy:start_clear/3`.
|
||||
|
||||
* The `cowboy:start_https/4` function was renamed to `cowboy:start_tls/3`.
|
||||
|
||||
* Most, if not all, functions in the `cowboy_req` module have been modified.
|
||||
Please consult the changelog of each individual functions. The changes
|
||||
are mainly about simplifying and clarifying the interface. The Req is no
|
||||
longer returned when not necessary, maps are used wherever possible,
|
||||
and some functions have been renamed.
|
||||
|
||||
* The position of the `Opts` argument for `cowboy_req:set_resp_cookie/4`
|
||||
has changed to improve consistency. It is now the last argument.
|
||||
|
||||
=== Removed functions
|
||||
|
||||
* The functions `cowboy_req:url/1` and `cowboy_req:host_url/1` have been
|
||||
removed in favor of the new function `cowboy_req:uri/1,2`.
|
||||
|
||||
* The functions `cowboy_req:meta/2,3` and `cowboy_req:set_meta/3` have
|
||||
been removed. The Req object is now a public map, therefore they became
|
||||
unnecessary.
|
||||
|
||||
* The functions `cowboy_req:set_resp_body_fun/2,3` have been removed.
|
||||
For sending files, the function `cowboy_req:set_resp_body/2` can now
|
||||
take a sendfile tuple.
|
||||
|
||||
* Remove many undocumented functions from `cowboy_req`, including the
|
||||
functions `cowboy_req:get/2` and `cowboy_req:set/3`.
|
||||
|
||||
=== Other changes
|
||||
|
||||
* The correct percent-decoding algorithm is now used for path elements
|
||||
during routing. It will no longer decode `+` characters.
|
||||
|
||||
* The router will now properly handle path segments `.` and `..`.
|
||||
|
||||
* Routing behavior has changed for URIs containing latin1 characters.
|
||||
They are no longer allowed. URIs are expected to be in UTF-8 once
|
||||
they are percent-decoded.
|
||||
|
||||
* Etag comparison in REST handlers has been fixed. Some requests may
|
||||
now fail when they succeeded in the past.
|
||||
|
||||
* The If-*-Since headers are now ignored in REST handlers if If*-Match
|
||||
headers exist. The former is largely a backward compatible header
|
||||
and this shouldn't create any issue. The new behavior follows the
|
||||
current RFCs more closely.
|
||||
|
||||
* The static file handler has been improved to handle more special
|
||||
characters on systems that accept them.
|
|
@ -1,3 +1,4 @@
|
|||
[appendix]
|
||||
== HTTP and other specifications
|
||||
|
||||
This chapter intends to list all the specification documents
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue