55b3f13ed8e03db48543e348e3bb76722fa3cce2
[external/curl.git] / tests / libtest / lib555.c
1 /*****************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  *
9  * This test case is supposed to be identical to 547 except that this uses the
10  * multi interface and 547 is easy interface.
11  *
12  * argv1 = URL
13  * argv2 = proxy
14  * argv3 = proxyuser:password
15  */
16
17 #include "test.h"
18 #include "testutil.h"
19 #include "memdebug.h"
20
21 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
22
23 #define UPLOADTHIS "this is the blurb we want to upload\n"
24
25 static size_t readcallback(void  *ptr,
26                            size_t size,
27                            size_t nmemb,
28                            void *clientp)
29 {
30   int *counter = (int *)clientp;
31
32   if(*counter) {
33     /* only do this once and then require a clearing of this */
34     fprintf(stderr, "READ ALREADY DONE!\n");
35     return 0;
36   }
37   (*counter)++; /* bump */
38
39   if(size * nmemb > strlen(UPLOADTHIS)) {
40     fprintf(stderr, "READ!\n");
41     strcpy(ptr, UPLOADTHIS);
42     return strlen(UPLOADTHIS);
43   }
44   fprintf(stderr, "READ NOT FINE!\n");
45   return 0;
46 }
47 static curlioerr ioctlcallback(CURL *handle,
48                                int cmd,
49                                void *clientp)
50 {
51   int *counter = (int *)clientp;
52   (void)handle; /* unused */
53   if(cmd == CURLIOCMD_RESTARTREAD) {
54     fprintf(stderr, "REWIND!\n");
55     *counter = 0; /* clear counter to make the read callback restart */
56   }
57   return CURLIOE_OK;
58 }
59
60
61 int test(char *URL)
62 {
63   int res;
64   CURL *curl;
65   int counter=0;
66   CURLM *m = NULL;
67   int running=1;
68   struct timeval mp_start;
69   char mp_timedout = FALSE;
70
71   if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
72     fprintf(stderr, "curl_global_init() failed\n");
73     return TEST_ERR_MAJOR_BAD;
74   }
75
76   if ((curl = curl_easy_init()) == NULL) {
77     fprintf(stderr, "curl_easy_init() failed\n");
78     curl_global_cleanup();
79     return TEST_ERR_MAJOR_BAD;
80   }
81
82   test_setopt(curl, CURLOPT_URL, URL);
83   test_setopt(curl, CURLOPT_VERBOSE, 1L);
84   test_setopt(curl, CURLOPT_HEADER, 1L);
85
86   /* read the POST data from a callback */
87   test_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctlcallback);
88   test_setopt(curl, CURLOPT_IOCTLDATA, &counter);
89   test_setopt(curl, CURLOPT_READFUNCTION, readcallback);
90   test_setopt(curl, CURLOPT_READDATA, &counter);
91   /* We CANNOT do the POST fine without setting the size (or choose chunked)! */
92   test_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(UPLOADTHIS));
93
94   test_setopt(curl, CURLOPT_POST, 1L);
95 #ifdef CURL_DOES_CONVERSIONS
96   /* Convert the POST data to ASCII. */
97   test_setopt(curl, CURLOPT_TRANSFERTEXT, 1L);
98 #endif
99   test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
100   test_setopt(curl, CURLOPT_PROXYUSERPWD, libtest_arg3);
101   test_setopt(curl, CURLOPT_PROXYAUTH,
102                    (long) (CURLAUTH_NTLM | CURLAUTH_DIGEST | CURLAUTH_BASIC) );
103
104   if ((m = curl_multi_init()) == NULL) {
105     fprintf(stderr, "curl_multi_init() failed\n");
106     curl_easy_cleanup(curl);
107     curl_global_cleanup();
108     return TEST_ERR_MAJOR_BAD;
109   }
110
111   if ((res = (int)curl_multi_add_handle(m, curl)) != CURLM_OK) {
112     fprintf(stderr, "curl_multi_add_handle() failed, "
113             "with code %d\n", res);
114     curl_multi_cleanup(m);
115     curl_easy_cleanup(curl);
116     curl_global_cleanup();
117     return TEST_ERR_MAJOR_BAD;
118   }
119
120   mp_timedout = FALSE;
121   mp_start = tutil_tvnow();
122
123   while (running) {
124     res = (int)curl_multi_perform(m, &running);
125     if (tutil_tvdiff(tutil_tvnow(), mp_start) >
126         MULTI_PERFORM_HANG_TIMEOUT) {
127       mp_timedout = TRUE;
128       break;
129     }
130 #ifdef TPF
131     sleep(1); /* avoid ctl-10 dump */
132 #endif
133     if (running <= 0) {
134       fprintf(stderr, "nothing left running.\n");
135       break;
136     }
137   }
138
139   if (mp_timedout) {
140     if (mp_timedout) fprintf(stderr, "mp_timedout\n");
141     fprintf(stderr, "ABORTING TEST, since it seems "
142             "that it would have run forever.\n");
143     res = TEST_ERR_RUNS_FOREVER;
144   }
145
146 test_cleanup:
147
148   if(m) {
149     curl_multi_remove_handle(m, curl);
150     curl_multi_cleanup(m);
151   }
152   curl_easy_cleanup(curl);
153   curl_global_cleanup();
154
155   return res;
156 }
157