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:
Bob Richmond
2010-03-24 17:02:17 +01:00
committed by Daniel Stenberg
parent c245a8f92e
commit 05632d5db9
3 changed files with 28 additions and 14 deletions

View File

@@ -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.