]> granicus.if.org Git - curl/commitdiff
- "Tom" posted a bug report that mentioned how libcurl did wrong when doing a
authorDaniel Stenberg <daniel@haxx.se>
Fri, 30 Oct 2009 22:24:48 +0000 (22:24 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 30 Oct 2009 22:24:48 +0000 (22:24 +0000)
  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
RELEASE-NOTES
lib/http.c
tests/data/Makefile.am
tests/data/test565 [new file with mode: 0644]
tests/libtest/Makefile.inc
tests/libtest/lib510.c

diff --git a/CHANGES b/CHANGES
index ed5e8892fee31ad139abb54e6015dcc17789dfd3..78717b3667973a96c62364d86d775228e082bc96 100644 (file)
--- 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
index a6049f003c8ac2b8a2aed5b84cf177e6fa3ac2cd..10ca00db8b85213ad650b0701075b9297d7d02a9 100644 (file)
@@ -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:
 
index 5471f377f03277d4b9652d55fae497e2df319356..832a6d507bb3b5d2d689915426cd387ad1ef618b 100644 (file)
@@ -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);
 
index f8777a952fb932a05b21cf3ff20e54ffb290d3fd..d6dc4f38b98d8bf6ba6fb29f67f3e1cfa1bbd5b8 100644 (file)
@@ -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 (file)
index 0000000..896db40
--- /dev/null
@@ -0,0 +1,104 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP Digest auth
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 100 Continue\r
+Server: Microsoft-IIS/5.0\r
+Date: Sun, 03 Apr 2005 14:57:45 GMT\r
+X-Powered-By: ASP.NET\r
+\r
+HTTP/1.1 401 authentication please swsbounce\r
+Server: Microsoft-IIS/6.0\r
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"\r
+Content-Type: text/html; charset=iso-8859-1\r
+Content-Length: 0\r
+\r
+</data>
+<data1>
+HTTP/1.1 200 A OK\r
+Server: Microsoft-IIS/6.0\r
+Content-Type: text/html; charset=iso-8859-1\r
+Content-Length: 3\r
+\r
+ok
+</data1>
+<datacheck>
+HTTP/1.1 100 Continue\r
+Server: Microsoft-IIS/5.0\r
+Date: Sun, 03 Apr 2005 14:57:45 GMT\r
+X-Powered-By: ASP.NET\r
+\r
+HTTP/1.1 401 authentication please swsbounce\r
+Server: Microsoft-IIS/6.0\r
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"\r
+Content-Type: text/html; charset=iso-8859-1\r
+Content-Length: 0\r
+\r
+HTTP/1.1 200 A OK\r
+Server: Microsoft-IIS/6.0\r
+Content-Type: text/html; charset=iso-8859-1\r
+Content-Length: 3\r
+\r
+ok
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib565
+</tool>
+
+ <name>
+send HTTP POST using read callback, chunked transfer-encoding and Digest
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/565
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+POST /565 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Transfer-Encoding: chunked\r
+Content-Type: application/x-www-form-urlencoded\r
+\r
+\r
+0\r
+\r
+POST /565 HTTP/1.1\r
+Authorization: Digest username="foo", realm="testrealm", nonce="1053604144", uri="/565", response="877424f750af047634dbd94f9933217b"\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Transfer-Encoding: chunked\r
+Content-Type: application/x-www-form-urlencoded\r
+\r
+3\r
+one\r
+3\r
+two\r
+5\r
+three\r
+1d\r
+and a final longer crap: four\r
+0\r
+\r
+</protocol>
+</verify>
+</testcase>
index 328b5dd161b27e93241088c0d6ccd4f64bc6b368..aa7e9bd016adb8329bd0b638530fa2b75221fdfa 100644 (file)
@@ -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
index c890f9d45e434c1d6262f735bc07f2f0254f6a62..e13acf4ec8a9a8ccdc0344aeaf0d43a4b73e6fcc 100644 (file)
@@ -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);