From 7d3ea12b625fd07d9d41a68e7cc2cd5322247584 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 5 Dec 2007 21:20:14 +0000 Subject: Spacen Jasset reported a problem with doing POST (with data read with a callback) over a proxy when NTLM is used as auth with the proxy. The bug also concerned Digest and was limited to using callback only. Spacen worked with us to provide a useful patch. I added the test case 547 and 548 to verify two variations of POST over proxy with NTLM. --- tests/libtest/lib547.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) (limited to 'tests/libtest/lib547.c') diff --git a/tests/libtest/lib547.c b/tests/libtest/lib547.c index 0513911d6..2d4011213 100644 --- a/tests/libtest/lib547.c +++ b/tests/libtest/lib547.c @@ -20,21 +20,49 @@ static size_t readcallback(void *ptr, size_t size, size_t nmemb, - void *stream) + void *clientp) { - (void)stream; /* unused */ + int *counter = (int *)clientp; + + if(*counter) { + /* only do this once and then require a clearing of this */ + fprintf(stderr, "READ ALREADY DONE!\n"); + return 0; + } + (*counter)++; /* bump */ + if(size * nmemb > strlen(UPLOADTHIS)) { + fprintf(stderr, "READ!\n"); strcpy(ptr, UPLOADTHIS); return strlen(UPLOADTHIS); } + fprintf(stderr, "READ NOT FINE!\n"); return 0; } +static curlioerr ioctlcallback(CURL *handle, + int cmd, + void *clientp) +{ + int *counter = (int *)clientp; + (void)handle; /* unused */ + if(cmd == CURLIOCMD_RESTARTREAD) { + fprintf(stderr, "REWIND!\n"); + *counter = 0; /* clear counter to make the read callback restart */ + } + return CURLIOE_OK; +} + + + #endif int test(char *URL) { CURLcode res; CURL *curl; +#ifndef LIB548 + int counter=0; +#endif if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { fprintf(stderr, "curl_global_init() failed\n"); @@ -51,10 +79,18 @@ int test(char *URL) curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_HEADER, TRUE); #ifdef LIB548 + /* set the data to POST with a mere pointer to a zero-terminated string */ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, UPLOADTHIS); #else - /* 547 style */ + /* 547 style, which means reading the POST data from a callback */ + curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctlcallback); + curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &counter); curl_easy_setopt(curl, CURLOPT_READFUNCTION, readcallback); + curl_easy_setopt(curl, CURLOPT_READDATA, &counter); + /* TODO: We should be able to do the POST fine without setting the size + and we should do a test to verify that but until we do that we set + the size of the request-body */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(UPLOADTHIS)); #endif curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_PROXY, libtest_arg2); -- cgit v1.2.3