<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cowboy.git/src, branch improve-dynamic_buffer</title>
<subtitle>Small, fast, modern HTTP server for Erlang/OTP.
</subtitle>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/'/>
<entry>
<title>Make dynamic_buffer start at 512 and change less abruptly</title>
<updated>2025-09-16T12:05:39+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-04-15T11:35:52+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=6f62c27d948aa559ae5b691b8ad9ba73934f40df'/>
<id>6f62c27d948aa559ae5b691b8ad9ba73934f40df</id>
<content type='text'>
Based on RabbitMQ performance testing. In RabbitMQ we start
at 128 instead but 128 is too low for typical HTTP requests.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Based on RabbitMQ performance testing. In RabbitMQ we start
at 128 instead but 128 is too low for typical HTTP requests.
</pre>
</div>
</content>
</entry>
<entry>
<title>New data delivery mechanism for HTTP/2+ Websocket</title>
<updated>2025-09-15T11:09:23+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-08-21T16:09:42+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=8da6ca11e8ea4e93def78bd0299decd6f409bc43'/>
<id>8da6ca11e8ea4e93def78bd0299decd6f409bc43</id>
<content type='text'>
A new data_delivery mechanism called 'relay' has been added.
It bypasses stream handlers (and the buffering in cowboy_stream_h)
and sends the data directly to the process implementing
Websocket (and should work for other similar protocols
like HTTP/2 WebTransport).

Flow control in HTTP/2 is maintained in a simpler way,
via a configured flow value that is used to maintain
the window to a reasonable value when data is received.

The 'relay' data_delivery has been implemented for both
HTTP/2 and HTTP/3. It has not been implemented for HTTP/1.1
since switching protocol there overrides the connection process.

HTTP/2 Websocket is now better tested.

A bug was fixed with the 'stream_handlers' data_delivery
where active mode would not be reenabled if it was disabled
at some point.

The Websocket performance suite has been updated to
include tests that do not use Gun. Websocket modules
used by the performance suite use the 'relay' data_delivery
now. Performance is improved significantly with 'relay',
between 10% and 20% faster. HTTP/2 Websocket performance
is not on par with HTTP/1.1 still, but the remaining
difference is thought to be from the HTTP/2 overhead and
flow control.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
A new data_delivery mechanism called 'relay' has been added.
It bypasses stream handlers (and the buffering in cowboy_stream_h)
and sends the data directly to the process implementing
Websocket (and should work for other similar protocols
like HTTP/2 WebTransport).

Flow control in HTTP/2 is maintained in a simpler way,
via a configured flow value that is used to maintain
the window to a reasonable value when data is received.

The 'relay' data_delivery has been implemented for both
HTTP/2 and HTTP/3. It has not been implemented for HTTP/1.1
since switching protocol there overrides the connection process.

HTTP/2 Websocket is now better tested.

A bug was fixed with the 'stream_handlers' data_delivery
where active mode would not be reenabled if it was disabled
at some point.

The Websocket performance suite has been updated to
include tests that do not use Gun. Websocket modules
used by the performance suite use the 'relay' data_delivery
now. Performance is improved significantly with 'relay',
between 10% and 20% faster. HTTP/2 Websocket performance
is not on par with HTTP/1.1 still, but the remaining
difference is thought to be from the HTTP/2 overhead and
flow control.
</pre>
</div>
</content>
</entry>
<entry>
<title>Update to most recent WebTransport draft</title>
<updated>2025-06-25T09:47:25+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-06-25T09:47:25+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=a8c717718a3f4dd7b4bc67fe7bebe3a4e7a7ed74'/>
<id>a8c717718a3f4dd7b4bc67fe7bebe3a4e7a7ed74</id>
<content type='text'>
WEBTRANSPORT -&gt; WT in most places. Only ENABLE_WEBTRANSPORT
remains (since it is a draft-02 setting that was later removed)
as well as internal functions and atoms about stream headers,
for greater clarity.

The draft also clarified that WT_SESSION_GONE can be sent on
the session stream and since it's what is already done a
related todo was removed.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
WEBTRANSPORT -&gt; WT in most places. Only ENABLE_WEBTRANSPORT
remains (since it is a draft-02 setting that was later removed)
as well as internal functions and atoms about stream headers,
for greater clarity.

The draft also clarified that WT_SESSION_GONE can be sent on
the session stream and since it's what is already done a
related todo was removed.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix cowboy_http2 Dialyzer warnings with OTP-28</title>
<updated>2025-06-20T09:50:38+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-06-20T09:50:38+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=e5241620f50c5d76a654528e81ea3d15d67286a2'/>
<id>e5241620f50c5d76a654528e81ea3d15d67286a2</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Initial WebTransport implementation</title>
<updated>2025-06-19T14:27:07+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-05-12T11:01:55+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=58909b014446462370d6280ffe93c6f4fbe116da'/>
<id>58909b014446462370d6280ffe93c6f4fbe116da</id>
<content type='text'>
This implements the upcoming draft-13
but has bits to make it work with draft-02
that most (all?) Chromium versions use.

Data and events are not going through
cowboy_stream beyond init. Since this
approach appears to work well it may
be a good idea to do the same for
Websocket over HTTP/2+ and improve
its performance.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This implements the upcoming draft-13
but has bits to make it work with draft-02
that most (all?) Chromium versions use.

Data and events are not going through
cowboy_stream beyond init. Since this
approach appears to work well it may
be a good idea to do the same for
Websocket over HTTP/2+ and improve
its performance.
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove copyright years from all files except LICENSE</title>
<updated>2025-02-17T14:00:02+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-02-17T14:00:02+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=eef66e0928d988e2d329f19b3c9fabf06d87781b'/>
<id>eef66e0928d988e2d329f19b3c9fabf06d87781b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add support for lists in cowboy_req:set_resp_headers</title>
<updated>2025-02-11T12:28:45+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-02-11T11:00:03+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=e8a1868033a75fa1f684a8b91ff7aa25e6c67676'/>
<id>e8a1868033a75fa1f684a8b91ff7aa25e6c67676</id>
<content type='text'>
This is meant to be used with clients such as Gun to simplify
proxying and similar operations. The set-cookie header must
not be set this way so there is still some extra processing
to be done to fully translate a Gun response into a Cowboy
response.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This is meant to be used with clients such as Gun to simplify
proxying and similar operations. The set-cookie header must
not be set this way so there is still some extra processing
to be done to fully translate a Gun response into a Cowboy
response.
</pre>
</div>
</content>
</entry>
<entry>
<title>cowboy_rest: Always set the Allow header</title>
<updated>2025-02-10T17:41:11+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-02-10T17:41:11+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=f316a65906d97609c7a3f317c0b1dea95fc37e6c'/>
<id>f316a65906d97609c7a3f317c0b1dea95fc37e6c</id>
<content type='text'>
Not just on 405 responses or OPTIONS requests.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Not just on 405 responses or OPTIONS requests.
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove unnecessary indirection in cowboy_rest</title>
<updated>2025-02-10T17:11:05+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-02-10T17:11:05+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=58402b416295c2bbedeb0f7855803dca4b9c1da3'/>
<id>58402b416295c2bbedeb0f7855803dca4b9c1da3</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Provide better control over which HTTP protocols are enabled</title>
<updated>2025-02-10T14:26:00+00:00</updated>
<author>
<name>Loïc Hoguin</name>
<email>essen@ninenines.eu</email>
</author>
<published>2025-02-10T14:26:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/cowboy.git/commit/?id=053e233c5634ede60dec6c2c261a5729dae1abc4'/>
<id>053e233c5634ede60dec6c2c261a5729dae1abc4</id>
<content type='text'>
Over cleartext TCP the `protocols` option lists the enabled
protocols. The default is to allow both HTTP/1.1 and HTTP/2.

Over TLS the default protocol to use when ALPN is not used
can now be configured via the `alpn_default_protocol` option.

Performing an HTTP/1.1 upgrade to HTTP/2 over TLS is now
rejected with an error as connecting to HTTP/2 over TLS
requires the use of ALPN (or that HTTP/2 be the default
when connecting over TLS).
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Over cleartext TCP the `protocols` option lists the enabled
protocols. The default is to allow both HTTP/1.1 and HTTP/2.

Over TLS the default protocol to use when ALPN is not used
can now be configured via the `alpn_default_protocol` option.

Performing an HTTP/1.1 upgrade to HTTP/2 over TLS is now
rejected with an error as connecting to HTTP/2 over TLS
requires the use of ALPN (or that HTTP/2 be the default
when connecting over TLS).
</pre>
</div>
</content>
</entry>
</feed>
