summaryrefslogtreecommitdiffhomepage
path: root/src (follow)
AgeCommit message (Collapse)AuthorFilesLines
2021-04-22HTTP/3: adjusted control stream parsing.Vladimir Homutov1-0/+4
7.2.1: If a DATA frame is received on a control stream, the recipient MUST respond with a connection error of type H3_FRAME_UNEXPECTED; 7.2.2: If a HEADERS frame is received on a control stream, the recipient MUST respond with a connection error (Section 8) of type H3_FRAME_UNEXPECTED.
2021-04-21Mail: fixed reading with fully filled buffer (ticket #2159).Maxim Dounin1-11/+14
With SMTP pipelining, ngx_mail_read_command() can be called with s->buffer without any space available, to parse additional commands received to the buffer on previous calls. Previously, this resulted in recv() being called with zero length, resulting in zero being returned, which was interpreted as a connection close by the client, so nginx silently closed connection. Fix is to avoid calling c->recv() if there is no free space in the buffer, but continue parsing of the already received commands.
2021-04-21Version bump.Maxim Dounin1-2/+2
2021-04-19QUIC: renamed stream variables from sn to qs.Roman Arutyunyan2-99/+99
Currently both names are used which is confusing. Historically these were different objects, but now it's the same one. The name qs (quic stream) makes more sense than sn (stream node).
2021-04-19QUIC: renamed stream field from c to connection.Roman Arutyunyan3-41/+44
2021-04-16QUIC: fixed permitted packet types for PATH_RESPONSE.Sergey Kandaurov1-1/+1
PATH_RESPONSE was explicitly forbidden in 0-RTT since at least draft-22, but the Frame Types table was not updated until recently while in IESG evaluation.
2021-04-19QUIC: added missing checks for limits in stream frames parsing.Vladimir Homutov1-0/+8
2021-04-19QUIC: fixed parsing of unknown frame types.Vladimir Homutov2-0/+9
The ngx_quic_frame_allowed() function only expects known frame types.
2021-04-15QUIC: avoid sending extra frames in case of error.Vladimir Homutov1-0/+4
2021-04-13QUIC: normalize header inclusion.Sergey Kandaurov9-18/+8
Stop including QUIC headers with no user-serviceable parts inside. This allows to provide a much cleaner QUIC interface. To cope with that, ngx_quic_derive_key() is now explicitly exported for v3 and quic modules. Additionally, this completely hides the ngx_quic_keys_t internal type.
2021-04-13QUIC: ngx_quic_frames_stream_t made opaque.Sergey Kandaurov4-15/+23
2021-04-14QUIC: separate files for SSL library interfaces.Vladimir Homutov5-507/+529
2021-04-13QUIC: separate files for tokens related processing.Vladimir Homutov4-285/+315
2021-04-13QUIC: separate files for output and ack related processing.Vladimir Homutov6-1953/+2021
2021-04-13QUIC: separate files for stream related processing.Vladimir Homutov4-1285/+1317
2021-04-13QUIC: separate files for frames related processing.Vladimir Homutov4-912/+957
2021-04-13QUIC: separate files for connection id related processing.Vladimir Homutov4-530/+564
2021-04-14QUIC: headers cleanup.Vladimir Homutov6-53/+49
The "ngx_event_quic.h" header file now contains only public definitions, used by modules. All internal definitions are moved into the "ngx_event_quic_connection.h" header file.
2021-04-09QUIC: separate function for connection ids initialization.Vladimir Homutov1-40/+62
The function correctly cleans up resources in case of failure to create initial server id: it removes previously created udp node for odcid from listening rbtree.
2021-04-08Changed keepalive_requests default to 1000 (ticket #2155).Maxim Dounin2-2/+2
It turns out no browsers implement HTTP/2 GOAWAY handling properly, and large enough number of resources on a page results in failures to load some resources. In particular, Chrome seems to experience errors if loading of all resources requires more than 1 connection (while it is usually able to retry requests at least once, even with 2 connections there are occasional failures for some reason), Safari if loading requires more than 3 connections, and Firefox if loading requires more than 10 connections (can be configured with network.http.request.max-attempts, defaults to 10). It does not seem to be possible to resolve this on nginx side, even strict limiting of maximum concurrency does not help, and loading issues seems to be triggered by merely queueing of a request for a particular connection. The only available mitigation seems to use higher keepalive_requests value. The new default is 1000 and matches previously used default for http2_max_requests. It is expected to be enough for 99.98% of the pages (https://httparchive.org/reports/state-of-the-web?start=latest#reqTotal) even in Chrome.
2021-04-08Added $connection_time variable.Maxim Dounin1-0/+30
2021-04-08Introduced the "keepalive_time" directive.Maxim Dounin10-1/+46
Similar to lingering_time, it limits total connection lifetime before keepalive is switched off. The default is 1 hour, which is close to the total maximum connection lifetime possible with default keepalive_requests and keepalive_timeout.
2021-04-07QUIC: fixed ngx_quic_send_ack_range() function.Vladimir Homutov1-1/+6
Created frame was not added to the output queue.
2021-04-07HTTP/2: relaxed PRIORITY frames limit.Maxim Dounin1-1/+1
Firefox uses several idle streams for PRIORITY frames[1], and "http2_max_concurrent_streams 1;" results in "client sent too many PRIORITY frames" errors when a connection is established by Firefox. Fix is to relax the PRIORITY frames limit to use at least 100 as the initial value (which is the recommended by the HTTP/2 protocol minimum limit on the number of concurrent streams, so it is not unreasonable for clients to assume that similar number of idle streams can be used for prioritization). [1] https://hg.mozilla.org/mozilla-central/file/32a9e6e145d6e3071c3993a20bb603a2f388722b/netwerk/protocol/http/Http2Stream.cpp#l1270
2021-04-05QUIC: fixed debug message macro.Vladimir Homutov1-2/+2
2021-04-05QUIC: added error codes and messages from latest drafts.Vladimir Homutov2-1/+5
The AEAD_LIMIT_REACHED was addeded in draft-31. The NO_VIABLE_PATH was added in draft-33.
2021-04-16HTTP/3: keepalive_time support.Sergey Kandaurov2-4/+12
2021-04-16Merged with the default branch.Sergey Kandaurov13-20/+97
2021-04-12HTTP/3: removed h3scf->quic leftover after 0d2b2664b41c.Sergey Kandaurov1-1/+0
2021-04-07QUIC: fixed memory leak in ngx_hkdf_extract()/ngx_hkdf_expand().Sergey Kandaurov1-0/+4
This fixes leak on successful path when built with OpenSSL.
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-04-05Version bump.Maxim Dounin1-2/+2
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-28Resolver: added missing event handling after reading.Maxim Dounin1-2/+17
If we need to be notified about further events, ngx_handle_read_event() needs to be called after a read event is processed. Without this, an event can be removed from the kernel and won't be reported again, notably when using oneshot event methods, such as eventport on Solaris. While here, error handling is also added, similar to one present in ngx_resolver_tcp_read(). This is not expected to make a difference and mostly added for consistency.
2021-03-28Events: fixed "port_dissociate() failed" alerts with eventport.Maxim Dounin1-1/+1
If an attempt is made to delete an event which was already reported, port_dissociate() returns an error. Fix is avoid doing anything if ev->active is not set. Possible alternative approach would be to avoid calling ngx_del_event() at all if ev->active is not set. This approach, however, will require something else to re-add the other event of the connection, since both read and write events are dissociated if an event is reported on a file descriptor. Currently ngx_eventport_del_event() re-associates write event if called to delete read event, and vice versa.
2021-03-26Events: fixed expiration of timers in the past.Maxim Dounin1-3/+1
If, at the start of an event loop iteration, there are any timers in the past (including timers expiring now), the ngx_process_events() function is called with zero timeout, and returns immediately even if there are no events. But the following code only calls ngx_event_expire_timers() if time actually changed, so this results in nginx spinning in the event loop till current time changes. While such timers are not expected to appear under normal conditions, as all such timers should be removed on previous event loop iterations, they still can appear due to bugs, zero timeouts set in the configuration (if this is not explicitly handled by the code), or due to external time changes on systems without clock_gettime(CLOCK_MONOTONIC). Fix is to call ngx_event_expire_timers() unconditionally. Calling it on each event loop iteration is not expected to be significant from performance point of view, especially compared to a syscall in ngx_process_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-23QUIC: PATH_CHALLENGE frame creation.Vladimir Homutov1-0/+26
2021-03-31QUIC: distinct files for connection migration.Vladimir Homutov4-48/+92
The connection migration-related code from quic.c with dependencies is moved into separate file.
2021-03-31QUIC: separate header for ngx_quic_connection_t.Vladimir Homutov2-161/+183
2021-04-02QUIC: simplified quic connection dispatching.Vladimir Homutov3-15/+24
Currently listener contains rbtree with multiple nodes for single QUIC connection: each corresponding to specific server id. Each udp node points to same ngx_connection_t, which points to QUIC connection via c->udp field. Thus when an event handler is called, it only gets ngx_connection_t with c->udp pointing to QUIC connection. This makes it hard to obtain actual node which was used to dispatch packet (it requires to repeat DCID lookup). Additionally, ngx_quic_connection_t->udp field is only needed to keep a pointer in c->udp. The node is not added into the tree and does not carry useful information.
2021-04-02UDP: extended datagram context.Vladimir Homutov3-30/+34
Sometimes it is required to process datagram properties at higher level (i.e. QUIC is interested in source address which may change and IP options). The patch adds ngx_udp_dgram_t structure used to pass packet-related information in c->udp.
2021-03-30QUIC: fixed udp buffer initialization.Vladimir Homutov1-0/+2
The start field is used to check if the QUIC packet is first in the datagram. This fixes stateless reset detection.
2021-03-30QUIC: do not handle empty dcid.Roman Arutyunyan1-64/+31
When a QUIC datagram arrives, its DCID is never empty. Previously, the case of empty DCID was handled. Now this code is simplified.
2021-03-11QUIC: do not reallocate c->sockaddr.Roman Arutyunyan1-8/+10
When a connection is created, enough memory is allocated to accomodate any future address change.