2002-09-03 19:52:59 +08:00
|
|
|
/***************************************************************************
|
2004-05-21 04:35:42 +08:00
|
|
|
* _ _ ____ _
|
|
|
|
* Project ___| | | | _ \| |
|
|
|
|
* / __| | | | |_) | |
|
|
|
|
* | (__| |_| | _ <| |___
|
1999-12-29 22:20:26 +08:00
|
|
|
* \___|\___/|_| \_\_____|
|
|
|
|
*
|
2023-01-02 20:51:48 +08:00
|
|
|
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
1999-12-29 22:20:26 +08:00
|
|
|
*
|
2002-09-03 19:52:59 +08:00
|
|
|
* This software is licensed as described in the file COPYING, which
|
|
|
|
* you should have received as part of this distribution. The terms
|
2020-11-04 21:02:01 +08:00
|
|
|
* are also available at https://curl.se/docs/copyright.html.
|
2004-05-21 04:35:42 +08:00
|
|
|
*
|
2001-01-03 17:29:33 +08:00
|
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
|
|
* copies of the Software, and permit persons to whom the Software is
|
2002-09-03 19:52:59 +08:00
|
|
|
* furnished to do so, under the terms of the COPYING file.
|
1999-12-29 22:20:26 +08:00
|
|
|
*
|
2001-01-03 17:29:33 +08:00
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
1999-12-29 22:20:26 +08:00
|
|
|
*
|
2002-09-03 19:52:59 +08:00
|
|
|
* SPDX-License-Identifier: curl
|
2022-05-17 17:16:50 +08:00
|
|
|
*
|
2002-09-03 19:52:59 +08:00
|
|
|
***************************************************************************/
|
1999-12-29 22:20:26 +08:00
|
|
|
|
2013-01-07 02:06:49 +08:00
|
|
|
#include "curl_setup.h"
|
1999-12-29 22:20:26 +08:00
|
|
|
|
2013-01-04 09:50:28 +08:00
|
|
|
#include "urldata.h"
|
|
|
|
#include "sendf.h"
|
2018-02-10 22:13:15 +08:00
|
|
|
#include "multiif.h"
|
2013-01-04 09:50:28 +08:00
|
|
|
#include "progress.h"
|
2019-07-31 21:30:31 +08:00
|
|
|
#include "timeval.h"
|
2015-03-03 19:36:18 +08:00
|
|
|
#include "curl_printf.h"
|
2002-05-03 20:06:04 +08:00
|
|
|
|
2018-03-15 23:43:00 +08:00
|
|
|
/* check rate limits within this many recent milliseconds, at minimum. */
|
|
|
|
#define MIN_RATE_LIMIT_PERIOD 3000
|
|
|
|
|
2019-02-11 23:38:19 +08:00
|
|
|
#ifndef CURL_DISABLE_PROGRESS_METER
|
2004-03-23 19:43:34 +08:00
|
|
|
/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
|
|
|
|
byte) */
|
2008-10-11 09:56:04 +08:00
|
|
|
static void time2str(char *r, curl_off_t seconds)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2018-06-03 04:52:56 +08:00
|
|
|
curl_off_t h;
|
2008-10-11 09:56:04 +08:00
|
|
|
if(seconds <= 0) {
|
2004-03-23 19:43:34 +08:00
|
|
|
strcpy(r, "--:--:--");
|
|
|
|
return;
|
|
|
|
}
|
2008-10-11 09:56:04 +08:00
|
|
|
h = seconds / CURL_OFF_T_C(3600);
|
|
|
|
if(h <= CURL_OFF_T_C(99)) {
|
2018-06-03 04:52:56 +08:00
|
|
|
curl_off_t m = (seconds - (h*CURL_OFF_T_C(3600))) / CURL_OFF_T_C(60);
|
|
|
|
curl_off_t s = (seconds - (h*CURL_OFF_T_C(3600))) - (m*CURL_OFF_T_C(60));
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(r, 9, "%2" FMT_OFF_T ":%02" FMT_OFF_T ":%02" FMT_OFF_T, h, m, s);
|
2004-03-23 19:43:34 +08:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* this equals to more than 99 hours, switch to a more suitable output
|
|
|
|
format to fit within the limits. */
|
2018-06-03 04:52:56 +08:00
|
|
|
curl_off_t d = seconds / CURL_OFF_T_C(86400);
|
2008-10-11 09:56:04 +08:00
|
|
|
h = (seconds - (d*CURL_OFF_T_C(86400))) / CURL_OFF_T_C(3600);
|
|
|
|
if(d <= CURL_OFF_T_C(999))
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(r, 9, "%3" FMT_OFF_T "d %02" FMT_OFF_T "h", d, h);
|
2004-03-23 19:43:34 +08:00
|
|
|
else
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(r, 9, "%7" FMT_OFF_T "d", d);
|
2004-03-23 19:43:34 +08:00
|
|
|
}
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* The point of this function would be to return a string of the input data,
|
2004-06-24 19:54:11 +08:00
|
|
|
but never longer than 5 columns (+ one zero byte).
|
|
|
|
Add suffix k, M, G when suitable... */
|
2004-03-12 05:48:15 +08:00
|
|
|
static char *max5data(curl_off_t bytes, char *max5)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2008-08-13 02:49:33 +08:00
|
|
|
#define ONE_KILOBYTE CURL_OFF_T_C(1024)
|
|
|
|
#define ONE_MEGABYTE (CURL_OFF_T_C(1024) * ONE_KILOBYTE)
|
|
|
|
#define ONE_GIGABYTE (CURL_OFF_T_C(1024) * ONE_MEGABYTE)
|
|
|
|
#define ONE_TERABYTE (CURL_OFF_T_C(1024) * ONE_GIGABYTE)
|
|
|
|
#define ONE_PETABYTE (CURL_OFF_T_C(1024) * ONE_TERABYTE)
|
2000-04-09 03:28:23 +08:00
|
|
|
|
2008-08-13 02:49:33 +08:00
|
|
|
if(bytes < CURL_OFF_T_C(100000))
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%5" FMT_OFF_T, bytes);
|
2008-08-13 02:49:33 +08:00
|
|
|
|
|
|
|
else if(bytes < CURL_OFF_T_C(10000) * ONE_KILOBYTE)
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%4" FMT_OFF_T "k", bytes/ONE_KILOBYTE);
|
2008-08-13 02:49:33 +08:00
|
|
|
|
|
|
|
else if(bytes < CURL_OFF_T_C(100) * ONE_MEGABYTE)
|
2024-07-01 22:47:21 +08:00
|
|
|
/* 'XX.XM' is good as long as we are less than 100 megs */
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%2" FMT_OFF_T ".%0"
|
|
|
|
FMT_OFF_T "M", bytes/ONE_MEGABYTE,
|
2018-11-22 16:01:24 +08:00
|
|
|
(bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) );
|
2008-08-13 02:49:33 +08:00
|
|
|
|
|
|
|
else if(bytes < CURL_OFF_T_C(10000) * ONE_MEGABYTE)
|
2024-07-01 22:47:21 +08:00
|
|
|
/* 'XXXXM' is good until we are at 10000MB or above */
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%4" FMT_OFF_T "M", bytes/ONE_MEGABYTE);
|
2004-05-05 16:43:23 +08:00
|
|
|
|
2008-08-13 02:49:33 +08:00
|
|
|
else if(bytes < CURL_OFF_T_C(100) * ONE_GIGABYTE)
|
2004-05-05 16:43:23 +08:00
|
|
|
/* 10000 MB - 100 GB, we show it as XX.XG */
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%2" FMT_OFF_T ".%0"
|
|
|
|
FMT_OFF_T "G", bytes/ONE_GIGABYTE,
|
2018-11-22 16:01:24 +08:00
|
|
|
(bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) );
|
2004-05-05 16:43:23 +08:00
|
|
|
|
2008-08-13 02:49:33 +08:00
|
|
|
else if(bytes < CURL_OFF_T_C(10000) * ONE_GIGABYTE)
|
2004-05-05 16:43:23 +08:00
|
|
|
/* up to 10000GB, display without decimal: XXXXG */
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%4" FMT_OFF_T "G", bytes/ONE_GIGABYTE);
|
2004-05-05 16:43:23 +08:00
|
|
|
|
2008-08-13 02:49:33 +08:00
|
|
|
else if(bytes < CURL_OFF_T_C(10000) * ONE_TERABYTE)
|
2004-05-05 16:43:23 +08:00
|
|
|
/* up to 10000TB, display without decimal: XXXXT */
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%4" FMT_OFF_T "T", bytes/ONE_TERABYTE);
|
2008-08-13 02:49:33 +08:00
|
|
|
|
|
|
|
else
|
2004-05-05 16:43:23 +08:00
|
|
|
/* up to 10000PB, display without decimal: XXXXP */
|
2024-09-03 06:04:23 +08:00
|
|
|
msnprintf(max5, 6, "%4" FMT_OFF_T "P", bytes/ONE_PETABYTE);
|
2004-05-05 16:43:23 +08:00
|
|
|
|
2024-07-01 22:47:21 +08:00
|
|
|
/* 16384 petabytes (16 exabytes) is the maximum a 64-bit unsigned number can
|
2023-02-24 07:45:16 +08:00
|
|
|
hold, but our data type is signed so 8192PB will be the maximum. */
|
2004-01-27 20:25:37 +08:00
|
|
|
|
2000-02-15 07:15:08 +08:00
|
|
|
return max5;
|
|
|
|
}
|
2019-02-11 23:38:19 +08:00
|
|
|
#endif
|
2000-02-15 07:15:08 +08:00
|
|
|
|
2004-05-21 04:35:42 +08:00
|
|
|
/*
|
2000-02-15 07:15:08 +08:00
|
|
|
|
|
|
|
New proposed interface, 9th of February 2000:
|
|
|
|
|
|
|
|
pgrsStartNow() - sets start time
|
|
|
|
pgrsSetDownloadSize(x) - known expected download size
|
|
|
|
pgrsSetUploadSize(x) - known expected upload size
|
|
|
|
pgrsSetDownloadCounter() - amount of data currently downloaded
|
|
|
|
pgrsSetUploadCounter() - amount of data currently uploaded
|
|
|
|
pgrsUpdate() - show progress
|
|
|
|
pgrsDone() - transfer complete
|
|
|
|
|
|
|
|
*/
|
2000-06-16 21:15:36 +08:00
|
|
|
|
2021-01-18 18:56:50 +08:00
|
|
|
int Curl_pgrsDone(struct Curl_easy *data)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2012-06-11 05:39:04 +08:00
|
|
|
int rc;
|
2017-09-10 05:09:06 +08:00
|
|
|
data->progress.lastshow = 0;
|
2021-01-18 18:56:50 +08:00
|
|
|
rc = Curl_pgrsUpdate(data); /* the final (forced) update */
|
2012-06-11 05:39:04 +08:00
|
|
|
if(rc)
|
|
|
|
return rc;
|
2004-11-26 22:33:13 +08:00
|
|
|
|
2011-03-21 09:00:29 +08:00
|
|
|
if(!(data->progress.flags & PGRS_HIDE) &&
|
|
|
|
!data->progress.callback)
|
2024-07-01 22:47:21 +08:00
|
|
|
/* only output if we do not use a progress callback and we are not
|
2011-03-21 09:00:29 +08:00
|
|
|
* hidden */
|
|
|
|
fprintf(data->set.err, "\n");
|
|
|
|
|
2004-11-26 22:33:13 +08:00
|
|
|
data->progress.speeder_c = 0; /* reset the progress meter display */
|
2012-06-11 05:39:04 +08:00
|
|
|
return 0;
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
|
|
|
|
2017-06-22 01:15:46 +08:00
|
|
|
/* reset the known transfer sizes */
|
|
|
|
void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
|
2002-04-16 15:59:20 +08:00
|
|
|
{
|
2014-08-30 05:48:03 +08:00
|
|
|
Curl_pgrsSetDownloadSize(data, -1);
|
|
|
|
Curl_pgrsSetUploadSize(data, -1);
|
2002-04-16 15:59:20 +08:00
|
|
|
}
|
|
|
|
|
2017-06-27 00:51:05 +08:00
|
|
|
/*
|
2020-08-24 17:07:59 +08:00
|
|
|
*
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
* Curl_pgrsTimeWas(). Store the timestamp time at the given label.
|
2017-06-27 00:51:05 +08:00
|
|
|
*/
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
void Curl_pgrsTimeWas(struct Curl_easy *data, timerid timer,
|
|
|
|
struct curltime timestamp)
|
2000-03-02 05:59:59 +08:00
|
|
|
{
|
2019-07-31 21:30:31 +08:00
|
|
|
timediff_t *delta = NULL;
|
2011-12-20 22:05:50 +08:00
|
|
|
|
2000-03-02 05:59:59 +08:00
|
|
|
switch(timer) {
|
|
|
|
default:
|
|
|
|
case TIMER_NONE:
|
|
|
|
/* mistake filter */
|
|
|
|
break;
|
2014-05-16 02:43:32 +08:00
|
|
|
case TIMER_STARTOP:
|
|
|
|
/* This is set at the start of a transfer */
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
data->progress.t_startop = timestamp;
|
2014-05-16 02:43:32 +08:00
|
|
|
break;
|
2000-11-06 23:32:16 +08:00
|
|
|
case TIMER_STARTSINGLE:
|
2023-12-27 16:28:48 +08:00
|
|
|
/* This is set at the start of each single transfer */
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
data->progress.t_startsingle = timestamp;
|
2024-10-02 17:53:20 +08:00
|
|
|
data->progress.is_t_startransfer_set = FALSE;
|
2000-11-06 23:32:16 +08:00
|
|
|
break;
|
2023-12-27 16:28:48 +08:00
|
|
|
case TIMER_POSTQUEUE:
|
|
|
|
/* Set when the transfer starts (after potentially having been brought
|
|
|
|
back from the waiting queue). It needs to count from t_startop and not
|
|
|
|
t_startsingle since the latter is reset when a connection is brought
|
|
|
|
back from the pending queue. */
|
|
|
|
data->progress.t_postqueue =
|
|
|
|
Curl_timediff_us(timestamp, data->progress.t_startop);
|
|
|
|
break;
|
2011-12-19 21:35:20 +08:00
|
|
|
case TIMER_STARTACCEPT:
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
data->progress.t_acceptdata = timestamp;
|
2011-12-19 21:35:20 +08:00
|
|
|
break;
|
2000-03-02 05:59:59 +08:00
|
|
|
case TIMER_NAMELOOKUP:
|
2017-06-07 19:16:56 +08:00
|
|
|
delta = &data->progress.t_nslookup;
|
2000-03-02 05:59:59 +08:00
|
|
|
break;
|
|
|
|
case TIMER_CONNECT:
|
2017-06-07 19:16:56 +08:00
|
|
|
delta = &data->progress.t_connect;
|
2000-03-02 05:59:59 +08:00
|
|
|
break;
|
2008-07-03 14:56:03 +08:00
|
|
|
case TIMER_APPCONNECT:
|
2017-06-07 19:16:56 +08:00
|
|
|
delta = &data->progress.t_appconnect;
|
2008-07-03 14:56:03 +08:00
|
|
|
break;
|
2000-03-02 05:59:59 +08:00
|
|
|
case TIMER_PRETRANSFER:
|
2017-06-07 19:16:56 +08:00
|
|
|
delta = &data->progress.t_pretransfer;
|
2001-11-20 23:00:50 +08:00
|
|
|
break;
|
|
|
|
case TIMER_STARTTRANSFER:
|
2017-06-07 19:16:56 +08:00
|
|
|
delta = &data->progress.t_starttransfer;
|
2017-06-27 00:51:05 +08:00
|
|
|
/* prevent updating t_starttransfer unless:
|
2024-07-01 22:47:21 +08:00
|
|
|
* 1) this is the first time we are setting t_starttransfer
|
2017-06-27 00:51:05 +08:00
|
|
|
* 2) a redirect has occurred since the last time t_starttransfer was set
|
|
|
|
* This prevents repeated invocations of the function from incorrectly
|
|
|
|
* changing the t_starttransfer time.
|
|
|
|
*/
|
2017-06-22 01:15:46 +08:00
|
|
|
if(data->progress.is_t_startransfer_set) {
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
return;
|
2017-06-27 00:51:05 +08:00
|
|
|
}
|
|
|
|
else {
|
2024-10-02 17:53:20 +08:00
|
|
|
data->progress.is_t_startransfer_set = TRUE;
|
2017-06-27 00:51:05 +08:00
|
|
|
break;
|
|
|
|
}
|
2000-03-02 05:59:59 +08:00
|
|
|
case TIMER_POSTRANSFER:
|
2024-07-15 16:52:50 +08:00
|
|
|
delta = &data->progress.t_posttransfer;
|
2000-03-02 05:59:59 +08:00
|
|
|
break;
|
2002-04-16 15:59:20 +08:00
|
|
|
case TIMER_REDIRECT:
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
data->progress.t_redirect = Curl_timediff_us(timestamp,
|
|
|
|
data->progress.start);
|
2002-04-16 15:59:20 +08:00
|
|
|
break;
|
2000-03-02 05:59:59 +08:00
|
|
|
}
|
2017-06-07 19:16:56 +08:00
|
|
|
if(delta) {
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
timediff_t us = Curl_timediff_us(timestamp, data->progress.t_startsingle);
|
2017-10-23 18:05:49 +08:00
|
|
|
if(us < 1)
|
|
|
|
us = 1; /* make sure at least one microsecond passed */
|
2017-06-22 01:15:46 +08:00
|
|
|
*delta += us;
|
2017-06-07 19:16:56 +08:00
|
|
|
}
|
connections: introduce http/3 happy eyeballs
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
2023-02-02 00:13:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
*
|
|
|
|
* Curl_pgrsTime(). Store the current time at the given label. This fetches a
|
|
|
|
* fresh "now" and returns it.
|
|
|
|
*
|
|
|
|
* @unittest: 1399
|
|
|
|
*/
|
|
|
|
struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer)
|
|
|
|
{
|
|
|
|
struct curltime now = Curl_now();
|
|
|
|
|
|
|
|
Curl_pgrsTimeWas(data, timer, now);
|
2020-08-24 17:07:59 +08:00
|
|
|
return now;
|
2000-03-02 05:59:59 +08:00
|
|
|
}
|
|
|
|
|
2016-06-21 21:47:12 +08:00
|
|
|
void Curl_pgrsStartNow(struct Curl_easy *data)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2001-04-17 23:00:17 +08:00
|
|
|
data->progress.speeder_c = 0; /* reset the progress meter display */
|
2017-10-25 17:59:43 +08:00
|
|
|
data->progress.start = Curl_now();
|
2024-10-02 17:53:20 +08:00
|
|
|
data->progress.is_t_startransfer_set = FALSE;
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.ul.limit.start = data->progress.start;
|
|
|
|
data->progress.dl.limit.start = data->progress.start;
|
|
|
|
data->progress.ul.limit.start_size = 0;
|
|
|
|
data->progress.dl.limit.start_size = 0;
|
|
|
|
data->progress.dl.cur_size = 0;
|
|
|
|
data->progress.ul.cur_size = 0;
|
2011-09-23 04:34:54 +08:00
|
|
|
/* clear all bits except HIDE and HEADERS_OUT */
|
|
|
|
data->progress.flags &= PGRS_HIDE|PGRS_HEADERS_OUT;
|
2018-03-15 23:43:00 +08:00
|
|
|
Curl_ratelimit(data, data->progress.start);
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
|
|
|
|
2016-08-17 02:32:02 +08:00
|
|
|
/*
|
2018-03-10 21:07:38 +08:00
|
|
|
* This is used to handle speed limits, calculating how many milliseconds to
|
2024-07-01 22:47:21 +08:00
|
|
|
* wait until we are back under the speed limit, if needed.
|
2016-08-17 02:32:02 +08:00
|
|
|
*
|
|
|
|
* The way it works is by having a "starting point" (time & amount of data
|
2017-03-26 23:02:22 +08:00
|
|
|
* transferred by then) used in the speed computation, to be used instead of
|
2024-07-01 22:47:21 +08:00
|
|
|
* the start of the transfer. This starting point is regularly moved as
|
2017-03-26 23:02:22 +08:00
|
|
|
* transfer goes on, to keep getting accurate values (instead of average over
|
|
|
|
* the entire transfer).
|
2016-08-17 02:32:02 +08:00
|
|
|
*
|
2017-03-26 23:02:22 +08:00
|
|
|
* This function takes the current amount of data transferred, the amount at
|
|
|
|
* the starting point, the limit (in bytes/s), the time of the starting point
|
|
|
|
* and the current time.
|
2016-08-17 02:32:02 +08:00
|
|
|
*
|
2018-03-10 21:07:38 +08:00
|
|
|
* Returns 0 if no waiting is needed or when no waiting is needed but the
|
|
|
|
* starting point should be reset (to current); or the number of milliseconds
|
|
|
|
* to wait to get back under the speed limit.
|
2016-08-17 02:32:02 +08:00
|
|
|
*/
|
2024-08-01 19:05:49 +08:00
|
|
|
timediff_t Curl_pgrsLimitWaitTime(struct pgrs_dir *d,
|
|
|
|
curl_off_t speed_limit,
|
2018-03-10 21:07:38 +08:00
|
|
|
struct curltime now)
|
2016-08-17 02:32:02 +08:00
|
|
|
{
|
2024-08-01 19:05:49 +08:00
|
|
|
curl_off_t size = d->cur_size - d->limit.start_size;
|
2019-07-31 21:30:31 +08:00
|
|
|
timediff_t minimum;
|
|
|
|
timediff_t actual;
|
2016-08-17 02:32:02 +08:00
|
|
|
|
2024-08-01 19:05:49 +08:00
|
|
|
if(!speed_limit || !size)
|
2018-03-10 21:07:38 +08:00
|
|
|
return 0;
|
|
|
|
|
2018-03-15 23:43:00 +08:00
|
|
|
/*
|
|
|
|
* 'minimum' is the number of milliseconds 'size' should take to download to
|
|
|
|
* stay below 'limit'.
|
|
|
|
*/
|
2018-03-10 21:07:38 +08:00
|
|
|
if(size < CURL_OFF_T_MAX/1000)
|
2024-08-01 19:05:49 +08:00
|
|
|
minimum = (timediff_t) (CURL_OFF_T_C(1000) * size / speed_limit);
|
2018-03-10 21:07:38 +08:00
|
|
|
else {
|
2024-08-01 19:05:49 +08:00
|
|
|
minimum = (timediff_t) (size / speed_limit);
|
2019-07-31 21:30:31 +08:00
|
|
|
if(minimum < TIMEDIFF_T_MAX/1000)
|
2018-03-13 04:26:31 +08:00
|
|
|
minimum *= 1000;
|
2018-03-10 21:07:38 +08:00
|
|
|
else
|
2019-07-31 21:30:31 +08:00
|
|
|
minimum = TIMEDIFF_T_MAX;
|
2018-03-10 21:07:38 +08:00
|
|
|
}
|
2016-08-17 02:32:02 +08:00
|
|
|
|
2018-03-15 23:43:00 +08:00
|
|
|
/*
|
|
|
|
* 'actual' is the time in milliseconds it took to actually download the
|
|
|
|
* last 'size' bytes.
|
|
|
|
*/
|
2024-08-01 19:05:49 +08:00
|
|
|
actual = Curl_timediff_ceil(now, d->limit.start);
|
2018-03-15 23:43:00 +08:00
|
|
|
if(actual < minimum) {
|
|
|
|
/* if it downloaded the data faster than the limit, make it wait the
|
|
|
|
difference */
|
2018-03-10 21:07:38 +08:00
|
|
|
return (minimum - actual);
|
2018-03-15 23:43:00 +08:00
|
|
|
}
|
2017-03-10 21:28:37 +08:00
|
|
|
|
|
|
|
return 0;
|
2016-08-17 02:32:02 +08:00
|
|
|
}
|
|
|
|
|
2018-03-15 23:43:00 +08:00
|
|
|
/*
|
|
|
|
* Set the number of downloaded bytes so far.
|
|
|
|
*/
|
2023-09-23 17:20:00 +08:00
|
|
|
CURLcode Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.dl.cur_size = size;
|
2023-09-23 17:20:00 +08:00
|
|
|
return CURLE_OK;
|
2018-03-15 23:43:00 +08:00
|
|
|
}
|
2016-08-17 02:32:02 +08:00
|
|
|
|
2018-03-15 23:43:00 +08:00
|
|
|
/*
|
|
|
|
* Update the timestamp and sizestamp to use for rate limit calculations.
|
|
|
|
*/
|
|
|
|
void Curl_ratelimit(struct Curl_easy *data, struct curltime now)
|
|
|
|
{
|
2024-07-01 22:47:21 +08:00
|
|
|
/* do not set a new stamp unless the time since last update is long enough */
|
2021-03-26 20:08:44 +08:00
|
|
|
if(data->set.max_recv_speed) {
|
2024-08-01 19:05:49 +08:00
|
|
|
if(Curl_timediff(now, data->progress.dl.limit.start) >=
|
2018-03-15 23:43:00 +08:00
|
|
|
MIN_RATE_LIMIT_PERIOD) {
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.dl.limit.start = now;
|
|
|
|
data->progress.dl.limit.start_size = data->progress.dl.cur_size;
|
2018-03-15 23:43:00 +08:00
|
|
|
}
|
|
|
|
}
|
2021-03-26 20:08:44 +08:00
|
|
|
if(data->set.max_send_speed) {
|
2024-08-01 19:05:49 +08:00
|
|
|
if(Curl_timediff(now, data->progress.ul.limit.start) >=
|
2018-03-15 23:43:00 +08:00
|
|
|
MIN_RATE_LIMIT_PERIOD) {
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.ul.limit.start = now;
|
|
|
|
data->progress.ul.limit.start_size = data->progress.ul.cur_size;
|
2018-03-15 23:43:00 +08:00
|
|
|
}
|
2016-08-17 02:32:02 +08:00
|
|
|
}
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
|
|
|
|
2018-03-15 23:43:00 +08:00
|
|
|
/*
|
|
|
|
* Set the number of uploaded bytes so far.
|
|
|
|
*/
|
2016-06-21 21:47:12 +08:00
|
|
|
void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.ul.cur_size = size;
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
|
|
|
|
2016-06-21 21:47:12 +08:00
|
|
|
void Curl_pgrsSetDownloadSize(struct Curl_easy *data, curl_off_t size)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2014-08-30 05:48:03 +08:00
|
|
|
if(size >= 0) {
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.dl.total_size = size;
|
2000-02-16 08:00:27 +08:00
|
|
|
data->progress.flags |= PGRS_DL_SIZE_KNOWN;
|
2014-08-30 05:48:03 +08:00
|
|
|
}
|
|
|
|
else {
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.dl.total_size = 0;
|
2003-05-14 14:31:00 +08:00
|
|
|
data->progress.flags &= ~PGRS_DL_SIZE_KNOWN;
|
2014-08-30 05:48:03 +08:00
|
|
|
}
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
|
|
|
|
2016-06-21 21:47:12 +08:00
|
|
|
void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2014-08-30 05:48:03 +08:00
|
|
|
if(size >= 0) {
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.ul.total_size = size;
|
2000-02-16 08:00:27 +08:00
|
|
|
data->progress.flags |= PGRS_UL_SIZE_KNOWN;
|
2014-08-30 05:48:03 +08:00
|
|
|
}
|
|
|
|
else {
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.ul.total_size = 0;
|
2003-05-14 14:31:00 +08:00
|
|
|
data->progress.flags &= ~PGRS_UL_SIZE_KNOWN;
|
2014-08-30 05:48:03 +08:00
|
|
|
}
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
|
|
|
|
TLS: TLSv1.3 earlydata support for curl
Based on #14135, implement TLSv1.3 earlydata support for the curl
command line, libcurl and its implementation in GnuTLS.
If a known TLS session announces early data support, and the feature is
enabled *and* it is not a "connect-only" transfer, delay the TLS
handshake until the first request is being sent.
- Add --tls-earldata as new boolean command line option for curl.
- Add CURLSSLOPT_EARLYDATA to libcurl to enable use of the feature.
- Add CURLINFO_EARLYDATA_SENT_T to libcurl, reporting the amount of
bytes sent and accepted/rejected by the server.
Implementation details:
- store the ALPN protocol selected at the SSL session.
- When reusing the session and enabling earlydata, use exactly
that ALPN protocol for negoptiation with the server. When the
sessions ALPN does not match the connections ALPN, earlydata
will not be enabled.
- Check that the server selected the correct ALPN protocol for
an earlydata connect. If the server does not confirm or reports
something different, the connect fails.
- HTTP/2: delay sending the initial SETTINGS frames during connect,
if not connect-only.
Verification:
- add test_02_32 to verify earlydata GET with nghttpx.
- add test_07_70 to verify earlydata PUT with nghttpx.
- add support in 'hx-download', 'hx-upload' clients for the feature
Assisted-by: ad-chaos on github
Closes #15211
2024-10-09 20:46:32 +08:00
|
|
|
void Curl_pgrsEarlyData(struct Curl_easy *data, curl_off_t sent)
|
|
|
|
{
|
|
|
|
data->progress.earlydata_sent = sent;
|
|
|
|
}
|
|
|
|
|
2021-05-08 19:10:06 +08:00
|
|
|
/* returns the average speed in bytes / second */
|
|
|
|
static curl_off_t trspeed(curl_off_t size, /* number of bytes */
|
|
|
|
curl_off_t us) /* microseconds */
|
2021-05-08 18:28:38 +08:00
|
|
|
{
|
2021-05-08 19:10:06 +08:00
|
|
|
if(us < 1)
|
|
|
|
return size * 1000000;
|
2021-08-31 20:09:28 +08:00
|
|
|
else if(size < CURL_OFF_T_MAX/1000000)
|
|
|
|
return (size * 1000000) / us;
|
|
|
|
else if(us >= 1000000)
|
|
|
|
return size / (us / 1000000);
|
|
|
|
else
|
|
|
|
return CURL_OFF_T_MAX;
|
2021-05-08 18:28:38 +08:00
|
|
|
}
|
|
|
|
|
2024-07-01 22:47:21 +08:00
|
|
|
/* returns TRUE if it is time to show the progress meter */
|
2021-01-18 18:56:50 +08:00
|
|
|
static bool progress_calc(struct Curl_easy *data, struct curltime now)
|
2000-02-15 07:15:08 +08:00
|
|
|
{
|
2019-07-19 05:23:35 +08:00
|
|
|
bool timetoshow = FALSE;
|
2021-05-08 19:14:42 +08:00
|
|
|
struct Progress * const p = &data->progress;
|
2001-04-18 15:25:11 +08:00
|
|
|
|
2021-05-08 18:28:38 +08:00
|
|
|
/* The time spent so far (from the start) in microseconds */
|
2021-05-08 19:14:42 +08:00
|
|
|
p->timespent = Curl_timediff_us(now, p->start);
|
2024-08-01 19:05:49 +08:00
|
|
|
p->dl.speed = trspeed(p->dl.cur_size, p->timespent);
|
|
|
|
p->ul.speed = trspeed(p->ul.cur_size, p->timespent);
|
2000-02-15 07:15:08 +08:00
|
|
|
|
2007-03-19 20:02:33 +08:00
|
|
|
/* Calculations done at most once a second, unless end is reached */
|
2021-05-08 19:14:42 +08:00
|
|
|
if(p->lastshow != now.tv_sec) {
|
2018-06-03 04:52:56 +08:00
|
|
|
int countindex; /* amount of seconds stored in the speeder array */
|
2021-05-08 19:14:42 +08:00
|
|
|
int nowindex = p->speeder_c% CURR_TIME;
|
|
|
|
p->lastshow = now.tv_sec;
|
2019-07-19 05:23:35 +08:00
|
|
|
timetoshow = TRUE;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
2017-06-09 17:16:18 +08:00
|
|
|
/* Let's do the "current speed" thing, with the dl + ul speeds
|
|
|
|
combined. Store the speed at entry 'nowindex'. */
|
2024-08-01 19:05:49 +08:00
|
|
|
p->speeder[ nowindex ] = p->dl.cur_size + p->ul.cur_size;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
|
|
|
/* remember the exact time for this moment */
|
2021-05-08 19:14:42 +08:00
|
|
|
p->speeder_time [ nowindex ] = now;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
|
|
|
/* advance our speeder_c counter, which is increased every time we get
|
|
|
|
here and we expect it to never wrap as 2^32 is a lot of seconds! */
|
2021-05-08 19:14:42 +08:00
|
|
|
p->speeder_c++;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
|
|
|
/* figure out how many index entries of data we have stored in our speeder
|
|
|
|
array. With N_ENTRIES filled in, we have about N_ENTRIES-1 seconds of
|
|
|
|
transfer. Imagine, after one second we have filled in two entries,
|
2024-07-01 22:47:21 +08:00
|
|
|
after two seconds we have filled in three entries etc. */
|
2024-09-18 21:29:51 +08:00
|
|
|
countindex = ((p->speeder_c >= CURR_TIME) ? CURR_TIME : p->speeder_c) - 1;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
2024-07-01 22:47:21 +08:00
|
|
|
/* first of all, we do not do this if there is no counted seconds yet */
|
2007-03-19 20:02:33 +08:00
|
|
|
if(countindex) {
|
2018-06-03 04:52:56 +08:00
|
|
|
int checkindex;
|
2017-10-23 18:05:49 +08:00
|
|
|
timediff_t span_ms;
|
2021-05-08 19:14:42 +08:00
|
|
|
curl_off_t amount;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
|
|
|
/* Get the index position to compare with the 'nowindex' position.
|
|
|
|
Get the oldest entry possible. While we have less than CURR_TIME
|
|
|
|
entries, the first entry will remain the oldest. */
|
2024-09-18 21:29:51 +08:00
|
|
|
checkindex = (p->speeder_c >= CURR_TIME) ? p->speeder_c%CURR_TIME : 0;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
|
|
|
/* Figure out the exact time for the time span */
|
2021-05-08 19:14:42 +08:00
|
|
|
span_ms = Curl_timediff(now, p->speeder_time[checkindex]);
|
2007-03-19 20:02:33 +08:00
|
|
|
if(0 == span_ms)
|
2017-09-10 05:09:06 +08:00
|
|
|
span_ms = 1; /* at least one millisecond MUST have passed */
|
2007-03-19 20:02:33 +08:00
|
|
|
|
|
|
|
/* Calculate the average speed the last 'span_ms' milliseconds */
|
2021-05-08 19:14:42 +08:00
|
|
|
amount = p->speeder[nowindex]- p->speeder[checkindex];
|
|
|
|
|
|
|
|
if(amount > CURL_OFF_T_C(4294967) /* 0xffffffff/1000 */)
|
|
|
|
/* the 'amount' value is bigger than would fit in 32 bits if
|
|
|
|
multiplied with 1000, so we use the double math for this */
|
|
|
|
p->current_speed = (curl_off_t)
|
|
|
|
((double)amount/((double)span_ms/1000.0));
|
|
|
|
else
|
|
|
|
/* the 'amount' value is small enough to fit within 32 bits even
|
|
|
|
when multiplied with 1000 */
|
|
|
|
p->current_speed = amount*CURL_OFF_T_C(1000)/span_ms;
|
2007-03-19 20:02:33 +08:00
|
|
|
}
|
|
|
|
else
|
2017-06-09 17:16:18 +08:00
|
|
|
/* the first second we use the average */
|
2024-08-01 19:05:49 +08:00
|
|
|
p->current_speed = p->ul.speed + p->dl.speed;
|
2007-03-19 20:02:33 +08:00
|
|
|
|
|
|
|
} /* Calculations end */
|
2019-07-19 05:23:35 +08:00
|
|
|
return timetoshow;
|
2019-02-11 23:38:19 +08:00
|
|
|
}
|
2019-05-23 05:15:34 +08:00
|
|
|
|
2019-02-11 23:38:19 +08:00
|
|
|
#ifndef CURL_DISABLE_PROGRESS_METER
|
2024-08-01 19:05:49 +08:00
|
|
|
|
|
|
|
struct pgrs_estimate {
|
|
|
|
curl_off_t secs;
|
|
|
|
curl_off_t percent;
|
|
|
|
};
|
|
|
|
|
|
|
|
static curl_off_t pgrs_est_percent(curl_off_t total, curl_off_t cur)
|
|
|
|
{
|
|
|
|
if(total > CURL_OFF_T_C(10000))
|
|
|
|
return cur / (total/CURL_OFF_T_C(100));
|
|
|
|
else if(total > CURL_OFF_T_C(0))
|
|
|
|
return (cur*100) / total;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void pgrs_estimates(struct pgrs_dir *d,
|
|
|
|
bool total_known,
|
|
|
|
struct pgrs_estimate *est)
|
|
|
|
{
|
|
|
|
est->secs = 0;
|
|
|
|
est->percent = 0;
|
|
|
|
if(total_known && (d->speed > CURL_OFF_T_C(0))) {
|
|
|
|
est->secs = d->total_size / d->speed;
|
|
|
|
est->percent = pgrs_est_percent(d->total_size, d->cur_size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-18 18:56:50 +08:00
|
|
|
static void progress_meter(struct Curl_easy *data)
|
2019-02-11 23:38:19 +08:00
|
|
|
{
|
2024-08-01 19:05:49 +08:00
|
|
|
struct Progress *p = &data->progress;
|
2019-07-19 05:23:35 +08:00
|
|
|
char max5[6][10];
|
2024-08-01 19:05:49 +08:00
|
|
|
struct pgrs_estimate dl_estm;
|
|
|
|
struct pgrs_estimate ul_estm;
|
|
|
|
struct pgrs_estimate total_estm;
|
|
|
|
curl_off_t total_cur_size;
|
|
|
|
curl_off_t total_expected_size;
|
2019-07-19 05:23:35 +08:00
|
|
|
char time_left[10];
|
|
|
|
char time_total[10];
|
|
|
|
char time_spent[10];
|
2024-08-01 19:05:49 +08:00
|
|
|
curl_off_t cur_secs = (curl_off_t)p->timespent/1000000; /* seconds */
|
2019-07-19 05:23:35 +08:00
|
|
|
|
2024-08-01 19:05:49 +08:00
|
|
|
if(!(p->flags & PGRS_HEADERS_OUT)) {
|
2019-07-19 05:23:35 +08:00
|
|
|
if(data->state.resume_from) {
|
2007-03-19 20:02:33 +08:00
|
|
|
fprintf(data->set.err,
|
2024-09-03 06:04:23 +08:00
|
|
|
"** Resuming transfer from byte position %" FMT_OFF_T "\n",
|
|
|
|
data->state.resume_from);
|
2007-03-19 20:02:33 +08:00
|
|
|
}
|
2019-07-19 05:23:35 +08:00
|
|
|
fprintf(data->set.err,
|
|
|
|
" %% Total %% Received %% Xferd Average Speed "
|
|
|
|
"Time Time Time Current\n"
|
|
|
|
" Dload Upload "
|
|
|
|
"Total Spent Left Speed\n");
|
2024-08-01 19:05:49 +08:00
|
|
|
p->flags |= PGRS_HEADERS_OUT; /* headers are shown */
|
2019-07-19 05:23:35 +08:00
|
|
|
}
|
2007-03-19 20:02:33 +08:00
|
|
|
|
2024-08-01 19:05:49 +08:00
|
|
|
/* Figure out the estimated time of arrival for upload and download */
|
|
|
|
pgrs_estimates(&p->ul, (p->flags & PGRS_UL_SIZE_KNOWN), &ul_estm);
|
|
|
|
pgrs_estimates(&p->dl, (p->flags & PGRS_DL_SIZE_KNOWN), &dl_estm);
|
2019-07-19 05:23:35 +08:00
|
|
|
|
2024-08-01 19:05:49 +08:00
|
|
|
/* Since both happen at the same time, total expected duration is max. */
|
|
|
|
total_estm.secs = CURLMAX(ul_estm.secs, dl_estm.secs);
|
2019-07-19 05:23:35 +08:00
|
|
|
/* create the three time strings */
|
2024-09-18 21:29:51 +08:00
|
|
|
time2str(time_left, total_estm.secs > 0 ? (total_estm.secs - cur_secs) : 0);
|
2024-08-01 19:05:49 +08:00
|
|
|
time2str(time_total, total_estm.secs);
|
|
|
|
time2str(time_spent, cur_secs);
|
2019-07-19 05:23:35 +08:00
|
|
|
|
|
|
|
/* Get the total amount of data expected to get transferred */
|
2024-08-01 19:05:49 +08:00
|
|
|
total_expected_size =
|
2024-09-18 21:29:51 +08:00
|
|
|
((p->flags & PGRS_UL_SIZE_KNOWN) ? p->ul.total_size : p->ul.cur_size) +
|
|
|
|
((p->flags & PGRS_DL_SIZE_KNOWN) ? p->dl.total_size : p->dl.cur_size);
|
2019-07-19 05:23:35 +08:00
|
|
|
|
|
|
|
/* We have transferred this much so far */
|
2024-08-01 19:05:49 +08:00
|
|
|
total_cur_size = p->dl.cur_size + p->ul.cur_size;
|
2019-07-19 05:23:35 +08:00
|
|
|
|
|
|
|
/* Get the percentage of data transferred so far */
|
2024-08-01 19:05:49 +08:00
|
|
|
total_estm.percent = pgrs_est_percent(total_expected_size, total_cur_size);
|
2019-07-19 05:23:35 +08:00
|
|
|
|
|
|
|
fprintf(data->set.err,
|
|
|
|
"\r"
|
2024-09-03 06:04:23 +08:00
|
|
|
"%3" FMT_OFF_T " %s "
|
|
|
|
"%3" FMT_OFF_T " %s "
|
|
|
|
"%3" FMT_OFF_T " %s %s %s %s %s %s %s",
|
2024-08-01 19:05:49 +08:00
|
|
|
total_estm.percent, /* 3 letters */ /* total % */
|
|
|
|
max5data(total_expected_size, max5[2]), /* total size */
|
|
|
|
dl_estm.percent, /* 3 letters */ /* rcvd % */
|
|
|
|
max5data(p->dl.cur_size, max5[0]), /* rcvd size */
|
|
|
|
ul_estm.percent, /* 3 letters */ /* xfer % */
|
|
|
|
max5data(p->ul.cur_size, max5[1]), /* xfer size */
|
|
|
|
max5data(p->dl.speed, max5[3]), /* avrg dl speed */
|
|
|
|
max5data(p->ul.speed, max5[4]), /* avrg ul speed */
|
2019-07-19 05:23:35 +08:00
|
|
|
time_total, /* 8 letters */ /* total time */
|
|
|
|
time_spent, /* 8 letters */ /* time spent */
|
|
|
|
time_left, /* 8 letters */ /* time left */
|
2024-08-01 19:05:49 +08:00
|
|
|
max5data(p->current_speed, max5[5])
|
2019-07-19 05:23:35 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
/* we flush the output stream to make it appear as soon as possible */
|
|
|
|
fflush(data->set.err);
|
2019-02-11 23:38:19 +08:00
|
|
|
}
|
|
|
|
#else
|
|
|
|
/* progress bar disabled */
|
2019-07-19 05:23:35 +08:00
|
|
|
#define progress_meter(x) Curl_nop_stmt
|
2019-02-11 23:38:19 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Curl_pgrsUpdate() returns 0 for success or the value returned by the
|
|
|
|
* progress callback!
|
|
|
|
*/
|
2024-07-20 06:44:27 +08:00
|
|
|
static int pgrsupdate(struct Curl_easy *data, bool showprogress)
|
2019-02-11 23:38:19 +08:00
|
|
|
{
|
|
|
|
if(!(data->progress.flags & PGRS_HIDE)) {
|
|
|
|
if(data->set.fxferinfo) {
|
|
|
|
int result;
|
2024-07-01 22:47:21 +08:00
|
|
|
/* There is a callback set, call that */
|
2024-10-02 17:53:20 +08:00
|
|
|
Curl_set_in_callback(data, TRUE);
|
2019-02-11 23:38:19 +08:00
|
|
|
result = data->set.fxferinfo(data->set.progress_client,
|
2024-08-01 19:05:49 +08:00
|
|
|
data->progress.dl.total_size,
|
|
|
|
data->progress.dl.cur_size,
|
|
|
|
data->progress.ul.total_size,
|
|
|
|
data->progress.ul.cur_size);
|
2024-10-02 17:53:20 +08:00
|
|
|
Curl_set_in_callback(data, FALSE);
|
2019-11-26 16:13:11 +08:00
|
|
|
if(result != CURL_PROGRESSFUNC_CONTINUE) {
|
|
|
|
if(result)
|
|
|
|
failf(data, "Callback aborted");
|
|
|
|
return result;
|
|
|
|
}
|
2019-02-11 23:38:19 +08:00
|
|
|
}
|
2019-11-26 16:13:11 +08:00
|
|
|
else if(data->set.fprogress) {
|
2019-02-11 23:38:19 +08:00
|
|
|
int result;
|
|
|
|
/* The older deprecated callback is set, call that */
|
2024-10-02 17:53:20 +08:00
|
|
|
Curl_set_in_callback(data, TRUE);
|
2019-02-11 23:38:19 +08:00
|
|
|
result = data->set.fprogress(data->set.progress_client,
|
2024-08-01 19:05:49 +08:00
|
|
|
(double)data->progress.dl.total_size,
|
|
|
|
(double)data->progress.dl.cur_size,
|
|
|
|
(double)data->progress.ul.total_size,
|
|
|
|
(double)data->progress.ul.cur_size);
|
2024-10-02 17:53:20 +08:00
|
|
|
Curl_set_in_callback(data, FALSE);
|
2019-11-26 16:13:11 +08:00
|
|
|
if(result != CURL_PROGRESSFUNC_CONTINUE) {
|
|
|
|
if(result)
|
|
|
|
failf(data, "Callback aborted");
|
|
|
|
return result;
|
|
|
|
}
|
2019-02-11 23:38:19 +08:00
|
|
|
}
|
2019-07-19 05:23:35 +08:00
|
|
|
|
|
|
|
if(showprogress)
|
2021-01-18 18:56:50 +08:00
|
|
|
progress_meter(data);
|
2019-02-11 23:38:19 +08:00
|
|
|
}
|
2001-08-21 14:29:56 +08:00
|
|
|
|
2000-09-26 05:49:37 +08:00
|
|
|
return 0;
|
2000-02-15 07:15:08 +08:00
|
|
|
}
|
2024-07-20 06:44:27 +08:00
|
|
|
|
|
|
|
int Curl_pgrsUpdate(struct Curl_easy *data)
|
|
|
|
{
|
|
|
|
struct curltime now = Curl_now(); /* what time is it */
|
|
|
|
bool showprogress = progress_calc(data, now);
|
|
|
|
return pgrsupdate(data, showprogress);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Update all progress, do not do progress meter/callbacks.
|
|
|
|
*/
|
|
|
|
void Curl_pgrsUpdate_nometer(struct Curl_easy *data)
|
|
|
|
{
|
|
|
|
struct curltime now = Curl_now(); /* what time is it */
|
|
|
|
(void)progress_calc(data, now);
|
|
|
|
}
|