1 /***************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
8 * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
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 http://curl.haxx.se/docs/copyright.html.
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.
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
21 ***************************************************************************/
24 #include <curl/mprintf.h>
28 static const char *HOSTHEADER = "Host: www.host.foo.com";
29 static const char *JAR = "log/jar506";
32 /* struct containing data of a thread */
46 static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess,
50 struct userdata *user = (struct userdata *)useptr;
57 case CURL_LOCK_DATA_SHARE:
61 case CURL_LOCK_DATA_DNS:
65 case CURL_LOCK_DATA_COOKIE:
70 fprintf(stderr, "lock: no such data: %d\n", (int)data);
74 /* detect locking of locked locks */
76 printf("lock: double locked %s\n", what);
81 printf("lock: %-6s [%s]: %d\n", what, user->text, user->counter);
86 static void my_unlock(CURL *handle, curl_lock_data data, void *useptr )
89 struct userdata *user = (struct userdata *)useptr;
93 case CURL_LOCK_DATA_SHARE:
97 case CURL_LOCK_DATA_DNS:
101 case CURL_LOCK_DATA_COOKIE:
106 fprintf(stderr, "unlock: no such data: %d\n", (int)data);
110 /* detect unlocking of unlocked locks */
112 printf("unlock: double unlocked %s\n", what);
117 printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
122 /* build host entry */
123 static struct curl_slist *sethost(struct curl_slist *headers)
126 return curl_slist_append(NULL, HOSTHEADER );
130 /* the dummy thread function */
131 static void *fire(void *ptr)
134 struct curl_slist *headers;
135 struct Tdata *tdata = (struct Tdata*)ptr;
139 if ((curl = curl_easy_init()) == NULL) {
140 fprintf(stderr, "curl_easy_init() failed\n");
144 headers = sethost(NULL);
145 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
146 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
147 curl_easy_setopt(curl, CURLOPT_URL, tdata->url);
148 printf( "CURLOPT_SHARE\n" );
149 curl_easy_setopt(curl, CURLOPT_SHARE, tdata->share);
151 printf( "PERFORM\n" );
152 code = curl_easy_perform(curl);
153 if( code != CURLE_OK ) {
154 fprintf(stderr, "perform url '%s' repeat %d failed, curlcode %d\n",
155 tdata->url, i, (int)code);
158 printf( "CLEANUP\n" );
159 curl_easy_cleanup(curl);
160 curl_slist_free_all(headers);
166 /* build request url */
167 static char *suburl(const char *base, int i)
169 return curl_maprintf("%s%.4d", base, i);
177 CURLSHcode scode = CURLSHE_OK;
178 CURLcode code = CURLE_OK;
183 struct curl_slist *headers = NULL;
184 struct curl_slist *cookies = NULL;
185 struct curl_slist *next_cookie = NULL;
187 struct userdata user;
189 user.text = (char *)"Pigs in space";
192 printf( "GLOBAL_INIT\n" );
193 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
194 fprintf(stderr, "curl_global_init() failed\n");
195 return TEST_ERR_MAJOR_BAD;
199 printf( "SHARE_INIT\n" );
200 if ((share = curl_share_init()) == NULL) {
201 fprintf(stderr, "curl_share_init() failed\n");
202 curl_global_cleanup();
203 return TEST_ERR_MAJOR_BAD;
206 if ( CURLSHE_OK == scode ) {
207 printf( "CURLSHOPT_LOCKFUNC\n" );
208 scode = curl_share_setopt( share, CURLSHOPT_LOCKFUNC, my_lock);
210 if ( CURLSHE_OK == scode ) {
211 printf( "CURLSHOPT_UNLOCKFUNC\n" );
212 scode = curl_share_setopt( share, CURLSHOPT_UNLOCKFUNC, my_unlock);
214 if ( CURLSHE_OK == scode ) {
215 printf( "CURLSHOPT_USERDATA\n" );
216 scode = curl_share_setopt( share, CURLSHOPT_USERDATA, &user);
218 if ( CURLSHE_OK == scode ) {
219 printf( "CURL_LOCK_DATA_COOKIE\n" );
220 scode = curl_share_setopt( share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
222 if ( CURLSHE_OK == scode ) {
223 printf( "CURL_LOCK_DATA_DNS\n" );
224 scode = curl_share_setopt( share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
227 if ( CURLSHE_OK != scode ) {
228 fprintf(stderr, "curl_share_setopt() failed\n");
229 curl_share_cleanup(share);
230 curl_global_cleanup();
231 return TEST_ERR_MAJOR_BAD;
234 /* initial cookie manipulation */
235 if ((curl = curl_easy_init()) == NULL) {
236 fprintf(stderr, "curl_easy_init() failed\n");
237 curl_share_cleanup(share);
238 curl_global_cleanup();
239 return TEST_ERR_MAJOR_BAD;
241 printf( "CURLOPT_SHARE\n" );
242 test_setopt( curl, CURLOPT_SHARE, share );
243 printf( "CURLOPT_COOKIELIST injected_and_clobbered\n" );
244 test_setopt( curl, CURLOPT_COOKIELIST,
245 "Set-Cookie: injected_and_clobbered=yes; "
246 "domain=host.foo.com; expires=Sat Feb 2 11:56:27 GMT 2030" );
247 printf( "CURLOPT_COOKIELIST ALL\n" );
248 test_setopt( curl, CURLOPT_COOKIELIST, "ALL" );
249 printf( "CURLOPT_COOKIELIST session\n" );
250 test_setopt( curl, CURLOPT_COOKIELIST, "Set-Cookie: session=elephants" );
251 printf( "CURLOPT_COOKIELIST injected\n" );
252 test_setopt( curl, CURLOPT_COOKIELIST,
253 "Set-Cookie: injected=yes; domain=host.foo.com; "
254 "expires=Sat Feb 2 11:56:27 GMT 2030" );
255 printf( "CURLOPT_COOKIELIST SESS\n" );
256 test_setopt( curl, CURLOPT_COOKIELIST, "SESS" );
257 printf( "CLEANUP\n" );
258 curl_easy_cleanup( curl );
264 for (i=1; i<=THREADS; i++ ) {
266 /* set thread data */
267 tdata.url = suburl( URL, i ); /* must be curl_free()d */
270 /* simulate thread, direct call of "thread" function */
271 printf( "*** run %d\n",i );
274 curl_free( tdata.url );
279 /* fetch a another one and save cookies */
280 printf( "*** run %d\n", i );
281 if ((curl = curl_easy_init()) == NULL) {
282 fprintf(stderr, "curl_easy_init() failed\n");
283 curl_share_cleanup(share);
284 curl_global_cleanup();
285 return TEST_ERR_MAJOR_BAD;
288 url = suburl( URL, i );
289 headers = sethost( NULL );
290 test_setopt( curl, CURLOPT_HTTPHEADER, headers );
291 test_setopt( curl, CURLOPT_URL, url );
292 printf( "CURLOPT_SHARE\n" );
293 test_setopt( curl, CURLOPT_SHARE, share );
294 printf( "CURLOPT_COOKIEJAR\n" );
295 test_setopt( curl, CURLOPT_COOKIEJAR, JAR );
296 printf( "CURLOPT_COOKIELIST FLUSH\n" );
297 test_setopt( curl, CURLOPT_COOKIELIST, "FLUSH" );
299 printf( "PERFORM\n" );
300 curl_easy_perform( curl );
302 printf( "CLEANUP\n" );
303 curl_easy_cleanup( curl );
305 curl_slist_free_all( headers );
308 if ((curl = curl_easy_init()) == NULL) {
309 fprintf(stderr, "curl_easy_init() failed\n");
310 curl_share_cleanup(share);
311 curl_global_cleanup();
312 return TEST_ERR_MAJOR_BAD;
314 url = suburl( URL, i );
315 headers = sethost( NULL );
316 test_setopt( curl, CURLOPT_HTTPHEADER, headers );
317 test_setopt( curl, CURLOPT_URL, url );
318 printf( "CURLOPT_SHARE\n" );
319 test_setopt( curl, CURLOPT_SHARE, share );
320 printf( "CURLOPT_COOKIELIST ALL\n" );
321 test_setopt( curl, CURLOPT_COOKIELIST, "ALL" );
322 printf( "CURLOPT_COOKIEJAR\n" );
323 test_setopt( curl, CURLOPT_COOKIEFILE, JAR );
324 printf( "CURLOPT_COOKIELIST RELOAD\n" );
325 test_setopt( curl, CURLOPT_COOKIELIST, "RELOAD" );
327 code = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
328 if ( code != CURLE_OK )
330 fprintf(stderr, "curl_easy_getinfo() failed\n");
331 res = TEST_ERR_MAJOR_BAD;
334 printf("loaded cookies:\n");
337 fprintf(stderr, " reloading cookies from '%s' failed\n", JAR);
338 res = TEST_ERR_MAJOR_BAD;
341 printf("-----------------\n");
342 next_cookie = cookies;
343 while ( next_cookie )
345 printf( " %s\n", next_cookie->data );
346 next_cookie = next_cookie->next;
348 printf("-----------------\n");
349 curl_slist_free_all( cookies );
351 /* try to free share, expect to fail because share is in use*/
352 printf( "try SHARE_CLEANUP...\n" );
353 scode = curl_share_cleanup( share );
354 if ( scode==CURLSHE_OK )
356 fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
359 printf( "SHARE_CLEANUP failed, correct\n" );
364 /* clean up last handle */
365 printf( "CLEANUP\n" );
366 curl_easy_cleanup( curl );
367 curl_slist_free_all( headers );
371 printf( "SHARE_CLEANUP\n" );
372 scode = curl_share_cleanup( share );
373 if ( scode!=CURLSHE_OK )
374 fprintf(stderr, "curl_share_cleanup failed, code errno %d\n",
377 printf( "GLOBAL_CLEANUP\n" );
378 curl_global_cleanup();