aboutsummaryrefslogtreecommitdiff
path: root/tests/libtest
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2007-12-26 21:48:52 +0000
committerDaniel Stenberg <daniel@haxx.se>2007-12-26 21:48:52 +0000
commitf277124a0f78327f6a973518c073d6a9a458326b (patch)
tree77d2ff8130b5c17df9dff4a33c6275812e687c8b /tests/libtest
parent6adf5880f5a08a83aa2dc308d66a36b9ce8799a2 (diff)
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).
Diffstat (limited to 'tests/libtest')
-rw-r--r--tests/libtest/Makefile.am3
-rw-r--r--tests/libtest/lib552.c194
2 files changed, 196 insertions, 1 deletions
diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am
index 1f9461fa2..7d9cb64aa 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 000000000..a4b8dcda0
--- /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<size; i+= width) {
+
+ fprintf(stream, "%04x: ", (int)i);
+
+ if(!nohex) {
+ /* hex not disabled, show it */
+ for(c = 0; c < width; c++)
+ if(i+c < size)
+ fprintf(stream, "%02x ", ptr[i+c]);
+ else
+ fputs(" ", stream);
+ }
+
+ for(c = 0; (c < width) && (i+c < size); c++) {
+ /* check for 0D0A; if found, skip past and start a new line of output */
+ if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
+ i+=(c+2-width);
+ break;
+ }
+ fprintf(stream, "%c",
+ (ptr[i+c]>=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;
+}