From f0826974f225b71a9b95f76f8ac68ea0d72706d5 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 1 Dec 2009 12:04:54 +0000 Subject: - If the Expect: 100-continue header has been set by the application through curl_easy_setopt with CURLOPT_HTTPHEADER, the library should set data->state.expect100header accordingly - the current code (in 7.19.7 at least) doesn't handle this properly. Martin Storsjo provided the fix! --- CHANGES | 6 ++++++ RELEASE-NOTES | 3 ++- lib/http.c | 30 +++++++++++++++++++++--------- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 2560b7f07..92b737589 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,12 @@ Changelog +Daniel Stenberg (1 Dec 2009) +- If the Expect: 100-continue header has been set by the application through + curl_easy_setopt with CURLOPT_HTTPHEADER, the library should set + data->state.expect100header accordingly - the current code (in 7.19.7 at + least) doesn't handle this properly. Martin Storsjo provided the fix! + Yang Tse (28 Nov 2009) - Added Diffie-Hellman parameters to several test harness certificate files in PEM format. Required by several stunnel versions used by our test harness. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index c62c11f2d..f6b38ce45 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -28,6 +28,7 @@ This release includes the following bugfixes: o SSL lib post-close write o curl failed to report write errors for tiny failed downloads o TFTP BLKSIZE + o Expect: 100-continue handling when set by the application This release includes the following known bugs: @@ -39,6 +40,6 @@ advice from friends like these: Yang Tse, Kamil Dudka, Christian Schmitz, Constantine Sapuntzakis, Marco Maggi, Camille Moncelier, Claes Jakobsson, Kevin Baughman, Marc Kleine-Budde, Jad Chamcham, Bjorn Augustsson, David Byron, - Markus Koetter, Chad Monroe + Markus Koetter, Chad Monroe, Martin Storsjo Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/http.c b/lib/http.c index 7e4e58795..d67a001b2 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1981,17 +1981,24 @@ static CURLcode expect100(struct SessionHandle *data, send_buffer *req_buffer) { CURLcode result = CURLE_OK; + const char *ptr; data->state.expect100header = FALSE; /* default to false unless it is set to TRUE below */ - if(use_http_1_1(data, conn) && !checkheaders(data, "Expect:")) { + if(use_http_1_1(data, conn)) { /* if not doing HTTP 1.0 or disabled explicitly, we add a Expect: - 100-continue to the headers which actually speeds up post - operations (as there is one packet coming back from the web - server) */ - result = add_bufferf(req_buffer, - "Expect: 100-continue\r\n"); - if(result == CURLE_OK) - data->state.expect100header = TRUE; + 100-continue to the headers which actually speeds up post operations + (as there is one packet coming back from the web server) */ + ptr = checkheaders(data, "Expect:"); + if (ptr) { + data->state.expect100header = + Curl_compareheader(ptr, "Expect:", "100-continue"); + } + else { + result = add_bufferf(req_buffer, + "Expect: 100-continue\r\n"); + if(result == CURLE_OK) + data->state.expect100header = TRUE; + } } return result; } @@ -2837,7 +2844,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) the somewhat bigger ones we allow the app to disable it. Just make sure that the expect100header is always set to the preferred value here. */ - if(postsize > TINY_INITIAL_POST_SIZE) { + ptr = checkheaders(data, "Expect:"); + if(ptr) { + data->state.expect100header = + Curl_compareheader(ptr, "Expect:", "100-continue"); + } + else if(postsize > TINY_INITIAL_POST_SIZE) { result = expect100(data, conn, req_buffer); if(result) return result; -- cgit v1.2.3