From 82412f218fe6809288c718c5b43b9675eb2856f5 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 3 Jul 2008 08:47:53 +0000 Subject: [PATCH] Phil Blundell provided a fix for libcurl's treatment of unexpected 1xx response codes. Previously libcurl would hang on such occurances. I added test case 1033 to verify. --- CHANGES | 4 +++ RELEASE-NOTES | 3 ++- lib/http.c | 2 +- lib/transfer.c | 4 +-- tests/data/Makefile.am | 2 +- tests/data/test1033 | 60 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 tests/data/test1033 diff --git a/CHANGES b/CHANGES index b28bae1ef..43c39fdaa 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,10 @@ Changelog Daniel Stenberg (3 Jul 2008) +- Phil Blundell provided a fix for libcurl's treatment of unexpected 1xx + response codes. Previously libcurl would hang on such occurances. I added + test case 1033 to verify. + - Introcuding a new timestamp for curl_easy_getinfo(): CURLINFO_APPCONNECT_TIME. This is set with the "application layer" handshake/connection is completed. Which typically is SSL, TLS or SSH and by diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 0b87536fe..37c990ffb 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -29,6 +29,7 @@ This release includes the following bugfixes: o range requests with --head are now done correctly o fallback to gettimeofday when monotonic clock is unavailable at run-time o range numbers could be made to wrongly get output as signed + o unexpected 1xx responses hung transfers This release includes the following known bugs: @@ -48,7 +49,7 @@ advice from friends like these: Lenny Rachitsky, Axel Tillequin, Arnaud Ebalard, Yang Tse, Dan Fandrich, Rob Crittenden, Dengminwen, Christopher Palow, Hans-Jurgen May, Phil Pellouchoud, Eduard Bloch, John Lightsey, Stephen Collyer, Tor Arntsen, - Rolland Dudemaine + Rolland Dudemaine, Phil Blundell Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/http.c b/lib/http.c index 280cccecb..c65b0cf1f 100644 --- a/lib/http.c +++ b/lib/http.c @@ -369,7 +369,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn) bool pickproxy = FALSE; CURLcode code = CURLE_OK; - if(100 == data->req.httpcode) + if(100 <= data->req.httpcode && 199 >= data->req.httpcode) /* this is a transient response code, ignore */ return CURLE_OK; diff --git a/lib/transfer.c b/lib/transfer.c index aafec6d4e..b45be0a56 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -587,7 +587,7 @@ CURLcode Curl_readwrite(struct connectdata *conn, k->p++; /* pass the \n byte */ #endif /* CURL_DOES_CONVERSIONS */ - if(100 == k->httpcode) { + if(100 <= k->httpcode && 199 >= k->httpcode) { /* * We have made a HTTP PUT or POST and this is 1.1-lingo * that tells us that the server is OK with this and ready @@ -661,7 +661,7 @@ CURLcode Curl_readwrite(struct connectdata *conn, data->req.headerbytecount += (long)headerlen; data->req.deductheadercount = - (100 == k->httpcode)?data->req.headerbytecount:0; + (100 <= k->httpcode && 199 >= k->httpcode)?data->req.headerbytecount:0; if(data->state.resume_from && (data->set.httpreq==HTTPREQ_GET) && diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index d2068a302..11d121e59 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -51,7 +51,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test1021 test1022 test1023 test309 test616 test617 test618 test619 \ test620 test621 test622 test623 test624 test625 test626 test627 test554 \ test1024 test1025 test555 test1026 test1027 test1028 test1029 test1030 \ - test556 test1031 test628 test629 test630 test631 test632 test1032 + test556 test1031 test628 test629 test630 test631 test632 test1032 test1033 filecheck: @mkdir test-place; \ diff --git a/tests/data/test1033 b/tests/data/test1033 new file mode 100644 index 000000000..62b03dfb2 --- /dev/null +++ b/tests/data/test1033 @@ -0,0 +1,60 @@ +# +# This case with an unexpected 1xx response used to cause a "hang" before the fix +# got 7.19.0 + + + +HTTP +HTTP GET + + + +# +# Server-side + + +HTTP/1.1 102 unexpected huh?! + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# +# Client-side + + +http + + +HTTP GET with 102 response! + + +http://%HOSTIP:%HTTPPORT/1033 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1033 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + +