summaryrefslogtreecommitdiffhomepage
path: root/src (follow)
AgeCommit message (Collapse)AuthorFilesLines
2021-05-18HTTP/3: fixed server push after 9ec3e71f8a61.Roman Arutyunyan1-4/+3
When using server push, a segfault occured because ngx_http_v3_create_push_request() accessed ngx_http_v3_session_t object the old way. Prior to 9ec3e71f8a61, HTTP/3 session was stored directly in c->data. Now it's referenced by the v3_session field of ngx_http_connection_t.
2021-05-05QUIC: generic buffering for stream input.Roman Arutyunyan5-75/+77
Previously each stream had an input buffer. Now memory is allocated as bytes arrive. Generic buffering mechanism is used for this.
2021-05-05QUIC: simplified sending 1-RTT only frames.Sergey Kandaurov5-27/+19
2021-05-05QUIC: relaxed client id requirements.Vladimir Homutov3-6/+44
Client IDs cannot be reused on different paths. This change allows to reuse client id previosly seen on the same path (but with different dcid) in case when no unused client IDs are available.
2021-05-06QUIC: consider NEW_CONNECTION_ID a probing frame.Vladimir Homutov1-0/+1
According to quic-transport, 9.1: PATH_CHALLENGE, PATH_RESPONSE, NEW_CONNECTION_ID, and PADDING frames are "probing frames", and all other frames are "non-probing frames".
2021-04-28HTTP/3: clean up table from session cleanup handler.Roman Arutyunyan3-19/+13
Previously table had a separate cleanup handler.
2021-05-05HTTP/3: moved session initialization to a separate file.Roman Arutyunyan3-75/+87
Previously it was in ngx_http_v3_streams.c, but it's unrelated to streams.
2021-05-05HTTP/3: separate header files for existing source files.Roman Arutyunyan4-74/+135
2021-05-05HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.Roman Arutyunyan4-125/+159
Previously it was parsed in ngx_http_v3_streams.c, while the streams were parsed in ngx_http_v3_parse.c. Now all parsing is done in one file. This simplifies parsing API and cleans up ngx_http_v3_streams.c.
2021-04-27HTTP/3: renamed ngx_http_v3_client_XXX() functions.Roman Arutyunyan4-17/+16
The functions are renamed to ngx_http_v3_send_XXX() similar to ngx_http_v3_send_settings() and ngx_http_v3_send_goaway().
2021-05-05HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.Roman Arutyunyan7-41/+40
2021-05-05HTTP/3: reference h3c directly from ngx_http_connection_t.Roman Arutyunyan7-32/+30
Previously, an ngx_http_v3_connection_t object was created for HTTP/3 and then assinged to c->data instead of the generic ngx_http_connection_t object. Now a direct reference is added to ngx_http_connection_t, which is less confusing and does not require a flag for http3.
2021-04-30HTTP/3: ngx_http_v3_get_session() macro.Roman Arutyunyan5-22/+24
It's used instead of accessing c->quic->parent->data directly. Apart from being simpler, it allows to change the way session is stored in the future by changing the macro.
2021-05-05HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.Roman Arutyunyan2-12/+12
2021-05-04HTTP/3: fixed decoder stream stubs.Roman Arutyunyan1-5/+5
Now ngx_http_v3_ack_header() and ngx_http_v3_inc_insert_count() always generate decoder error. Our implementation does not use dynamic tables and does not expect client to send Section Acknowledgement or Insert Count Increment. Stream Cancellation, on the other hand, is allowed to be sent anyway. This is why ngx_http_v3_cancel_stream() does not return an error.
2021-05-05HTTP/3: reject empty DATA and HEADERS frames on control stream.Roman Arutyunyan1-5/+4
Previously only non-empty frames were rejected.
2021-04-28QUIC: fixed build with NGX_QUIC_DEBUG_ALLOC enabled.Vladimir Homutov1-9/+6
2021-04-29QUIC: connection migration.Vladimir Homutov15-369/+1675
The patch adds proper transitions between multiple networking addresses that can be used by a single quic connection. New networking paths are validated using PATH_CHALLENGE/PATH_RESPONSE frames.
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-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-07QUIC: fixed ngx_quic_send_ack_range() function.Vladimir Homutov1-1/+6
Created frame was not added to the output queue.
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-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 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-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-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.