summaryrefslogtreecommitdiffhomepage
path: root/src/http (follow)
AgeCommit message (Collapse)AuthorFilesLines
2021-04-16Merged with the default branch.Sergey Kandaurov6-18/+82
2021-04-12HTTP/3: removed h3scf->quic leftover after 0d2b2664b41c.Sergey Kandaurov1-1/+0
2021-04-05Gzip: updated handling of zlib variant from Intel.Maxim Dounin1-26/+9
In current versions (all versions based on zlib 1.2.11, at least since 2018) it no longer uses 64K hash and does not force window bits to 13 if it is less than 13. That is, it needs just 16 bytes more memory than normal zlib, so these bytes are simply added to the normal size calculation.
2021-04-05Gzip: support for zlib-ng.Maxim Dounin1-2/+21
2021-03-28Fixed handling of already closed connections.Maxim Dounin3-7/+22
In limit_req, auth_delay, and upstream code to check for broken connections, tests for possible connection close by the client did not work if the connection was already closed when relevant event handler was set. This happened because there were no additional events in case of edge-triggered event methods, and read events were disabled in case of level-triggered ones. Fix is to explicitly post a read event if the c->read->ready flag is set.
2021-03-28Upstream: fixed broken connection check with eventport.Maxim Dounin1-0/+6
For connection close to be reported with eventport on Solaris, ngx_handle_read_event() needs to be called.
2021-03-28Upstream: fixed non-buffered proxying with eventport.Maxim Dounin1-3/+1
For new data to be reported with eventport on Solaris, ngx_handle_read_event() needs to be called after reading response headers. To do so, ngx_http_upstream_process_non_buffered_upstream() now called unconditionally if there are no prepread data. This won't cause any read() syscalls as long as upstream connection is not ready for reading (c->read->ready is not set), but will result in proper handling of all events.
2021-03-26HTTP/2: improved handling of "keepalive_timeout 0".Maxim Dounin1-1/+3
Without explicit handling, a zero timer was actually added, leading to multiple unneeded syscalls. Further, sending GOAWAY frame early might be beneficial for clients. Reported by Sergey Kandaurov.
2021-03-24Cancel keepalive and lingering close on EOF better (ticket #2145).Sergey Kandaurov1-5/+5
Unlike in 75e908236701, which added the logic to ngx_http_finalize_request(), this change moves it to a more generic routine ngx_http_finalize_connection() to cover cases when a request is finalized with NGX_DONE. In particular, this fixes unwanted connection transition into the keepalive state after receiving EOF while discarding request body. With edge-triggered event methods that means the connection will last for extra seconds as set in the keepalive_timeout directive.
2021-03-23gRPC: fixed handling of padding on DATA frames.Maxim Dounin1-11/+24
The response size check introduced in 39501ce97e29 did not take into account possible padding on DATA frames, resulting in incorrect "upstream sent response body larger than indicated content length" errors if upstream server used padding in responses with known length. Fix is to check the actual size of response buffers produced by the code, similarly to how it is done in other protocols, instead of checking the size of DATA frames. Reported at: http://mailman.nginx.org/pipermail/nginx-devel/2021-March/013907.html
2021-03-30Merged with the default branch.Sergey Kandaurov6-24/+58
2021-03-15HTTP/3: fixed $connection_requests.Roman Arutyunyan1-0/+1
Previously, the value was always "1".
2021-03-22HTTP/3: set initial_max_streams_uni default value to 3.Roman Arutyunyan1-1/+1
The maximum number of HTTP/3 unidirectional client streams we can handle is 3: control, decode and encode. These streams are never closed.
2021-03-30HTTP/3: keepalive timeout.Roman Arutyunyan3-0/+85
This timeout limits the time when no client request streams exist.
2021-03-15QUIC: connection shutdown.Roman Arutyunyan3-0/+10
The function ngx_quic_shutdown_connection() waits until all non-cancelable streams are closed, and then closes the connection. In HTTP/3 cancelable streams are all unidirectional streams except push streams. The function is called from HTTP/3 when client reaches keepalive_requests.
2021-03-15HTTP/3: send GOAWAY when last request is accepted.Roman Arutyunyan3-0/+56
The last request in connection is determined according to the keepalive_requests directive. Requests beyond keepalive_requests are rejected.
2021-03-16HTTP/3: do not push until a MAX_PUSH_ID frame is received.Sergey Kandaurov2-3/+6
Fixes interop with quic-go that doesn't send MAX_PUSH_ID.
2021-03-16QUIC: fixed hq ALPN id for the final draft.Sergey Kandaurov1-1/+1
It was an agreement to use "hq-interop"[1] for interoperability testing. [1] https://github.com/quicwg/base-drafts/wiki/ALPN-IDs-used-with-QUIC
2021-03-10HTTP/3: fixed server push.Sergey Kandaurov1-0/+1
2021-03-10Merged with the default branch.Sergey Kandaurov5-36/+76
2021-03-05SSL: fixed build by Sun C with old OpenSSL versions.Maxim Dounin4-8/+8
Sun C complains about "statement not reached" if a "return" is followed by additional statements.
2021-03-02Proxy: variables support in "proxy_cookie_flags" flags.Ruslan Ermilov1-26/+63
2021-03-01HTTP/2: client_header_timeout before first request (ticket #2142).Maxim Dounin1-2/+5
With this change, behaviour of HTTP/2 becomes even closer to HTTP/1.x, and client_header_timeout instead of keepalive_timeout is used before the first request is received. This fixes HTTP/2 connections being closed even before the first request if "keepalive_timeout 0;" was used in the configuration; the problem appeared in f790816a0e87 (1.19.7).
2021-02-17HTTP/3: limited client header size.Roman Arutyunyan2-0/+16
The limit is the size of all large client header buffers. Client header size is the total size of all client header names and values.
2021-02-17HTTP/3: introduced ngx_http_v3_parse_t structure.Roman Arutyunyan4-23/+16
The structure is used to parse an HTTP/3 request. An object of this type is added to ngx_http_request_t instead of h3_parse generic pointer. Also, the new field is located outside of the request ephemeral zone to keep it safe after request headers are parsed.
2021-02-16HTTP/3: removed http3_max_field_size.Roman Arutyunyan3-19/+5
Instead, size of one large_client_header_buffers buffer is used.
2021-02-17Merged with the default branch.Sergey Kandaurov10-176/+161
2021-02-11HTTP/2: removed http2_max_field_size and http2_max_header_size.Maxim Dounin3-29/+32
Instead, size of one large_client_header_buffers buffer and all large client header buffers are used.
2021-02-11HTTP/2: keepalive_timeout now armed once between requests.Maxim Dounin1-24/+15
Previously, PINGs and other frames extended possible keepalive time, making it possible to keep an open HTTP/2 connection for a long time. Now the connection is always closed as long as keepalive_timeout expires, similarly to how it happens in HTTP/1.x. Note that as a part of this change, incomplete frames are no longer trigger a separate timeout, so http2_recv_timeout (replaced by client_header_timeout in previous patches) is essentially cancelled. The client_header_timeout is, however, used for SSL handshake and while reading HEADERS frames.
2021-02-11HTTP/2: removed http2_idle_timeout and http2_max_requests.Maxim Dounin3-31/+39
Instead, keepalive_timeout and keepalive_requests are now used. This is expected to simplify HTTP/2 code and usage. This also matches directives used by upstream module for all protocols. In case of default settings, this effectively changes maximum number of requests per connection from 1000 to 100. This looks acceptable, especially given that HTTP/2 code now properly supports lingering close. Further, this changes default keepalive timeout in HTTP/2 from 300 seconds to 75 seconds. This also looks acceptable, and larger than PING interval used by Firefox (network.http.spdy.ping-threshold defaults to 58s), the only browser to use PINGs.
2021-02-11HTTP/2: removed http2_recv_timeout.Maxim Dounin3-14/+42
Instead, the client_header_timeout is now used for HTTP/2 reading. Further, the timeout is changed to be set once till no further data left to read, similarly to how client_header_timeout is used in other places.
2021-02-11HTTP/2: removed SPDY directives handling.Maxim Dounin2-77/+0
The spdy_* directives are not available since introduction of HTTP/2 module in nginx 1.9.5 more than five years ago.
2021-02-11HTTP/2: fixed reusing connections with active requests.Maxim Dounin1-0/+1
New connections are marked reusable by ngx_http_init_connection() if there are no data available for reading. As a result, if SSL is not used, ngx_http_v2_init() might be called when the connection is marked reusable. If a HEADERS frame is immediately available for reading, this resulted in connection being preserved in reusable state with an active request, and possibly closed later as if during worker shutdown (that is, after all active requests were finalized). Fix is to explicitly mark connections non-reusable in ngx_http_v2_init() instead of (incorrectly) assuming they are already non-reusable. Found by Sergey Kandaurov.
2021-02-11HTTP/2: reuse of connections with incomplete frames.Maxim Dounin1-1/+7
Prodded by Taewoo Kim.
2021-02-11Reuse of connections in lingering close.Maxim Dounin2-2/+8
This is particularly important in HTTP/2, where keepalive connections are closed with lingering. Before the patch, reusing a keepalive HTTP/2 connection resulted in the connection waiting for lingering close to remain in the reusable connections queue, preventing ngx_drain_connections() from closing additional connections. The patch fixes it by marking the connection reusable again, and so moving it in the reusable connections queue. Further, it makes actually possible to reuse such connections if needed.
2021-02-08QUIC: the "quic_host_key" directive.Vladimir Homutov1-16/+133
The token generation in QUIC is reworked. Single host key is used to generate all required keys of needed sizes using HKDF. The "quic_stateless_reset_token_key" directive is removed. Instead, the "quic_host_key" directive is used, which reads key from file, or sets it to random bytes if not specified.
2021-02-02HTTP/3: reverted version check for keepalive flag.Roman Arutyunyan1-1/+1
The flag is used in ngx_http_finalize_connection() to switch client connection to the keepalive mode. Since eaea7dac3292 this code is not executed for HTTP/3 which allows us to revert the change and get back to the default branch code.
2021-02-01HTTP/3: fixed format specifier.Roman Arutyunyan1-1/+1
2021-02-01HTTP/2: lingering close changed to handle NGX_AGAIN.Ruslan Ermilov1-0/+4
This part somehow slipped away from c5840ca2063d. While it is not expected to be needed in case of lingering close, it is good to keep it for correctness (see 2b5528023f6b).
2021-01-26Clean up trailers in ngx_http_clean_header() as well.Sergey Kandaurov1-0/+4
The function has not been updated with introduction of trailers support in 7034:1b068a4e82d8 (1.13.2).
2021-01-25HTTP/3: refactored request body parser.Roman Arutyunyan4-86/+488
The change reduces diff to the default branch for src/http/ngx_http_request_body.c. Also, client Content-Length, if present, is now checked against the real body size sent by client.
2021-01-29QUIC: stateless retry.Vladimir Homutov1-4/+2
Previously, quic connection object was created when Retry packet was sent. This is neither necessary nor convenient, and contradicts the idea of retry: protecting from bad clients and saving server resources. Now, the connection is not created, token is verified cryptographically instead of holding it in connection.
2021-01-29HTTP/3: call ngx_handle_read_event() from client header handler.Roman Arutyunyan1-4/+5
This function should be called at the end of an event handler to prepare the event for the next handler call. Particularly, the "active" flag is set or cleared depending on data availability. With this call missing in one code path, read handler was not called again after handling the initial part of the client request, if the request was too big to fit into a single STREAM frame. Now ngx_handle_read_event() is called in this code path. Also, read timer is restarted.
2021-01-19Core: removed post_accept_timeout.Maxim Dounin2-14/+21
Keeping post_accept_timeout in ngx_listening_t is no longer needed since we've switched to 1 second timeout for deferred accept in 5541:fdb67cfc957d. Further, using it in HTTP code can result in client_header_timeout being used from an incorrect server block, notably if address-specific virtual servers are used along with a wildcard listening socket, or if we've switched to a different server block based on SNI in SSL handshake.
2021-01-19Removed incorrect optimization of HEAD requests.Maxim Dounin2-11/+1
The stub status module and ngx_http_send_response() (used by the empty gif module and the "return" directive) incorrectly assumed that responding to HEAD requests always results in r->header_only being set. This is not true, and results in incorrect behaviour, for example, in the following configuration: location / { image_filter size; return 200 test; } Fix is to remove this incorrect micro-optimization from both stub status module and ngx_http_send_response(). Reported by Chris Newton.
2021-01-12Upstream: fixed zero size buf alerts on extra data (ticket #2117).Maxim Dounin2-0/+14
After 7675:9afa45068b8f and 7678:bffcc5af1d72 (1.19.1), during non-buffered simple proxying, responses with extra data might result in zero size buffers being generated and "zero size buf" alerts in writer. This bug is similar to the one with FastCGI proxying fixed in 7689:da8d758aabeb. In non-buffered mode, normally the filter function is not called if u->length is already 0, since u->length is checked after each call of the filter function. There is a case when this can happen though: if the response length is 0, and there are pre-read response body data left after reading response headers. As such, a check for u->length is needed at the start of non-buffered filter functions, similar to the one for p->length present in buffered filter functions. Appropriate checks added to the existing non-buffered copy filters in the upstream (used by scgi and uwsgi proxying) and proxy modules.
2020-12-21HTTP/3: removed HTTP/3-specific code.Roman Arutyunyan1-7/+5
The ngx_http_set_lingering_close() function is not called for HTTP/3. The change reduces diff to the default branch.
2021-01-18HTTP/3: client header validation.Roman Arutyunyan1-0/+70
A header with the name containing null, CR, LF, colon or uppercase characters, is now considered an error. A header with the value containing null, CR or LF, is also considered an error. Also, header is considered invalid unless its name only contains lowercase characters, digits, minus and optionally underscore. Such header can be optionally ignored.
2021-01-12HTTP/3: added comment.Roman Arutyunyan1-0/+1
2021-01-22HTTP/3: client pseudo-headers restrictions.Roman Arutyunyan1-0/+92
- :method, :path and :scheme are expected exactly once and not empty - :method and :scheme character validation is added - :authority cannot appear more than once