6 const char *HOSTHEADER = "Host: www.host.foo.com";
7 const char *JAR = "log/jar506";
11 /* struct containing data of a thread */
23 void lock(CURL *handle, curl_lock_data data, curl_lock_access access,
27 struct userdata *user = (struct userdata *)useptr;
33 case CURL_LOCK_DATA_SHARE:
36 case CURL_LOCK_DATA_DNS:
39 case CURL_LOCK_DATA_COOKIE:
43 fprintf(stderr, "lock: no such data: %d\n",data);
46 printf("lock: %-6s <%s>: %d\n", what, user->text, user->counter);
51 void unlock(CURL *handle, curl_lock_data data, void *useptr )
54 struct userdata *user = (struct userdata *)useptr;
57 case CURL_LOCK_DATA_SHARE:
60 case CURL_LOCK_DATA_DNS:
63 case CURL_LOCK_DATA_COOKIE:
67 fprintf(stderr, "unlock: no such data: %d\n",data);
70 printf("unlock: %-6s <%s>: %d\n", what, user->text, user->counter);
75 /* build host entry */
76 struct curl_slist *sethost(struct curl_slist *headers)
79 return curl_slist_append(NULL, HOSTHEADER );
83 /* the dummy thread function */
87 struct curl_slist *headers;
88 struct Tdata *tdata = (struct Tdata*)ptr;
89 CURL *curl = curl_easy_init();
92 headers = sethost(NULL);
93 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
94 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, (void*)headers);
95 curl_easy_setopt(curl, CURLOPT_URL, (void*)tdata->url);
96 printf( "CURLOPT_SHARE\n" );
97 curl_easy_setopt(curl, CURLOPT_SHARE, (void*)tdata->share);
99 printf( "PERFORM\n" );
100 code = curl_easy_perform(curl);
101 if( code != CURLE_OK ) {
102 fprintf(stderr, "perform url '%s' repeat %d failed, curlcode %d\n",
103 tdata->url, i, code);
106 printf( "CLEANUP\n" );
107 curl_easy_cleanup(curl);
108 curl_slist_free_all(headers);
114 /* build request url */
115 char *suburl(char *base, int i)
117 int len = strlen(base);
118 char *url = (char *)malloc(len+5);
138 struct curl_slist *headers;
140 struct userdata user;
142 user.text = (char *)"Pigs in space";
145 printf( "GLOBAL_INIT\n" );
146 curl_global_init( CURL_GLOBAL_ALL );
149 printf( "SHARE_INIT\n" );
150 share = curl_share_init();
151 curl_share_setopt( share, CURLSHOPT_LOCKFUNC, lock);
152 curl_share_setopt( share, CURLSHOPT_UNLOCKFUNC, unlock);
153 curl_share_setopt( share, CURLSHOPT_USERDATA, &user);
154 printf( "CURL_LOCK_DATA_COOKIE\n" );
155 curl_share_setopt( share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
156 printf( "CURL_LOCK_DATA_DNS\n" );
157 curl_share_setopt( share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
162 for (i=1; i<=THREADS; i++ ) {
164 /* set thread data */
165 tdata.url = suburl( URL, i ); /* must be freed */
168 /* simulate thread, direct call of "thread" function */
169 printf( "*** run %d\n",i );
177 /* fetch a another one and save cookies */
178 printf( "*** run %d\n", i );
179 curl = curl_easy_init();
181 url = suburl( URL, i );
182 headers = sethost( NULL );
183 curl_easy_setopt( curl, CURLOPT_HTTPHEADER, (void*)headers );
184 curl_easy_setopt( curl, CURLOPT_URL, url );
185 printf( "CURLOPT_SHARE\n" );
186 curl_easy_setopt( curl, CURLOPT_SHARE, share );
187 printf( "CURLOPT_COOKIEJAR\n" );
188 curl_easy_setopt( curl, CURLOPT_COOKIEJAR, JAR );
190 printf( "PERFORM\n" );
191 curl_easy_perform( curl );
193 /* try to free share, expect to fail because share is in use*/
194 printf( "try SHARE_CLEANUP...\n" );
195 scode = curl_share_cleanup( share );
196 if ( scode==CURLSHE_OK )
198 fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
201 printf( "SHARE_CLEANUP failed, correct\n" );
204 /* clean up last handle */
205 printf( "CLEANUP\n" );
206 curl_easy_cleanup( curl );
207 curl_slist_free_all( headers );
212 printf( "SHARE_CLEANUP\n" );
213 scode = curl_share_cleanup( share );
214 if ( scode!=CURLSHE_OK )
216 fprintf(stderr, "curl_share_cleanup failed, code errno %d\n", scode);
219 printf( "GLOBAL_CLEANUP\n" );
220 curl_global_cleanup();