<feed xmlns='http://www.w3.org/2005/Atom'>
<title>nginx.git/src/http, branch release-1.21.3</title>
<subtitle>nginx</subtitle>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/'/>
<entry>
<title>HTTP/2: optimized processing of small DATA frames.</title>
<updated>2021-09-06T11:54:50+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-09-06T11:54:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=243469df65fca2a853c6fe32754d1bfe19567cd2'/>
<id>243469df65fca2a853c6fe32754d1bfe19567cd2</id>
<content type='text'>
The request body filter chain is no longer called after processing
a DATA frame.  Instead, we now post a read event to do this.  This
ensures that multiple small DATA frames read during the same event loop
iteration are coalesced together, resulting in much faster processing.

Since rb-&gt;buf can now contain unprocessed data, window update is no
longer sent in ngx_http_v2_state_read_data() in case of flow control
being used due to filter buffering.  Instead, window will be updated
by ngx_http_v2_read_client_request_body_handler() in the posted read
event.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The request body filter chain is no longer called after processing
a DATA frame.  Instead, we now post a read event to do this.  This
ensures that multiple small DATA frames read during the same event loop
iteration are coalesced together, resulting in much faster processing.

Since rb-&gt;buf can now contain unprocessed data, window update is no
longer sent in ngx_http_v2_state_read_data() in case of flow control
being used due to filter buffering.  Instead, window will be updated
by ngx_http_v2_read_client_request_body_handler() in the posted read
event.
</pre>
</div>
</content>
</entry>
<entry>
<title>HTTP/2: fixed timers left after request body reading.</title>
<updated>2021-09-06T11:54:48+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-09-06T11:54:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=584a30b4d51302755c5600892fc293b1586985f7'/>
<id>584a30b4d51302755c5600892fc293b1586985f7</id>
<content type='text'>
Following rb-&gt;filter_need_buffering changes, request body reading is
only finished after the filter chain is called and rb-&gt;last_saved is set.
As such, with r-&gt;request_body_no_buffering, timer on fc-&gt;read is no
longer removed when the last part of the body is received, potentially
resulting in incorrect behaviour.

The fix is to call ngx_http_v2_process_request_body() from the
ngx_http_v2_read_unbuffered_request_body() function instead of
directly calling ngx_http_v2_filter_request_body(), so the timer
is properly removed.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Following rb-&gt;filter_need_buffering changes, request body reading is
only finished after the filter chain is called and rb-&gt;last_saved is set.
As such, with r-&gt;request_body_no_buffering, timer on fc-&gt;read is no
longer removed when the last part of the body is received, potentially
resulting in incorrect behaviour.

The fix is to call ngx_http_v2_process_request_body() from the
ngx_http_v2_read_unbuffered_request_body() function instead of
directly calling ngx_http_v2_filter_request_body(), so the timer
is properly removed.
</pre>
</div>
</content>
</entry>
<entry>
<title>HTTP/2: fixed window updates when buffering in filters.</title>
<updated>2021-09-06T11:54:47+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-09-06T11:54:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=27fb6cdb9f7aa9d6258251d565b199e2a15f5286'/>
<id>27fb6cdb9f7aa9d6258251d565b199e2a15f5286</id>
<content type='text'>
In the body read handler, the window was incorrectly calculated
based on the full buffer size instead of the amount of free space
in the buffer.  If the request body is buffered by a filter, and
the buffer is not empty after the read event is generated by the
filter to resume request body processing, this could result in
"http2 negative window update" alerts.

Further, in the body ready handler and in ngx_http_v2_state_read_data()
the buffer wasn't cleared when the data were already written to disk,
so the client might stuck without window updates.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
In the body read handler, the window was incorrectly calculated
based on the full buffer size instead of the amount of free space
in the buffer.  If the request body is buffered by a filter, and
the buffer is not empty after the read event is generated by the
filter to resume request body processing, this could result in
"http2 negative window update" alerts.

Further, in the body ready handler and in ngx_http_v2_state_read_data()
the buffer wasn't cleared when the data were already written to disk,
so the client might stuck without window updates.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fixed debug logging.</title>
<updated>2021-09-02T09:25:37+00:00</updated>
<author>
<name>Roman Arutyunyan</name>
<email>arut@nginx.com</email>
</author>
<published>2021-09-02T09:25:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=16557ff8b611748e463ff951d6931fb60d9b78f1'/>
<id>16557ff8b611748e463ff951d6931fb60d9b78f1</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>HTTP/2: avoid memcpy() with NULL source and zero length.</title>
<updated>2021-08-31T13:44:13+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-08-31T13:44:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=15bf6d8cc950d3aec2d1c3152b39f62be4939025'/>
<id>15bf6d8cc950d3aec2d1c3152b39f62be4939025</id>
<content type='text'>
Prodded by Clang Static Analyzer.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Prodded by Clang Static Analyzer.
</pre>
</div>
</content>
</entry>
<entry>
<title>Request body: reading body buffering in filters.</title>
<updated>2021-08-29T19:22:02+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-08-29T19:22:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=67d160bf25e02ba6679bb6c3b9cbdfeb29b759de'/>
<id>67d160bf25e02ba6679bb6c3b9cbdfeb29b759de</id>
<content type='text'>
If a filter wants to buffer the request body during reading (for
example, to check an external scanner), it can now do so.  To make
it possible, the code now checks rb-&gt;last_saved (introduced in the
previous change) along with rb-&gt;rest == 0.

Since in HTTP/2 this requires flow control to avoid overflowing the
request body buffer, so filters which need buffering have to set
the rb-&gt;filter_need_buffering flag on the first filter call.  (Note
that each filter is expected to call the next filter, so all filters
will be able set the flag if needed.)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
If a filter wants to buffer the request body during reading (for
example, to check an external scanner), it can now do so.  To make
it possible, the code now checks rb-&gt;last_saved (introduced in the
previous change) along with rb-&gt;rest == 0.

Since in HTTP/2 this requires flow control to avoid overflowing the
request body buffer, so filters which need buffering have to set
the rb-&gt;filter_need_buffering flag on the first filter call.  (Note
that each filter is expected to call the next filter, so all filters
will be able set the flag if needed.)
</pre>
</div>
</content>
</entry>
<entry>
<title>Request body: introduced rb-&gt;last_saved flag.</title>
<updated>2021-08-29T19:21:03+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-08-29T19:21:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=2a709213800fd3fd2809881374eb110562b53c08'/>
<id>2a709213800fd3fd2809881374eb110562b53c08</id>
<content type='text'>
It indicates that the last buffer was received by the save filter,
and can be used to check this at higher levels.  To be used in the
following changes.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
It indicates that the last buffer was received by the save filter,
and can be used to check this at higher levels.  To be used in the
following changes.
</pre>
</div>
</content>
</entry>
<entry>
<title>Request body: added alert to catch duplicate body saving.</title>
<updated>2021-08-29T19:20:54+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-08-29T19:20:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=fd9d43b087b4247f8cb5f91845be46bd624c175a'/>
<id>fd9d43b087b4247f8cb5f91845be46bd624c175a</id>
<content type='text'>
If due to an error ngx_http_request_body_save_filter() is called
more than once with rb-&gt;rest == 0, this used to result in a segmentation
fault.  Added an alert to catch such errors, just in case.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
If due to an error ngx_http_request_body_save_filter() is called
more than once with rb-&gt;rest == 0, this used to result in a segmentation
fault.  Added an alert to catch such errors, just in case.
</pre>
</div>
</content>
</entry>
<entry>
<title>Request body: missing comments about initialization.</title>
<updated>2021-08-29T19:20:49+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-08-29T19:20:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=aa02695f5ea70f6628317b56f93e7e8733d4a029'/>
<id>aa02695f5ea70f6628317b56f93e7e8733d4a029</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>HTTP/2: improved handling of preread unbuffered requests.</title>
<updated>2021-08-29T19:20:44+00:00</updated>
<author>
<name>Maxim Dounin</name>
<email>mdounin@mdounin.ru</email>
</author>
<published>2021-08-29T19:20:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sigsegv.uk/nginx.git/commit/?id=2862eb40e86190bf4d337a6483150f4385fb5358'/>
<id>2862eb40e86190bf4d337a6483150f4385fb5358</id>
<content type='text'>
Previously, fully preread unbuffered requests larger than client body
buffer size were saved to disk, despite the fact that "unbuffered" is
expected to imply no disk buffering.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Previously, fully preread unbuffered requests larger than client body
buffer size were saved to disk, despite the fact that "unbuffered" is
expected to imply no disk buffering.
</pre>
</div>
</content>
</entry>
</feed>
