1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker /* This is the 'proxyauth.c' test app posted by Shmulik Regev on the libcurl
25*6236dae4SAndroid Build Coastguard Worker * mailing list on 10 Jul 2007, converted to a test case.
26*6236dae4SAndroid Build Coastguard Worker *
27*6236dae4SAndroid Build Coastguard Worker * argv1 = URL
28*6236dae4SAndroid Build Coastguard Worker * argv2 = proxy
29*6236dae4SAndroid Build Coastguard Worker * argv3 = proxyuser:password
30*6236dae4SAndroid Build Coastguard Worker * argv4 = host name to use for the custom Host: header
31*6236dae4SAndroid Build Coastguard Worker */
32*6236dae4SAndroid Build Coastguard Worker
33*6236dae4SAndroid Build Coastguard Worker #include "test.h"
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard Worker #include <limits.h>
36*6236dae4SAndroid Build Coastguard Worker
37*6236dae4SAndroid Build Coastguard Worker #include "testutil.h"
38*6236dae4SAndroid Build Coastguard Worker #include "warnless.h"
39*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard Worker #define TEST_HANG_TIMEOUT 60 * 1000
42*6236dae4SAndroid Build Coastguard Worker
43*6236dae4SAndroid Build Coastguard Worker #define PROXY libtest_arg2
44*6236dae4SAndroid Build Coastguard Worker #define PROXYUSERPWD libtest_arg3
45*6236dae4SAndroid Build Coastguard Worker #define HOST test_argv[4]
46*6236dae4SAndroid Build Coastguard Worker
47*6236dae4SAndroid Build Coastguard Worker #define NUM_HANDLES 2
48*6236dae4SAndroid Build Coastguard Worker
49*6236dae4SAndroid Build Coastguard Worker static CURL *testeh[NUM_HANDLES];
50*6236dae4SAndroid Build Coastguard Worker
init(int num,CURLM * cm,const char * url,const char * userpwd,struct curl_slist * headers)51*6236dae4SAndroid Build Coastguard Worker static CURLcode init(int num, CURLM *cm, const char *url, const char *userpwd,
52*6236dae4SAndroid Build Coastguard Worker struct curl_slist *headers)
53*6236dae4SAndroid Build Coastguard Worker {
54*6236dae4SAndroid Build Coastguard Worker CURLcode res = CURLE_OK;
55*6236dae4SAndroid Build Coastguard Worker
56*6236dae4SAndroid Build Coastguard Worker res_easy_init(testeh[num]);
57*6236dae4SAndroid Build Coastguard Worker if(res)
58*6236dae4SAndroid Build Coastguard Worker goto init_failed;
59*6236dae4SAndroid Build Coastguard Worker
60*6236dae4SAndroid Build Coastguard Worker res_easy_setopt(testeh[num], CURLOPT_URL, url);
61*6236dae4SAndroid Build Coastguard Worker if(res)
62*6236dae4SAndroid Build Coastguard Worker goto init_failed;
63*6236dae4SAndroid Build Coastguard Worker
64*6236dae4SAndroid Build Coastguard Worker res_easy_setopt(testeh[num], CURLOPT_PROXY, PROXY);
65*6236dae4SAndroid Build Coastguard Worker if(res)
66*6236dae4SAndroid Build Coastguard Worker goto init_failed;
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker res_easy_setopt(testeh[num], CURLOPT_PROXYUSERPWD, userpwd);
69*6236dae4SAndroid Build Coastguard Worker if(res)
70*6236dae4SAndroid Build Coastguard Worker goto init_failed;
71*6236dae4SAndroid Build Coastguard Worker
72*6236dae4SAndroid Build Coastguard Worker res_easy_setopt(testeh[num], CURLOPT_PROXYAUTH, (long)CURLAUTH_ANY);
73*6236dae4SAndroid Build Coastguard Worker if(res)
74*6236dae4SAndroid Build Coastguard Worker goto init_failed;
75*6236dae4SAndroid Build Coastguard Worker
76*6236dae4SAndroid Build Coastguard Worker res_easy_setopt(testeh[num], CURLOPT_VERBOSE, 1L);
77*6236dae4SAndroid Build Coastguard Worker if(res)
78*6236dae4SAndroid Build Coastguard Worker goto init_failed;
79*6236dae4SAndroid Build Coastguard Worker
80*6236dae4SAndroid Build Coastguard Worker res_easy_setopt(testeh[num], CURLOPT_HEADER, 1L);
81*6236dae4SAndroid Build Coastguard Worker if(res)
82*6236dae4SAndroid Build Coastguard Worker goto init_failed;
83*6236dae4SAndroid Build Coastguard Worker
84*6236dae4SAndroid Build Coastguard Worker res_easy_setopt(testeh[num], CURLOPT_HTTPHEADER, headers); /* custom Host: */
85*6236dae4SAndroid Build Coastguard Worker if(res)
86*6236dae4SAndroid Build Coastguard Worker goto init_failed;
87*6236dae4SAndroid Build Coastguard Worker
88*6236dae4SAndroid Build Coastguard Worker res_multi_add_handle(cm, testeh[num]);
89*6236dae4SAndroid Build Coastguard Worker if(res)
90*6236dae4SAndroid Build Coastguard Worker goto init_failed;
91*6236dae4SAndroid Build Coastguard Worker
92*6236dae4SAndroid Build Coastguard Worker return CURLE_OK; /* success */
93*6236dae4SAndroid Build Coastguard Worker
94*6236dae4SAndroid Build Coastguard Worker init_failed:
95*6236dae4SAndroid Build Coastguard Worker
96*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(testeh[num]);
97*6236dae4SAndroid Build Coastguard Worker testeh[num] = NULL;
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Worker return res; /* failure */
100*6236dae4SAndroid Build Coastguard Worker }
101*6236dae4SAndroid Build Coastguard Worker
loop(int num,CURLM * cm,const char * url,const char * userpwd,struct curl_slist * headers)102*6236dae4SAndroid Build Coastguard Worker static CURLcode loop(int num, CURLM *cm, const char *url, const char *userpwd,
103*6236dae4SAndroid Build Coastguard Worker struct curl_slist *headers)
104*6236dae4SAndroid Build Coastguard Worker {
105*6236dae4SAndroid Build Coastguard Worker CURLMsg *msg;
106*6236dae4SAndroid Build Coastguard Worker long L;
107*6236dae4SAndroid Build Coastguard Worker int Q, U = -1;
108*6236dae4SAndroid Build Coastguard Worker fd_set R, W, E;
109*6236dae4SAndroid Build Coastguard Worker struct timeval T;
110*6236dae4SAndroid Build Coastguard Worker CURLcode res = CURLE_OK;
111*6236dae4SAndroid Build Coastguard Worker
112*6236dae4SAndroid Build Coastguard Worker res = init(num, cm, url, userpwd, headers);
113*6236dae4SAndroid Build Coastguard Worker if(res)
114*6236dae4SAndroid Build Coastguard Worker return res;
115*6236dae4SAndroid Build Coastguard Worker
116*6236dae4SAndroid Build Coastguard Worker while(U) {
117*6236dae4SAndroid Build Coastguard Worker
118*6236dae4SAndroid Build Coastguard Worker int M = -99;
119*6236dae4SAndroid Build Coastguard Worker
120*6236dae4SAndroid Build Coastguard Worker res_multi_perform(cm, &U);
121*6236dae4SAndroid Build Coastguard Worker if(res)
122*6236dae4SAndroid Build Coastguard Worker return res;
123*6236dae4SAndroid Build Coastguard Worker
124*6236dae4SAndroid Build Coastguard Worker res_test_timedout();
125*6236dae4SAndroid Build Coastguard Worker if(res)
126*6236dae4SAndroid Build Coastguard Worker return res;
127*6236dae4SAndroid Build Coastguard Worker
128*6236dae4SAndroid Build Coastguard Worker if(U) {
129*6236dae4SAndroid Build Coastguard Worker FD_ZERO(&R);
130*6236dae4SAndroid Build Coastguard Worker FD_ZERO(&W);
131*6236dae4SAndroid Build Coastguard Worker FD_ZERO(&E);
132*6236dae4SAndroid Build Coastguard Worker
133*6236dae4SAndroid Build Coastguard Worker res_multi_fdset(cm, &R, &W, &E, &M);
134*6236dae4SAndroid Build Coastguard Worker if(res)
135*6236dae4SAndroid Build Coastguard Worker return res;
136*6236dae4SAndroid Build Coastguard Worker
137*6236dae4SAndroid Build Coastguard Worker /* At this point, M is guaranteed to be greater or equal than -1. */
138*6236dae4SAndroid Build Coastguard Worker
139*6236dae4SAndroid Build Coastguard Worker res_multi_timeout(cm, &L);
140*6236dae4SAndroid Build Coastguard Worker if(res)
141*6236dae4SAndroid Build Coastguard Worker return res;
142*6236dae4SAndroid Build Coastguard Worker
143*6236dae4SAndroid Build Coastguard Worker /* At this point, L is guaranteed to be greater or equal than -1. */
144*6236dae4SAndroid Build Coastguard Worker
145*6236dae4SAndroid Build Coastguard Worker if(L != -1) {
146*6236dae4SAndroid Build Coastguard Worker int itimeout;
147*6236dae4SAndroid Build Coastguard Worker #if LONG_MAX > INT_MAX
148*6236dae4SAndroid Build Coastguard Worker itimeout = (L > INT_MAX) ? INT_MAX : (int)L;
149*6236dae4SAndroid Build Coastguard Worker #else
150*6236dae4SAndroid Build Coastguard Worker itimeout = (int)L;
151*6236dae4SAndroid Build Coastguard Worker #endif
152*6236dae4SAndroid Build Coastguard Worker T.tv_sec = itimeout/1000;
153*6236dae4SAndroid Build Coastguard Worker T.tv_usec = (itimeout%1000)*1000;
154*6236dae4SAndroid Build Coastguard Worker }
155*6236dae4SAndroid Build Coastguard Worker else {
156*6236dae4SAndroid Build Coastguard Worker T.tv_sec = 5;
157*6236dae4SAndroid Build Coastguard Worker T.tv_usec = 0;
158*6236dae4SAndroid Build Coastguard Worker }
159*6236dae4SAndroid Build Coastguard Worker
160*6236dae4SAndroid Build Coastguard Worker res_select_test(M + 1, &R, &W, &E, &T);
161*6236dae4SAndroid Build Coastguard Worker if(res)
162*6236dae4SAndroid Build Coastguard Worker return res;
163*6236dae4SAndroid Build Coastguard Worker }
164*6236dae4SAndroid Build Coastguard Worker
165*6236dae4SAndroid Build Coastguard Worker while(1) {
166*6236dae4SAndroid Build Coastguard Worker msg = curl_multi_info_read(cm, &Q);
167*6236dae4SAndroid Build Coastguard Worker if(!msg)
168*6236dae4SAndroid Build Coastguard Worker break;
169*6236dae4SAndroid Build Coastguard Worker if(msg->msg == CURLMSG_DONE) {
170*6236dae4SAndroid Build Coastguard Worker int i;
171*6236dae4SAndroid Build Coastguard Worker CURL *e = msg->easy_handle;
172*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "R: %d - %s\n", (int)msg->data.result,
173*6236dae4SAndroid Build Coastguard Worker curl_easy_strerror(msg->data.result));
174*6236dae4SAndroid Build Coastguard Worker curl_multi_remove_handle(cm, e);
175*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(e);
176*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < NUM_HANDLES; i++) {
177*6236dae4SAndroid Build Coastguard Worker if(testeh[i] == e) {
178*6236dae4SAndroid Build Coastguard Worker testeh[i] = NULL;
179*6236dae4SAndroid Build Coastguard Worker break;
180*6236dae4SAndroid Build Coastguard Worker }
181*6236dae4SAndroid Build Coastguard Worker }
182*6236dae4SAndroid Build Coastguard Worker }
183*6236dae4SAndroid Build Coastguard Worker else
184*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "E: CURLMsg (%d)\n", (int)msg->msg);
185*6236dae4SAndroid Build Coastguard Worker }
186*6236dae4SAndroid Build Coastguard Worker
187*6236dae4SAndroid Build Coastguard Worker res_test_timedout();
188*6236dae4SAndroid Build Coastguard Worker if(res)
189*6236dae4SAndroid Build Coastguard Worker return res;
190*6236dae4SAndroid Build Coastguard Worker }
191*6236dae4SAndroid Build Coastguard Worker
192*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
193*6236dae4SAndroid Build Coastguard Worker }
194*6236dae4SAndroid Build Coastguard Worker
test(char * URL)195*6236dae4SAndroid Build Coastguard Worker CURLcode test(char *URL)
196*6236dae4SAndroid Build Coastguard Worker {
197*6236dae4SAndroid Build Coastguard Worker CURLM *cm = NULL;
198*6236dae4SAndroid Build Coastguard Worker struct curl_slist *headers = NULL;
199*6236dae4SAndroid Build Coastguard Worker char buffer[246]; /* naively fixed-size */
200*6236dae4SAndroid Build Coastguard Worker CURLcode res = CURLE_OK;
201*6236dae4SAndroid Build Coastguard Worker int i;
202*6236dae4SAndroid Build Coastguard Worker
203*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < NUM_HANDLES; i++)
204*6236dae4SAndroid Build Coastguard Worker testeh[i] = NULL;
205*6236dae4SAndroid Build Coastguard Worker
206*6236dae4SAndroid Build Coastguard Worker start_test_timing();
207*6236dae4SAndroid Build Coastguard Worker
208*6236dae4SAndroid Build Coastguard Worker if(test_argc < 4)
209*6236dae4SAndroid Build Coastguard Worker return (CURLcode)99;
210*6236dae4SAndroid Build Coastguard Worker
211*6236dae4SAndroid Build Coastguard Worker msnprintf(buffer, sizeof(buffer), "Host: %s", HOST);
212*6236dae4SAndroid Build Coastguard Worker
213*6236dae4SAndroid Build Coastguard Worker /* now add a custom Host: header */
214*6236dae4SAndroid Build Coastguard Worker headers = curl_slist_append(headers, buffer);
215*6236dae4SAndroid Build Coastguard Worker if(!headers) {
216*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "curl_slist_append() failed\n");
217*6236dae4SAndroid Build Coastguard Worker return TEST_ERR_MAJOR_BAD;
218*6236dae4SAndroid Build Coastguard Worker }
219*6236dae4SAndroid Build Coastguard Worker
220*6236dae4SAndroid Build Coastguard Worker res_global_init(CURL_GLOBAL_ALL);
221*6236dae4SAndroid Build Coastguard Worker if(res) {
222*6236dae4SAndroid Build Coastguard Worker curl_slist_free_all(headers);
223*6236dae4SAndroid Build Coastguard Worker return res;
224*6236dae4SAndroid Build Coastguard Worker }
225*6236dae4SAndroid Build Coastguard Worker
226*6236dae4SAndroid Build Coastguard Worker res_multi_init(cm);
227*6236dae4SAndroid Build Coastguard Worker if(res) {
228*6236dae4SAndroid Build Coastguard Worker curl_global_cleanup();
229*6236dae4SAndroid Build Coastguard Worker curl_slist_free_all(headers);
230*6236dae4SAndroid Build Coastguard Worker return res;
231*6236dae4SAndroid Build Coastguard Worker }
232*6236dae4SAndroid Build Coastguard Worker
233*6236dae4SAndroid Build Coastguard Worker res = loop(0, cm, URL, PROXYUSERPWD, headers);
234*6236dae4SAndroid Build Coastguard Worker if(res)
235*6236dae4SAndroid Build Coastguard Worker goto test_cleanup;
236*6236dae4SAndroid Build Coastguard Worker
237*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "lib540: now we do the request again\n");
238*6236dae4SAndroid Build Coastguard Worker
239*6236dae4SAndroid Build Coastguard Worker res = loop(1, cm, URL, PROXYUSERPWD, headers);
240*6236dae4SAndroid Build Coastguard Worker
241*6236dae4SAndroid Build Coastguard Worker test_cleanup:
242*6236dae4SAndroid Build Coastguard Worker
243*6236dae4SAndroid Build Coastguard Worker /* proper cleanup sequence - type PB */
244*6236dae4SAndroid Build Coastguard Worker
245*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < NUM_HANDLES; i++) {
246*6236dae4SAndroid Build Coastguard Worker curl_multi_remove_handle(cm, testeh[i]);
247*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(testeh[i]);
248*6236dae4SAndroid Build Coastguard Worker }
249*6236dae4SAndroid Build Coastguard Worker
250*6236dae4SAndroid Build Coastguard Worker curl_multi_cleanup(cm);
251*6236dae4SAndroid Build Coastguard Worker curl_global_cleanup();
252*6236dae4SAndroid Build Coastguard Worker
253*6236dae4SAndroid Build Coastguard Worker curl_slist_free_all(headers);
254*6236dae4SAndroid Build Coastguard Worker
255*6236dae4SAndroid Build Coastguard Worker return res;
256*6236dae4SAndroid Build Coastguard Worker }
257