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