xref: /aosp_15_r20/external/curl/tests/libtest/lib540.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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