From c904b6b5bf6c6e980480e63cd066dc2ae2aace23 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 18 Apr 2005 17:14:58 +0000 Subject: Toshiyuki Maezawa reported that when doing a POST with a read callback, libcurl didn't properly send an Expect: 100-continue header. It does now. --- CHANGES | 8 +++++++ lib/http.c | 68 +++++++++++++++++++++++++++--------------------------- tests/data/test508 | 1 + tests/data/test510 | 1 + tests/data/test513 | 1 + tests/data/test515 | 1 + 6 files changed, 46 insertions(+), 34 deletions(-) diff --git a/CHANGES b/CHANGES index 7340b4cde..9b1fd6127 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,14 @@ Changelog +Daniel (18 April 2005) +- Toshiyuki Maezawa reported that when doing a POST with a read callback, + libcurl didn't properly send an Expect: 100-continue header. It does now. + +- I committed by mig change in the test suite's FTP server that moves out all + socket/TCP code to a separate C program named sockfilt. And added 4 new + test cases for FTP over IPv6. + Daniel (8 April 2005) - Cory Nelson reported a problem with a HTTP server that responded with a 304 response containing an "illegal" Content-Length: header, which was not diff --git a/lib/http.c b/lib/http.c index 392e70657..c3c805956 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1347,6 +1347,27 @@ CURLcode Curl_http_done(struct connectdata *conn, return CURLE_OK; } +/* check and possibly add an Expect: header */ +static CURLcode expect100(struct SessionHandle *data, + send_buffer *req_buffer) +{ + CURLcode result = CURLE_OK; + if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && + !checkheaders(data, "Expect:")) { + /* 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->set.expect100header = TRUE; + } + return result; +} + + + /* * Curl_http() gets called from the generic Curl_do() function when a HTTP * request is to be performed. This creates and sends a properly constructed @@ -1928,18 +1949,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) return result; } - if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && - !checkheaders(data, "Expect:")) { - /* 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) - return result; - data->set.expect100header = TRUE; - } + result = expect100(data, req_buffer); + if(result) + return result; if(!checkheaders(data, "Content-Type:")) { /* Get Content-Type: line from Curl_formpostheader. @@ -2002,18 +2014,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) return result; } - if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && - !checkheaders(data, "Expect:")) { - /* if not 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) - return result; - data->set.expect100header = TRUE; - } + result = expect100(data, req_buffer); + if(result) + return result; result = add_buffer(req_buffer, "\r\n", 2); /* end of headers */ if(result) @@ -2121,21 +2124,18 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) /* set the upload size to the progress meter */ Curl_pgrsSetUploadSize(data, http->postsize); - if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && - !checkheaders(data, "Expect:")) { - /* if not 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) */ - add_bufferf(req_buffer, - "Expect: 100-continue\r\n"); - data->set.expect100header = TRUE; - } + result = expect100(data, req_buffer); + if(result) + return result; add_buffer(req_buffer, "\r\n", 2); /* end of headers! */ } } else { + result = expect100(data, req_buffer); + if(result) + return result; + add_buffer(req_buffer, "\r\n", 2); /* end of headers! */ if(data->set.postfieldsize) { diff --git a/tests/data/test508 b/tests/data/test508 index 08217effb..51e3f8154 100644 --- a/tests/data/test508 +++ b/tests/data/test508 @@ -40,6 +40,7 @@ Pragma: no-cache Accept: */* Content-Length: 45 Content-Type: application/x-www-form-urlencoded +Expect: 100-continue this is what we post to the silly web server diff --git a/tests/data/test510 b/tests/data/test510 index a82452a89..6ab346678 100644 --- a/tests/data/test510 +++ b/tests/data/test510 @@ -40,6 +40,7 @@ Pragma: no-cache Accept: */* Transfer-Encoding: chunked Content-Type: application/x-www-form-urlencoded +Expect: 100-continue 3 one diff --git a/tests/data/test513 b/tests/data/test513 index d97607e58..8b1fcf61f 100644 --- a/tests/data/test513 +++ b/tests/data/test513 @@ -31,6 +31,7 @@ Pragma: no-cache Accept: */* Content-Length: 1 Content-Type: application/x-www-form-urlencoded +Expect: 100-continue # 42 - aborted by callback diff --git a/tests/data/test515 b/tests/data/test515 index 7e72858a3..5feb4a94a 100644 --- a/tests/data/test515 +++ b/tests/data/test515 @@ -41,6 +41,7 @@ Pragma: no-cache Accept: */* Content-Length: 0 Content-Type: application/x-www-form-urlencoded +Expect: 100-continue -- cgit v1.2.3