fix: timeout after last data chunk was handled
Bob Richmond: There's an annoying situation where libcurl will read new HTTP response data from a socket, then check if it's a timeout if one is set. If the last packet received constitutes the end of the response body, libcurl still treats it as a timeout condition and reports a message like: "Operation timed out after 3000 milliseconds with 876 out of 876 bytes received" It should only a timeout if the timer lapsed and we DIDN'T receive the end of the response body yet.
This commit is contained in:

committed by
Daniel Stenberg

parent
c245a8f92e
commit
05632d5db9
@@ -1060,21 +1060,22 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
if(data->set.timeout &&
|
||||
(Curl_tvdiff(k->now, k->start) >= data->set.timeout)) {
|
||||
if(k->size != -1) {
|
||||
failf(data, "Operation timed out after %ld milliseconds with %"
|
||||
FORMAT_OFF_T " out of %" FORMAT_OFF_T " bytes received",
|
||||
Curl_tvdiff(k->now, k->start), k->bytecount, k->size);
|
||||
} else {
|
||||
failf(data, "Operation timed out after %ld milliseconds with %"
|
||||
FORMAT_OFF_T " bytes received",
|
||||
Curl_tvdiff(k->now, k->start), k->bytecount);
|
||||
if(k->keepon) {
|
||||
if(data->set.timeout &&
|
||||
(Curl_tvdiff(k->now, k->start) >= data->set.timeout)) {
|
||||
if(k->size != -1) {
|
||||
failf(data, "Operation timed out after %ld milliseconds with %"
|
||||
FORMAT_OFF_T " out of %" FORMAT_OFF_T " bytes received",
|
||||
Curl_tvdiff(k->now, k->start), k->bytecount, k->size);
|
||||
} else {
|
||||
failf(data, "Operation timed out after %ld milliseconds with %"
|
||||
FORMAT_OFF_T " bytes received",
|
||||
Curl_tvdiff(k->now, k->start), k->bytecount);
|
||||
}
|
||||
return CURLE_OPERATION_TIMEDOUT;
|
||||
}
|
||||
return CURLE_OPERATION_TIMEDOUT;
|
||||
}
|
||||
|
||||
if(!k->keepon) {
|
||||
else {
|
||||
/*
|
||||
* The transfer has been performed. Just make some general checks before
|
||||
* returning.
|
||||
|
Reference in New Issue
Block a user