Song Ma provided a patch that cures a problem libcurl has when doing resume
authorDaniel Stenberg <daniel@haxx.se>
Fri, 17 Aug 2007 20:21:32 +0000 (20:21 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 17 Aug 2007 20:21:32 +0000 (20:21 +0000)
HTTP PUT using Digest authentication. Test case 5320 and 5322 were also
added to verify the functionality.

CHANGES
RELEASE-NOTES
lib/http.c
tests/data/Makefile.am
tests/data/test5320 [new file with mode: 0644]
tests/data/test5322 [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index 98c3648..2ecec5b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,11 @@
 
                                   Changelog
 
+Daniel S (17 August 2007)
+- Song Ma provided a patch that cures a problem libcurl has when doing resume
+  HTTP PUT using Digest authentication. Test case 5320 and 5322 were also
+  added to verify the functionality.
+
 Daniel S (14 August 2007)
 - Andrew Wansink provided an NTLM bugfix: in the case the server sets the flag
   NTLMFLAG_NEGOTIATE_UNICODE, we need to filter it off because libcurl doesn't
index e444a40..85fb3ef 100644 (file)
@@ -40,6 +40,7 @@ This release includes the following bugfixes:
    "clean"
  o memory leak when handling compressed data streams from broken servers
  o no NTLM unicode response
+ o resume HTTP PUT using Digest authentication
 
 This release includes the following known bugs:
 
index d22c591..e72ed43 100644 (file)
@@ -1993,7 +1993,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
        data->reqdata.resume_from = 0;
     }
 
-    if(data->reqdata.resume_from) {
+    if(data->reqdata.resume_from && !data->state.this_is_a_follow) {
       /* do we still game? */
       curl_off_t passed=0;
 
@@ -2049,6 +2049,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     else if((httpreq != HTTPREQ_GET) &&
             !checkheaders(data, "Content-Range:")) {
 
+      /* if a line like this was already allocated, free the previous one */
+      if(conn->allocptr.rangeline)
+        free(conn->allocptr.rangeline);
+
       if(data->reqdata.resume_from) {
         /* This is because "resume" was selected */
         curl_off_t total_expected_size=
@@ -2066,6 +2070,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
             aprintf("Content-Range: bytes %s/%" FORMAT_OFF_T "\r\n",
                     data->reqdata.range, data->set.infilesize);
       }
+      if(!conn->allocptr.rangeline)
+        return CURLE_OUT_OF_MEMORY;
     }
   }
 
@@ -2185,11 +2191,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     if(data->set.timecondition) {
       struct tm *tm;
 
-      /* Phil Karn (Fri, 13 Apr 2001) pointed out that the If-Modified-Since
-       * header family should have their times set in GMT as RFC2616 defines:
-       * "All HTTP date/time stamps MUST be represented in Greenwich Mean Time
-       * (GMT), without exception. For the purposes of HTTP, GMT is exactly
-       * equal to UTC (Coordinated Universal Time)." (see page 20 of RFC2616).
+      /* The If-Modified-Since header family should have their times set in
+       * GMT as RFC2616 defines: "All HTTP date/time stamps MUST be
+       * represented in Greenwich Mean Time (GMT), without exception. For the
+       * purposes of HTTP, GMT is exactly equal to UTC (Coordinated Universal
+       * Time)." (see page 20 of RFC2616).
        */
 
 #ifdef HAVE_GMTIME_R
index 97c1171..f611fc3 100644 (file)
@@ -43,4 +43,4 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46           \
  test296 test297 test298 test610 test611 test612 test406 test407 test408   \
  test409 test613 test614 test700 test701 test702 test704 test705 test703   \
  test706 test707 test350 test351 test352 test353 test289 test540 test354   \
- test231
+ test231 test5320 test5322
diff --git a/tests/data/test5320 b/tests/data/test5320
new file mode 100644 (file)
index 0000000..f56f702
--- /dev/null
@@ -0,0 +1,94 @@
+<testcase>
+# 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>
+<data1000>
+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
+</data1000>
+
+<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>
+ <name>
+HTTP POST --digest with PUT and resumed upload and modified method
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/5320 -u auser:apasswd --digest -T log/5320 -x  http://%HOSTIP:%HTTPPORT -C 2 -X GET
+</command>
+<file name="log/5320">
+test
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://%HOSTIP:%HTTPPORT/5320 HTTP/1.1\r
+Content-Range: bytes 2-4/5\r
+User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6\r
+Host: %HOSTIP:%HTTPPORT\r
+Pragma: no-cache\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Content-Length: 0\r
+Expect: 100-continue\r
+\r
+GET http://%HOSTIP:%HTTPPORT/5320 HTTP/1.1\r
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/5320", response="2bcdd77cd20487372fe7ecd3158b80f9"\r
+Content-Range: bytes 2-4/5\r
+Host: %HOSTIP:%HTTPPORT\r
+Pragma: no-cache\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Content-Length: 3\r
+Expect: 100-continue\r
+\r
+st
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test5322 b/tests/data/test5322
new file mode 100644 (file)
index 0000000..c94a962
--- /dev/null
@@ -0,0 +1,106 @@
+<testcase>
+# 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>
+<data1000>
+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
+</data1000>
+
+<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>
+ <name>
+HTTP POST --digest with PUT and resumed upload and modified method, twice
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/5320.upload1 -T log/5320 http://%HOSTIP:%HTTPPORT/5320.upload2 -T log/5320 -u auser:apasswd --digest -x  http://%HOSTIP:%HTTPPORT -C 2 -X GET
+</command>
+<file name="log/5320">
+test
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://%HOSTIP:%HTTPPORT/5320.upload1 HTTP/1.1\r
+Content-Range: bytes 2-4/5\r
+User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6\r
+Host: %HOSTIP:%HTTPPORT\r
+Pragma: no-cache\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Content-Length: 0\r
+Expect: 100-continue\r
+\r
+GET http://%HOSTIP:%HTTPPORT/5320.upload1 HTTP/1.1\r
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/5320.upload1", response="0fb68703673e77243cbc4a3910e25c25"\r
+Content-Range: bytes 2-4/5\r
+Host: %HOSTIP:%HTTPPORT\r
+Pragma: no-cache\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Content-Length: 3\r
+Expect: 100-continue\r
+\r
+st
+GET http://%HOSTIP:%HTTPPORT/5320.upload2 HTTP/1.1\r
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/5320.upload2", response="3d6a8cb72fae0b06039f5bdb1a09eccd"\r
+Content-Range: bytes 2-4/5\r
+User-Agent: curl/7.16.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Pragma: no-cache\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Content-Length: 3\r
+Expect: 100-continue\r
+\r
+st
+</protocol>
+</verify>
+</testcase>