summaryrefslogtreecommitdiff
path: root/lib/vquic
Commit message (Collapse)AuthorAgeFilesLines
* ngtcp2: use 0.15.0Daniel Stenberg2023-05-121-20/+17
| | | | | | | | | - nghttp3 0.11.0 - nghttp2 1.53.0 Adapt to new API calls Closes #11031
* quiche: disable pacing while pacing is not actually performedFrançois Michel2023-05-031-0/+1
| | | | Closes #11068
* checksrc: find bad indentation in conditions without open braceDaniel Stenberg2023-04-282-2/+2
| | | | | | | | | | | If the previous line starts with if/while/for AND ends with a closed parenthesis and there's an equal number of open and closed parentheses on that line, verify that this line is indented $indent more steps, if not a cpp line. Also adjust the fall-out from this fix. Closes #11054
* urldata: shrink *select_bits int => unsigned charDaniel Stenberg2023-04-263-4/+4
| | | | | | | | | | - dselect_bits - cselect_bits ... are using less than 8 bits. Changed types and moved them towards the end of the structs to fit better. Closes #11025
* http3: expire unpaused transfers in all HTTP/3 backendsStefan Eissing2023-04-253-0/+46
| | | | Closes #11005
* h2/h3: replace `state.drain` counter with `state.dselect_bits`Stefan Eissing2023-04-254-63/+69
| | | | | | | | | | | | | | | | | | | | | - `drain` was used by http/2 and http/3 implementations to indicate that the transfer requires send/recv independant from its socket poll state. Intended as a counter, it was used as bool flag only. - a similar mechanism exists on `connectdata->cselect_bits` where specific protocols can indicate something similar, only for the whole connection. - `cselect_bits` are cleard in transfer.c on use and, importantly, also set when the transfer loop expended its `maxloops` tries. `drain` was not cleared by transfer and the http2/3 implementations had to take care of that. - `dselect_bits` is cleared *and* set by the transfer loop. http2/3 does no longer clear it, only set when new events happen. This change unifies the handling of socket poll overrides, extending `cselect_bits` by a easy handle specific value and a common treatment in transfers. Closes #11005
* HTTP3/quiche: terminate h1 response header when no body is sentStefan Eissing2023-04-241-0/+6
| | | | | | | - fixes a failure in test2501 where a response without body was missing the final empty line Closes #11003
* quiche: Enable IDLE egress handlingStefan Eissing2023-04-181-2/+2
| | | | | | | Follow-up to 544abeea which added the handling but wrongly left it commented out. Closes https://github.com/curl/curl/pull/11000
* http2: support HTTP/2 to forward proxies, non-tunnelingStefan Eissing2023-04-173-94/+151
| | | | | | | | | | | | | | | | | | | - with `--proxy-http2` allow h2 ALPN negotiation to forward proxies - applies to http: requests against a https: proxy only, as https: requests will auto-tunnel - adding a HTTP/1 request parser in http1.c - removed h2h3.c - using new request parser in nghttp2 and all h3 backends - adding test 2603 for request parser - adding h2 proxy test cases to test_10_* scorecard.py: request scoring accidentally always run curl with '-v'. Removed that, expect double numbers. labeller: added http1.* and h2-proxy sources to detection Closes #10967
* http3: check stream_ctx more thoroughly in all backendsStefan Eissing2023-04-133-26/+109
| | | | | | | | | | - callbacks and filter methods might be invoked at unexpected times, e.g. when the transfer's stream_ctx has not been initialized yet or, more likely, has already been taken down. - check for existance of stream_ctx in such places and return an error or silently succeed the call. Closes #10951
* http2: move HTTP/2 stream vars into local contextStefan Eissing2023-04-063-17/+21
| | | | | | | | | | - remove NGHTTP2 members of `struct HTTP` - add `void *h2_ctx` to `struct HTTP` - add `void *h3_ctx` to `struct HTTP` - separate h2/h3 pointers are needed for eyeballing - manage local stream_ctx in http implementations Closes #10877
* proxy: http2 proxy tunnel implementationStefan Eissing2023-04-062-31/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | - currently only on debug build and when env variable CURL_PROXY_TUNNEL_H2 is present. - will ALPN negotiate with the proxy server and switch tunnel filter based on the protocol negotiated. - http/1.1 tunnel code moved into cf-h1-proxy.[ch] - http/2 tunnel code implemented in cf-h2-proxy.[ch] - tunnel start and ALPN set remains in http_proxy.c - moving all haproxy related code into cf-haproxy.[ch] VTLS changes - SSL filters rely solely on the "alpn" specification they are created with and no longer check conn->bits.tls_enable_alpn. - checks on which ALPN specification to use (or none at all) are done in vtls.c when creating the filter. Testing - added a nghttpx forward proxy to the pytest setup that speaks HTTP/2 and forwards all requests to the Apache httpd forward proxy server. - extending test coverage in test_10 cases - adding proxy tests for direct/tunnel h1/h2 use of basic auth. - adding test for http/1.1 and h2 proxy tunneling to pytest Closes #10780
* http3: improvements across backendsStefan Eissing2023-03-315-1341/+1846
| | | | | | | | | | | | | | | | | | | | | | | | - ngtcp2: using bufq for recv stream data - internal stream_ctx instead of `struct HTTP` members for quiche, ngtcp2 and msh3 - no more QUIC related members in `struct HTTP` - experimental use of recvmmsg(), disabled by default - testing on my old debian box shows no throughput improvements. - leaving it in, but disabled, for future revisit - vquic: common UDP receive code for ngtcp2 and quiche - vquic: common UDP send code for ngtcp2 and quiche - added pytest skips for known msh3 failures - fix unit2601 to survive torture testing - quiche: using latest `master` from quiche and enabling large download tests, now that key change is supported - fixing test_07_21 where retry handling of starting a stream was faulty - msh3: use bufq for recv buffering headers and data - msh3: replace fprintf debug logging with LOG_CF where possible - msh3: force QUIC expire timers on recv/send to have more than 1 request per second served Closes #10772
* ngtcp2: adjust config and code checks for ngtcp2 without nghttp3Stefan Eissing2023-03-233-5/+5
| | | | | | | | | | - make configure show on HTTP3 feature that both ngtcp2 and nghttp3 are in play - define ENABLE_QUIC only when USE_NGTCP2 and USE_NGHTTP3 are defined - add USE_NGHTTP3 in the ngtcp2 implementation Fixes #10793 Closes #10821
* http2: Use KEEP_SEND_HOLD for flow control in HTTP/2Stefan Eissing2023-03-142-2/+2
| | | | | | | | | | | - use the defined, but so far not used, KEEP_SEND_HOLD bit for flow control based suspend of sending in transfers. Prior to this change KEEP_SEND_PAUSE bit was used instead, but that can interfere with pausing streams from the user side via curl_easy_pause. Fixes https://github.com/curl/curl/issues/10751 Closes https://github.com/curl/curl/pull/10753
* misc: fix typosViktor Szakats2023-03-081-1/+1
| | | | Closes #10706
* url: fix logic in connection reuse to deny reuse on "unclean" connectionsStefan Eissing2023-03-073-3/+57
| | | | | | | | | | | | | | - add parameter to `conn_is_alive()` cfilter method that returns if there is input data waiting on the connection - refrain from re-using connnection from the cache that have input pending - adapt http/2 and http/3 alive checks to digest pending input to check the connection state - remove check_cxn method from openssl as that was just doing what the socket filter now does. - add tests for connection reuse with special server configs Closes #10690
* connect: fix time_connect and time_appconnect timer statisticsStefan Eissing2023-03-063-20/+37
| | | | | | | | | | | | | | - time_connect was not updated when the overall connection failed, e.g. when SSL verification was unsuccessful, refs #10670 - rework gather those values to interrogate involved filters, also from all eyeballing attempts, to report the maximum of those values. - added 3 test cases in test_06 to check reported values on successful, partially failed and totally failed connections. Reported-by: Master Inspire Fixes #10670 Closes #10671
* http: fix unix domain socket use in https connectsStefan Eissing2023-02-281-0/+4
| | | | | | | | | | | | - when h2/h3 eyeballing was involved, unix domain socket configurations were not honoured - configuring --unix-socket will disable HTTP/3 as candidate for eyeballing - combinatino of --unix-socket and --http3-only will fail during initialisation - adding pytest test_11 to reproduce Reported-by: Jelle van der Waa Fixes #10633 Closes #10641
* quic/schannel: fix compiler warningsViktor Szakats2023-02-283-4/+8
| | | | | Fixes #10603 Closes #10616
* ngtcp2: fix unwanted close of file descriptor 0Stefan Eissing2023-02-241-1/+2
| | | | | | | | | ... causing macOS to hand out 0 as next socket handle and failing on further operations. Reported-by: Sergey Fionov Fixes #10593 Closes #10595
* h3: silence compiler warningsViktor Szakats2023-02-122-0/+5
| | | | | | Reviewed-by: Daniel Stenberg Fixes #10485 Closes #10486
* ngtcp2: replace removed define and stop using removed functionDaniel Stenberg2023-02-111-10/+2
| | | | | | | | They were removed upstream. Reported-by: Karthikdasari0423 on github Fixes #10469 Closes #10474
* vquic: stabilization and improvementsStefan Eissing2023-02-104-667/+1047
| | | | | | | | | | | | | | | | | | | | | vquic stabilization - udp send code shared between ngtcp2 and quiche - quiche handling of data and events improved ngtcp2 and pytest improvements - fixes handling of "drain" situations, discovered in scorecard tests with the Caddy server. - improvements in handling transfers that have already data or are already closed to make an early return on recv pytest - adding caddy tests when available scorecard improvemnts. - using correct caddy port - allowing tests for only httpd or caddy Closes #10451
* connections: introduce http/3 happy eyeballsStefan Eissing2023-02-025-233/+496
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | New cfilter HTTP-CONNECT for h3/h2/http1.1 eyeballing. - filter is installed when `--http3` in the tool is used (or the equivalent CURLOPT_ done in the library) - starts a QUIC/HTTP/3 connect right away. Should that not succeed after 100ms (subject to change), a parallel attempt is started for HTTP/2 and HTTP/1.1 via TCP - both attempts are subject to IPv6/IPv4 eyeballing, same as happens for other connections - tie timeout to the ip-version HAPPY_EYEBALLS_TIMEOUT - use a `soft` timeout at half the value. When the soft timeout expires, the HTTPS-CONNECT filter checks if the QUIC filter has received any data from the server. If not, it will start the HTTP/2 attempt. HTTP/3(ngtcp2) improvements. - setting call_data in all cfilter calls similar to http/2 and vtls filters for use in callback where no stream data is available. - returning CURLE_PARTIAL_FILE for prematurely terminated transfers - enabling pytest test_05 for h3 - shifting functionality to "connect" UDP sockets from ngtcp2 implementation into the udp socket cfilter. Because unconnected UDP sockets are weird. For example they error when adding to a pollset. HTTP/3(quiche) improvements. - fixed upload bug in quiche implementation, now passes 251 and pytest - error codes on stream RESET - improved debug logs - handling of DRAIN during connect - limiting pending event queue HTTP/2 cfilter improvements. - use LOG_CF macros for dynamic logging in debug build - fix CURLcode on RST streams to be CURLE_PARTIAL_FILE - enable pytest test_05 for h2 - fix upload pytests and improve parallel transfer performance. GOAWAY handling for ngtcp2/quiche - during connect, when the remote server refuses to accept new connections and closes immediately (so the local conn goes into DRAIN phase), the connection is torn down and a another attempt is made after a short grace period. This is the behaviour observed with nghttpx when we tell it to shut down gracefully. Tested in pytest test_03_02. TLS improvements - ALPN selection for SSL/SSL-PROXY filters in one vtls set of functions, replaces copy of logic in all tls backends. - standardized the infof logging of offered ALPNs - ALPN negotiated: have common function for all backends that sets alpn proprty and connection related things based on the negotiated protocol (or lack thereof). - new tests/tests-httpd/scorecard.py for testing h3/h2 protocol implementation. Invoke: python3 tests/tests-httpd/scorecard.py --help for usage. Improvements on gathering connect statistics and socket access. - new CF_CTRL_CONN_REPORT_STATS cfilter control for having cfilters report connection statistics. This is triggered when the connection has completely connected. - new void Curl_pgrsTimeWas(..) method to report a timer update with a timestamp of when it happend. This allows for updating timers "later", e.g. a connect statistic after full connectivity has been reached. - in case of HTTP eyeballing, the previous changes will update statistics only from the filter chain that "won" the eyeballing. - new cfilter query CF_QUERY_SOCKET for retrieving the socket used by a filter chain. Added methods Curl_conn_cf_get_socket() and Curl_conn_get_socket() for convenient use of this query. - Change VTLS backend to query their sub-filters for the socket when checks during the handshake are made. HTTP/3 documentation on how https eyeballing works. TLS improvements - ALPN selection for SSL/SSL-PROXY filters in one vtls set of functions, replaces copy of logic in all tls backends. - standardized the infof logging of offered ALPNs - ALPN negotiated: have common function for all backends that sets alpn proprty and connection related things based on the negotiated protocol (or lack thereof). Scorecard with Caddy. - configure can be run with `--with-test-caddy=path` to specify which caddy to use for testing - tests/tests-httpd/scorecard.py now measures download speeds with caddy pytest improvements - adding Makfile to clean gen dir - adding nghttpx rundir creation on start - checking httpd version 2.4.55 for test_05 cases where it is needed. Skipping with message if too old. - catch exception when checking for caddy existance on system. Closes #10349
* CI: add pytest github workflow to CI test/tests-httpd on a HTTP/3 setupStefan Eissing2023-01-311-0/+2
| | | | Closes #10317
* curl_log: for failf/infof and debug logging implementationsStefan Eissing2023-01-124-122/+102
| | | | | | | | | - new functions and macros for cfilter debugging - set CURL_DEBUG with names of cfilters where debug logging should be enabled - use GNUC __attribute__ to enable printf format checks during compile Closes #10271
* msh3: update to v0.6Nick Banks2023-01-101-84/+134
| | | | Closes #10192
* ngtcp2: add CURLOPT_SSL_CTX_FUNCTION support for openssl+wolfsslStefan Eissing2023-01-101-47/+78
| | | | | | | | | | | Using common method for SSL_CTX initialization of verfiy peer and CA settings. This also provides X509_STORE sharing to become available for ngtcp2+openssl HTTP/3. Reported-by: violetlige on github Fixes #10222 Closes #10239
* tests-httpd: basic infra to run curl against an apache httpd plus nghttpx for h3Stefan Eissing2023-01-091-27/+54
| | | | | | | | | | | | | | | | | | | - adding '--with-test-httpd=<path>' to configure non-standard apache2 install - python env and base classes for running httpd - basic tests for connectivity with h1/h2/h3 - adding test cases for truncated responses in http versions. - adding goaway test for HTTP/3. - adding "stuttering" tests with parallel downloads in chunks with varying delays between chunks. - adding a curltest module to the httpd server, adding GOAWAY test. - mod_curltest now installs 2 handlers - 'echo': writing as response body what came as request body - 'tweak': with query parameters to tweak response behaviour - marked known fails as skip for now Closes #10175
* quic: improve connect error message, debugging info, fix false connect reportStefan Eissing2023-01-092-12/+24
| | | | | | | | | | | - ECONNECTREFUSED has not its own fail message in quic filters - Debug logging in connect eyballing improved - Fix bug in ngtcp2/quiche that could lead to false success reporting. Reported-by: Divy Le Ray Fixes #10245 Closes #10248
* quiche: fix build without any HTTP/2 implementationStefan Eissing2023-01-091-4/+0
| | | | | Fixes #10260 Closes #10263
* msh3: run again in its cfilterStefan Eissing2023-01-081-66/+240
| | | | | | | | | | - test 2500, single GET works - test 2501, single POST stalls - test 2502, multiple, sequential GETs each use a new connection since MsH3ConnectionGetState(qconn) no longer reports CONNECTED after one GET. Closes #10204
* quic: rename vquic implementations, fix for quiche build.Stefan Eissing2023-01-057-52/+46
| | | | | | | | | | - quiche in debug mode did not build, fixed. - moved all vquic implementation files to prefix curl_* to avoid the potential mixups between provided .h files and our own. - quich passes test 2500 and 2502. 2501, the POST, fail with the body being rejected. Quich bug? Closes #10242
* copyright: update all copyright lines and remove year rangesDaniel Stenberg2023-01-039-9/+9
| | | | | | | | | | | | - they are mostly pointless in all major jurisdictions - many big corporations and projects already don't use them - saves us from pointless churn - git keeps history for us - the year range is kept in COPYING checksrc is updated to allow non-year using copyright statements Closes #10205
* ngtcp2: fix the build without 'sendmsg'Daniel Stenberg2023-01-031-1/+0
| | | | | | Follow-up from 71b7e0161032 Closes #10210
* lib: connect/h2/h3 refactorStefan Eissing2022-12-309-1414/+1950
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Refactoring of connection setup and happy eyeballing. Move nghttp2. ngtcp2, quiche and msh3 into connection filters. - eyeballing cfilter that uses sub-filters for performing parallel connects - socket cfilter for all transport types, including QUIC - QUIC implementations in cfilter, can now participate in eyeballing - connection setup is more dynamic in order to adapt to what filter did really connect. Relevant to see if a SSL filter needs to be added or if SSL has already been provided - HTTP/3 test cases similar to HTTP/2 - multiuse of parallel transfers for HTTP/3, tested for ngtcp2 and quiche - Fix for data attach/detach in VTLS filters that could lead to crashes during parallel transfers. - Eliminating setup() methods in cfilters, no longer needed. - Improving Curl_conn_is_alive() to replace Curl_connalive() and integrated ssl alive checks into cfilter. - Adding CF_CNTRL_CONN_INFO_UPDATE to tell filters to update connection into and persist it at the easy handle. - Several more cfilter related cleanups and moves: - stream_weigth and dependency info is now wrapped in struct Curl_data_priority - Curl_data_priority members depend is available in HTTP2|HTTP3 - Curl_data_priority members depend on NGHTTP2 support - handling init/reset/cleanup of priority part of url.c - data->state.priority same struct, but shallow copy for compares only - PROTOPT_STREAM has been removed - Curl_conn_is_mulitplex() now available to check on capability - Adding query method to connection filters. - ngtcp2+quiche: implementing query for max concurrent transfers. - Adding is_alive and keep_alive cfilter methods. Adding DATA_SETUP event. - setting keepalive timestamp on connect - DATA_SETUP is called after the connection has been completely setup (but may not connected yet) to allow filters to initialize data members they use. - there is no socket to be had with msh3, it is unclear how select shall work - manual test via "curl --http3 https://curl.se" fail with "empty reply from server". - Various socket/conn related cleanups: - Curl_socket is now Curl_socket_open and in cf-socket.c - Curl_closesocket is now Curl_socket_close and in cf-socket.c - Curl_ssl_use has been replaced with Cur_conn_is_ssl - Curl_conn_tcp_accepted_set has been split into Curl_conn_tcp_listen_set and Curl_conn_tcp_accepted_set with a clearer purpose Closes #10141
* msh3: add support for request payloadNick Banks2022-12-283-7/+31
| | | | Closes #10136
* msh3: update to v0.5 ReleaseNick Banks2022-12-221-2/+15
| | | | Closes #10125
* gnutls: use common gnutls init and verify code for ngtcp2Stefan Eissing2022-12-012-74/+76
| | | | Closes #10007
* vtls: localization of state data in filtersStefan Eissing2022-11-222-13/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - almost all backend calls pass the Curl_cfilter intance instead of connectdata+sockindex - ssl_connect_data is remove from struct connectdata and made internal to vtls - ssl_connect_data is allocated in the added filter, kept at cf->ctx - added function to let a ssl filter access its ssl_primary_config and ssl_config_data this selects the propert subfields in conn and data, for filters added as plain or proxy - adjusted all backends to use the changed api - adjusted all backends to access config data via the exposed functions, no longer using conn or data directly cfilter renames for clear purpose: - methods `Curl_conn_*(data, conn, sockindex)` work on the complete filter chain at `sockindex` and connection `conn`. - methods `Curl_cf_*(cf, ...)` work on a specific Curl_cfilter instance. - methods `Curl_conn_cf()` work on/with filter instances at a connection. - rebased and resolved some naming conflicts - hostname validation (und session lookup) on SECONDARY use the same name as on FIRST (again). new debug macros and removing connectdata from function signatures where not needed. adapting schannel for new Curl_read_plain paramter. Closes #9919
* misc: typo and grammar fixesAyesh Karunaratne2022-10-272-3/+3
| | | | | | | | | | - Replace `Github` with `GitHub`. - Replace `windows` with `Windows` - Replace `advice` with `advise` where a verb is used. - A few fixes on removing repeated words. - Replace `a HTTP` with `an HTTP` Closes #9802
* ngtcp2: Fix build errors due to changes in ngtcp2 libraryJay Satiro2022-10-171-3/+4
| | | | | | | | | | | | | | | | | | | | ngtcp2/ngtcp2@b0d86f60 changed: - ngtcp2_conn_get_max_udp_payload_size => ngtcp2_conn_get_max_tx_udp_payload_size - ngtcp2_conn_get_path_max_udp_payload_size => ngtcp2_conn_get_path_max_tx_udp_payload_size ngtcp2/ngtcp2@ec59b873 changed: - 'early_data_rejected' member added to ng_callbacks. Assisted-by: Daniel Stenberg Reported-by: jurisuk@users.noreply.github.com Fixes https://github.com/curl/curl/issues/9747 Closes https://github.com/curl/curl/pull/9748
* ngtcp2: fix C89 compliance nitDaniel Stenberg2022-09-271-1/+3
|
* openssl: make certinfo available for QUICDaniel Stenberg2022-09-272-0/+9
| | | | | | | | | | | | Curl_ossl_certchain() is now an exported function in lib/vtls/openssl.c that can also be used from quiche.c and ngtcp2.c to get the cert chain for QUIC connections as well. The *certchain function was moved to the top of the file for this reason. Reported-by: Eloy Degen Fixes #9584 Closes #9597
* msh3: change the static_assert to make the code C89Daniel Stenberg2022-09-231-3/+3
|
* misc: spelling fixesViktor Szakats2022-08-311-2/+2
| | | | | | | | | Found using codespell 2.2.1. Also delete the redundant protocol designator from an archive.org URL. Reviewed-by: Daniel Stenberg Closes #9403
* ngtcp2: fix picky compiler warnings with wolfSSL for QUICDaniel Stenberg2022-08-151-2/+4
| | | | | | Follow-up to 8a13be227eede2 Closes #9315
* ngtcp2: remove leftover variableDaniel Stenberg2022-08-151-1/+0
| | | | | | | | Mistake leftover from my edit before push. Follow-up from 8a13be227eede2601c2b3b Reported-by: Viktor Szakats Bug: https://github.com/curl/curl/pull/9290#issuecomment-1214569167
* quic: add support via wolfSSLStefan Eissing2022-08-152-1/+135
| | | | | | | | - based on ngtcp2 PR https://github.com/ngtcp2/ngtcp2/pull/505 - configure adapted to build against ngtcp2 wolfssl crypto lib - quic code added for creation of WOLFSSL* instances Closes #9290