From cbcdd337aaae878dc47df10f9c21f77cbebadc77 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 9 Oct 2006 21:29:53 +0000 Subject: Added test case 536 in an attempt to add Bogdan Nicula's problematic case with multi interface and pipelining. This test just works and did not repeat the problem his test code showed, but could still serve as a useful test. --- tests/libtest/lib536.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 tests/libtest/lib536.c (limited to 'tests/libtest/lib536.c') diff --git a/tests/libtest/lib536.c b/tests/libtest/lib536.c new file mode 100644 index 000000000..a1099fe62 --- /dev/null +++ b/tests/libtest/lib536.c @@ -0,0 +1,82 @@ +/***************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * $Id$ + */ + +#include "test.h" + +#include +#include +#include + +static CURLMcode perform(CURLM * multi); + +static CURLMcode perform(CURLM * multi) +{ + int handles, maxfd; + CURLMcode code; + fd_set fdread, fdwrite, fdexcep; + + for (;;) { + code = curl_multi_perform(multi, &handles); + if (handles <= 0) + return CURLM_OK; + + switch (code) { + case CURLM_OK: + break; + case CURLM_CALL_MULTI_PERFORM: + continue; + default: + return code; + } + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); + if (maxfd < 0) + return -1; + if (select(maxfd + 1, &fdread, &fdwrite, &fdexcep, 0) == -1) + return -1; + } +} + +int test(char *URL) +{ + CURLM *multi = curl_multi_init(); + CURL *easy = curl_easy_init(); + + curl_multi_setopt(multi, CURLMOPT_PIPELINING, 1); + + curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, fwrite); + curl_easy_setopt(easy, CURLOPT_FAILONERROR, 1); + curl_easy_setopt(easy, CURLOPT_URL, URL); + + curl_multi_add_handle(multi, easy); + if (perform(multi) != CURLM_OK) + printf("retrieve 1 failed\n"); + + curl_multi_remove_handle(multi, easy); + curl_easy_reset(easy); + + curl_easy_setopt(easy, CURLOPT_FAILONERROR, 1); + curl_easy_setopt(easy, CURLOPT_URL, arg2); + + curl_multi_add_handle(multi, easy); + if (perform(multi) != CURLM_OK) + printf("retrieve 2 failed\n"); + + curl_multi_remove_handle(multi, easy); + curl_easy_cleanup(easy); + curl_multi_cleanup(multi); + + printf("Finished!\n"); + + return 0; +} -- cgit v1.2.3