From d68f215f037febf1850ad6a169d4a69bd9d132a1 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 30 Oct 2009 22:24:48 +0000 Subject: [PATCH] - "Tom" posted a bug report that mentioned how libcurl did wrong when doing a POST using a read callback, with Digest authentication and "Transfer-Encoding: chunked" enforced. I would then cause the first request to be wrongly sent and then basically hang until the server closed the connection. I fixed the problem and added test case 565 to verify it. --- CHANGES | 7 +++ RELEASE-NOTES | 1 + lib/http.c | 12 ++++- tests/data/Makefile.am | 2 +- tests/data/test565 | 104 +++++++++++++++++++++++++++++++++++++ tests/libtest/Makefile.inc | 5 +- tests/libtest/lib510.c | 6 ++- 7 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 tests/data/test565 diff --git a/CHANGES b/CHANGES index ed5e8892f..78717b366 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,13 @@ Changelog +Daniel Stenberg (30 Oct 2009) +- "Tom" posted a bug report that mentioned how libcurl did wrong when doing a + POST using a read callback, with Digest authentication and + "Transfer-Encoding: chunked" enforced. I would then cause the first request + to be wrongly sent and then basically hang until the server closed the + connection. I fixed the problem and added test case 565 to verify it. + Daniel Stenberg (25 Oct 2009) - Dima Barsky made the curl cookie parser accept cookies even with blank or unparsable expiry dates and then treat them as session cookies - previously diff --git a/RELEASE-NOTES b/RELEASE-NOTES index a6049f003..10ca00db8 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -42,6 +42,7 @@ This release includes the following bugfixes: o memory leak in SCP/SFTP connections o use pkg-config to find out libssh2 installation details in configure o unparsable cookie expire dates make cookies get treated as session coookies + o POST with Digest authentication and "Transfer-Encoding: chunked" This release includes the following known bugs: diff --git a/lib/http.c b/lib/http.c index 5471f377f..832a6d507 100644 --- a/lib/http.c +++ b/lib/http.c @@ -2905,7 +2905,17 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(result) return result; - if(data->set.postfieldsize) { + if(data->req.upload_chunky && conn->bits.authneg) { + /* Chunky upload is selected and we're negotiating auth still, send + end-of-data only */ + result = add_buffer(req_buffer, + "\x0d\x0a\x30\x0d\x0a\x0d\x0a", 7); + /* CR LF 0 CR LF CR LF */ + if(result) + return result; + } + + else if(data->set.postfieldsize) { /* set the upload size to the progress meter */ Curl_pgrsSetUploadSize(data, postsize?postsize:-1); diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index f8777a952..d6dc4f38b 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -63,7 +63,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test1089 test1090 test1091 test1092 test1093 test1094 test1095 test1096 \ test1097 test560 test561 test1098 test1099 test562 test563 test1100 \ test564 test1101 test1102 test1103 test1104 test299 test310 test311 \ - test312 test1105 + test312 test1105 test565 filecheck: @mkdir test-place; \ diff --git a/tests/data/test565 b/tests/data/test565 new file mode 100644 index 000000000..896db4061 --- /dev/null +++ b/tests/data/test565 @@ -0,0 +1,104 @@ + + + +HTTP +HTTP POST +HTTP Digest auth + + +# +# Server-side + + +HTTP/1.1 100 Continue +Server: Microsoft-IIS/5.0 +Date: Sun, 03 Apr 2005 14:57:45 GMT +X-Powered-By: ASP.NET + +HTTP/1.1 401 authentication please swsbounce +Server: Microsoft-IIS/6.0 +WWW-Authenticate: Digest realm="testrealm", nonce="1053604144" +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 0 + + + +HTTP/1.1 200 A OK +Server: Microsoft-IIS/6.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 3 + +ok + + +HTTP/1.1 100 Continue +Server: Microsoft-IIS/5.0 +Date: Sun, 03 Apr 2005 14:57:45 GMT +X-Powered-By: ASP.NET + +HTTP/1.1 401 authentication please swsbounce +Server: Microsoft-IIS/6.0 +WWW-Authenticate: Digest realm="testrealm", nonce="1053604144" +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 0 + +HTTP/1.1 200 A OK +Server: Microsoft-IIS/6.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 3 + +ok + + + +# Client-side + + +http + +# tool is what to use instead of 'curl' + +lib565 + + + +send HTTP POST using read callback, chunked transfer-encoding and Digest + + +http://%HOSTIP:%HTTPPORT/565 + + + +# +# Verify data after the test has been "shot" + + +POST /565 HTTP/1.1 +Host: 127.0.0.1:8990 +Accept: */* +Transfer-Encoding: chunked +Content-Type: application/x-www-form-urlencoded + + +0 + +POST /565 HTTP/1.1 +Authorization: Digest username="foo", realm="testrealm", nonce="1053604144", uri="/565", response="877424f750af047634dbd94f9933217b" +Host: 127.0.0.1:8990 +Accept: */* +Transfer-Encoding: chunked +Content-Type: application/x-www-form-urlencoded + +3 +one +3 +two +5 +three +1d +and a final longer crap: four +0 + + + + diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc index 328b5dd16..aa7e9bd01 100644 --- a/tests/libtest/Makefile.inc +++ b/tests/libtest/Makefile.inc @@ -10,7 +10,7 @@ noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \ lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \ lib529 lib530 lib532 lib533 lib536 lib537 lib540 lib541 lib542 lib543 \ lib544 lib545 lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 \ - lib539 lib557 lib558 lib559 lib560 lib562 lib564 + lib539 lib557 lib558 lib559 lib560 lib562 lib564 lib565 lib500_SOURCES = lib500.c $(SUPPORTFILES) @@ -127,3 +127,6 @@ lib560_SOURCES = lib560.c $(SUPPORTFILES) lib562_SOURCES = lib562.c $(SUPPORTFILES) lib564_SOURCES = lib564.c $(SUPPORTFILES) $(TESTUTIL) + +lib565_SOURCES = lib510.c $(SUPPORTFILES) +lib565_CFLAGS = -DLIB565 diff --git a/tests/libtest/lib510.c b/tests/libtest/lib510.c index c890f9d45..e13acf4ec 100644 --- a/tests/libtest/lib510.c +++ b/tests/libtest/lib510.c @@ -49,7 +49,6 @@ int test(char *URL) CURL *curl; CURLcode res=CURLE_OK; struct curl_slist *slist = NULL; - struct WriteThis pooh; pooh.counter = 0; @@ -98,6 +97,11 @@ int test(char *URL) /* enforce chunked transfer by setting the header */ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); +#ifdef LIB565 + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); + curl_easy_setopt(curl, CURLOPT_USERPWD, "foo:bar"); +#endif + /* Perform the request, res will get the return code */ res = curl_easy_perform(curl);