[appendix]
== Migrating from Cowboy 2.2 to 2.3

Cowboy 2.3 focused on making the Cowboy processes behave
properly according to OTP principles. This version is a
very good milestone toward that goal and most of everything
should now work. Release upgrades and a few details will
be improved in future versions.

=== Features added

* Add support for all functions from the module `sys`. Note
  that Cowboy currently does not implement the `sys` debugging
  mechanisms as tracing is recommended instead.

* Add a `max_frame_size` option for Websocket handlers
  to close the connection when the client attempts to
  send a frame that's too large. It currently defaults
  to `infinity` to avoid breaking existing code but will
  be changed in a future version.

* Update Cowlib to 2.2.1.

* Add support for the 308 status code and a test suite
  for RFC7538 where it is defined.

=== Bugs fixed

* Ensure timeout options accept the value `infinity` as
  documented.

* Properly reject HTTP/2 requests with an invalid content-length
  header instead of simply crashing.

* When switching from HTTP/1.1 to Websocket or user protocols
  all the messages in the mailbox were flushed. Only messages
  specific to `cowboy_http` should now be flushed.

* Parsing of the x-forwarded-for header has been corrected.
  It now supports IPv6 addresses both with and without port.

* Websocket subprotocol tokens are now parsed in a case
  insensitive manner, according to the spec.

* Cookies without values are now allowed. For example `Cookie: foo`.

* Colons are now allowed within path segments in routes provided
  to `cowboy_router:compile/1` as long as they are not the first
  character of the path segment.

* The `cowboy_req:delete_resp_header/2` function will no longer
  crash when no response header was set before calling it.

* A miscount of the output HTTP/2 flow control window has been
  fixed. It prevented sending the response body fully to some
  clients. The issue only affected response bodies sent as iolists.
