- "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.
This commit is contained in:
parent
0a5ac52b49
commit
d68f215f03
7
CHANGES
7
CHANGES
@ -6,6 +6,13 @@
|
|||||||
|
|
||||||
Changelog
|
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)
|
Daniel Stenberg (25 Oct 2009)
|
||||||
- Dima Barsky made the curl cookie parser accept cookies even with blank or
|
- Dima Barsky made the curl cookie parser accept cookies even with blank or
|
||||||
unparsable expiry dates and then treat them as session cookies - previously
|
unparsable expiry dates and then treat them as session cookies - previously
|
||||||
|
@ -42,6 +42,7 @@ This release includes the following bugfixes:
|
|||||||
o memory leak in SCP/SFTP connections
|
o memory leak in SCP/SFTP connections
|
||||||
o use pkg-config to find out libssh2 installation details in configure
|
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 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:
|
This release includes the following known bugs:
|
||||||
|
|
||||||
|
12
lib/http.c
12
lib/http.c
@ -2905,7 +2905,17 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
if(result)
|
if(result)
|
||||||
return 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 */
|
/* set the upload size to the progress meter */
|
||||||
Curl_pgrsSetUploadSize(data, postsize?postsize:-1);
|
Curl_pgrsSetUploadSize(data, postsize?postsize:-1);
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
|
|||||||
test1089 test1090 test1091 test1092 test1093 test1094 test1095 test1096 \
|
test1089 test1090 test1091 test1092 test1093 test1094 test1095 test1096 \
|
||||||
test1097 test560 test561 test1098 test1099 test562 test563 test1100 \
|
test1097 test560 test561 test1098 test1099 test562 test563 test1100 \
|
||||||
test564 test1101 test1102 test1103 test1104 test299 test310 test311 \
|
test564 test1101 test1102 test1103 test1104 test299 test310 test311 \
|
||||||
test312 test1105
|
test312 test1105 test565
|
||||||
|
|
||||||
filecheck:
|
filecheck:
|
||||||
@mkdir test-place; \
|
@mkdir test-place; \
|
||||||
|
104
tests/data/test565
Normal file
104
tests/data/test565
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<testcase>
|
||||||
|
<info>
|
||||||
|
<keywords>
|
||||||
|
HTTP
|
||||||
|
HTTP POST
|
||||||
|
HTTP Digest auth
|
||||||
|
</keywords>
|
||||||
|
</info>
|
||||||
|
#
|
||||||
|
# Server-side
|
||||||
|
<reply>
|
||||||
|
<data>
|
||||||
|
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
|
||||||
|
|
||||||
|
</data>
|
||||||
|
<data1>
|
||||||
|
HTTP/1.1 200 A OK
|
||||||
|
Server: Microsoft-IIS/6.0
|
||||||
|
Content-Type: text/html; charset=iso-8859-1
|
||||||
|
Content-Length: 3
|
||||||
|
|
||||||
|
ok
|
||||||
|
</data1>
|
||||||
|
<datacheck>
|
||||||
|
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
|
||||||
|
</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
|
||||||
|
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
|
||||||
|
|
||||||
|
</protocol>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
@ -10,7 +10,7 @@ noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \
|
|||||||
lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \
|
lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \
|
||||||
lib529 lib530 lib532 lib533 lib536 lib537 lib540 lib541 lib542 lib543 \
|
lib529 lib530 lib532 lib533 lib536 lib537 lib540 lib541 lib542 lib543 \
|
||||||
lib544 lib545 lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 \
|
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)
|
lib500_SOURCES = lib500.c $(SUPPORTFILES)
|
||||||
@ -127,3 +127,6 @@ lib560_SOURCES = lib560.c $(SUPPORTFILES)
|
|||||||
lib562_SOURCES = lib562.c $(SUPPORTFILES)
|
lib562_SOURCES = lib562.c $(SUPPORTFILES)
|
||||||
|
|
||||||
lib564_SOURCES = lib564.c $(SUPPORTFILES) $(TESTUTIL)
|
lib564_SOURCES = lib564.c $(SUPPORTFILES) $(TESTUTIL)
|
||||||
|
|
||||||
|
lib565_SOURCES = lib510.c $(SUPPORTFILES)
|
||||||
|
lib565_CFLAGS = -DLIB565
|
||||||
|
@ -49,7 +49,6 @@ int test(char *URL)
|
|||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res=CURLE_OK;
|
CURLcode res=CURLE_OK;
|
||||||
struct curl_slist *slist = NULL;
|
struct curl_slist *slist = NULL;
|
||||||
|
|
||||||
struct WriteThis pooh;
|
struct WriteThis pooh;
|
||||||
pooh.counter = 0;
|
pooh.counter = 0;
|
||||||
|
|
||||||
@ -98,6 +97,11 @@ int test(char *URL)
|
|||||||
/* enforce chunked transfer by setting the header */
|
/* enforce chunked transfer by setting the header */
|
||||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
|
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 */
|
/* Perform the request, res will get the return code */
|
||||||
res = curl_easy_perform(curl);
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user