From f277124a0f78327f6a973518c073d6a9a458326b Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 26 Dec 2007 21:48:52 +0000 Subject: [PATCH] In an attempt to repeat the problem in bug report #1850730 (http://curl.haxx.se/bug/view.cgi?id=1850730) I wrote up test case 552. The test is doing a 70K POST with a read callback and an ioctl callback over a proxy requiring Digest auth. The test case code is more or less identical to the test recipe code provided by Spacen Jasset (who submitted the bug report). --- CHANGES | 8 ++ tests/data/Makefile.am | 2 +- tests/data/test552 | Bin 0 -> 143252 bytes tests/libtest/Makefile.am | 3 +- tests/libtest/lib552.c | 194 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 tests/data/test552 create mode 100644 tests/libtest/lib552.c diff --git a/CHANGES b/CHANGES index 34a8fc251e..f02e3806fe 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,14 @@ Changelog +Daniel S (26 Dec 2007) +- In an attempt to repeat the problem in bug report #1850730 + (http://curl.haxx.se/bug/view.cgi?id=1850730) I wrote up test case 552. The + test is doing a 70K POST with a read callback and an ioctl callback over a + proxy requiring Digest auth. The test case code is more or less identical to + the test recipe code provided by Spacen Jasset (who submitted the bug + report). + Daniel S (25 Dec 2007) - Gary Maxwell filed bug report #1856628 (http://curl.haxx.se/bug/view.cgi?id=1856628) and provided a fix for the diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 57081c36c4..4c214bc4ff 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -47,7 +47,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test615 test1007 test541 test1010 test1011 test1012 test542 test543 \ test536 test1008 test1009 test2000 test2001 test2002 test2003 test35 \ test544 test545 test2004 test546 test1013 test1014 test1015 \ - test547 test548 test549 test550 test551 + test547 test548 test549 test550 test551 test552 filecheck: @mkdir test-place; \ diff --git a/tests/data/test552 b/tests/data/test552 new file mode 100644 index 0000000000000000000000000000000000000000..9978a2b77a41aac9948297dc385ae62a94eba5e8 GIT binary patch literal 143252 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 RX_X)rXaRq6VsWY+7XZHG8_NIy literal 0 HcmV?d00001 diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am index 1f9461fa2d..7d9cb64aa1 100644 --- a/tests/libtest/Makefile.am +++ b/tests/libtest/Makefile.am @@ -48,7 +48,7 @@ noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \ lib507 lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 \ 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 + lib544 lib545 lib547 lib548 lib549 lib552 # Dependencies (may need to be overriden) LDADD = $(LIBDIR)/libcurl.la @@ -146,3 +146,4 @@ lib548_CFLAGS = -DLIB548 lib549_SOURCES = lib549.c $(SUPPORTFILES) +lib552_SOURCES = lib552.c $(SUPPORTFILES) diff --git a/tests/libtest/lib552.c b/tests/libtest/lib552.c new file mode 100644 index 0000000000..a4b8dcda01 --- /dev/null +++ b/tests/libtest/lib552.c @@ -0,0 +1,194 @@ +/***************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * $Id$ + * + * argv1 = URL + * argv2 = proxy with embedded user+password + */ + +#include "test.h" + +struct data { + char trace_ascii; /* 1 or 0 */ +}; + +static +void dump(const char *text, + FILE *stream, unsigned char *ptr, size_t size, + char nohex) +{ + size_t i; + size_t c; + + unsigned int width=0x10; + + if(nohex) + /* without the hex output, we can fit more on screen */ + width = 0x40; + + fprintf(stream, "%s, %d bytes (0x%x)\n", text, (int)size, (int)size); + + for(i=0; i=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.'); + /* check again for 0D0A, to avoid an extra \n if it's at width */ + if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { + i+=(c+3-width); + break; + } + } + fputc('\n', stream); /* newline */ + } + fflush(stream); +} + +static +int my_trace(CURL *handle, curl_infotype type, + unsigned char *data, size_t size, + void *userp) +{ + struct data *config = (struct data *)userp; + const char *text; + (void)handle; /* prevent compiler warning */ + + switch (type) { + case CURLINFO_TEXT: + fprintf(stderr, "== Info: %s", data); + default: /* in case a new one is introduced to shock us */ + return 0; + + case CURLINFO_HEADER_OUT: + text = "=> Send header"; + break; + case CURLINFO_DATA_OUT: + text = "=> Send data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "=> Send SSL data"; + break; + case CURLINFO_HEADER_IN: + text = "<= Recv header"; + break; + case CURLINFO_DATA_IN: + text = "<= Recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "<= Recv SSL data"; + break; + } + + dump(text, stderr, data, size, config->trace_ascii); + return 0; +} + + +static size_t current_offset = 0; +char data[70000]; /* MUST be more than 64k OR MAX_INITIAL_POST_SIZE */ + +static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) +{ + size_t amount = nmemb * size; /* Total bytes curl wants */ + size_t available = sizeof data - current_offset; /* What we have to give */ + size_t given = amount < available ? amount : available; /* What is given */ + (void)stream; + memcpy(ptr, data + current_offset, given); + current_offset += given; + return given; +} + + +static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) +{ + printf("%.*s", size * nmemb, (char *)ptr); + (void)stream; + return size * nmemb; +} + + +static curlioerr ioctl_callback(CURL * handle, int cmd, void *clientp) +{ + (void)clientp; + if (cmd == CURLIOCMD_RESTARTREAD ) { + printf("APPLICATION: recieved a CURLIOCMD_RESTARTREAD request\n"); + printf("APPLICATION: ** REWINDING! **\n"); + current_offset = 0; + return CURLIOE_OK; + } + (void)handle; + return CURLIOE_UNKNOWNCMD; +} + + + +int test(char *URL) +{ + CURL *curl; + CURLcode res; + struct data config; + size_t i; + char fill[] = "test data"; + + config.trace_ascii = 1; /* enable ascii tracing */ + + curl = curl_easy_init(); + if(curl) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); + /* the DEBUGFUNCTION has no effect until we enable VERBOSE */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + + /* setup repeated data string */ + for (i=0; i < sizeof data; ++i) + data[i] = fill[i % sizeof fill]; + + /* Post */ + curl_easy_setopt(curl, CURLOPT_POST, 1); + + /* Setup read callback */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, sizeof data); + curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); + + /* Write callback */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + + /* Ioctl function */ + curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback); + + curl_easy_setopt(curl, CURLOPT_PROXY, libtest_arg2); + + curl_easy_setopt(curl, CURLOPT_URL, URL); + + /* Accept any auth. But for this bug configure proxy with DIGEST, basic might work too, not NTLM */ + curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY); + + res = curl_easy_perform(curl); + fprintf(stderr, "curl_east_perform = %d\n", res); + + /* always cleanup */ + curl_easy_cleanup(curl); + } + return 0; +} -- GitLab