forked from curl/curl
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
progress: prevent resetting t_starttransfer
Prevent `Curl_pgrsTime` from modifying `t_starttransfer` when invoked with `TIMER_STARTTRANSFER` more than once during a single request. When a redirect occurs, this is considered a new request and `t_starttransfer` can be updated to reflect the `t_starttransfer` time of the redirect request. Closes curl#1616 Bug: curl#1602 (comment)
- Loading branch information
Showing
5 changed files
with
142 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
<testcase> | ||
<info> | ||
<keywords> | ||
unittest | ||
Curl_pgrsTime | ||
</keywords> | ||
</info> | ||
|
||
# | ||
# Client-side | ||
<client> | ||
<server> | ||
none | ||
</server> | ||
<features> | ||
unittest | ||
</features> | ||
<name> | ||
Curl_pgrsTime unit tests | ||
</name> | ||
<tool> | ||
unit1399 | ||
</tool> | ||
</client> | ||
|
||
</testcase> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/*************************************************************************** | ||
* _ _ ____ _ | ||
* Project ___| | | | _ \| | | ||
* / __| | | | |_) | | | ||
* | (__| |_| | _ <| |___ | ||
* \___|\___/|_| \_\_____| | ||
* | ||
* Copyright (C) 1998 - 2017, Daniel Stenberg, <[email protected]>, et al. | ||
* | ||
* This software is licensed as described in the file COPYING, which | ||
* you should have received as part of this distribution. The terms | ||
* are also available at https://curl.haxx.se/docs/copyright.html. | ||
* | ||
* 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 | ||
* furnished to do so, under the terms of the COPYING file. | ||
* | ||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
* KIND, either express or implied. | ||
* | ||
***************************************************************************/ | ||
#include "curlcheck.h" | ||
|
||
#include "urldata.h" | ||
#include "progress.h" | ||
|
||
static int usec_magnitude = 1000000; | ||
|
||
static bool unit_setup(void) | ||
{ | ||
return CURLE_OK; | ||
} | ||
|
||
static void unit_stop(void) | ||
{ | ||
|
||
} | ||
|
||
static bool usec_matches_seconds(time_t time_usec, int expected_seconds) | ||
{ | ||
int time_sec = (int)(time_usec / usec_magnitude); | ||
return time_sec == expected_seconds; | ||
} | ||
|
||
UNITTEST_START | ||
struct Curl_easy data; | ||
struct timeval now = Curl_tvnow(); | ||
|
||
data.progress.t_starttransfer = 0; | ||
data.progress.t_redirect = 0; | ||
|
||
/* | ||
* Set the startsingle time to a second ago. This time is used by | ||
* Curl_pgrsTime to calculate how much time the events takes. | ||
* t_starttransfer should be updated to reflect the difference from this time | ||
* when `Curl_pgrsTime is invoked. | ||
*/ | ||
data.progress.t_startsingle.tv_sec = now.tv_sec - 1; | ||
data.progress.t_startsingle.tv_usec = now.tv_usec; | ||
|
||
Curl_pgrsTime(&data, TIMER_STARTTRANSFER); | ||
|
||
fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 1), | ||
"about 1 second should have passed"); | ||
|
||
/* | ||
* Update the startsingle time to a second ago to simulate another second has | ||
* passed. | ||
* Now t_starttransfer should not be changed, as t_starttransfer has already | ||
* occurred and another invocation of `Curl_pgrsTime` for TIMER_STARTTRANSFER | ||
* is superfluous. | ||
*/ | ||
data.progress.t_startsingle.tv_sec = now.tv_sec - 2; | ||
data.progress.t_startsingle.tv_usec = now.tv_usec; | ||
|
||
Curl_pgrsTime(&data, TIMER_STARTTRANSFER); | ||
|
||
fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 1), | ||
"about 1 second should have passed"); | ||
|
||
/* | ||
* Simulate what happens after a redirect has occurred. | ||
* | ||
* Since the value of t_starttransfer is set to the value from the first | ||
* request, it should be updated when a transfer occurs such that | ||
* t_starttransfer is the starttransfer time of the redirect request. | ||
*/ | ||
data.progress.t_startsingle.tv_sec = now.tv_sec - 3; | ||
data.progress.t_startsingle.tv_usec = now.tv_usec; | ||
data.progress.t_redirect = (now.tv_sec - 2) * usec_magnitude; | ||
|
||
Curl_pgrsTime(&data, TIMER_STARTTRANSFER); | ||
|
||
fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 3), | ||
"about 3 second should have passed"); | ||
UNITTEST_STOP |