Hi, I am attaching a sample program I have written to show usage of the curl_easy_pause() API in my code. This sample program is not working as expected. Please let me know if the usage of the API in my program is correct or wrong. The *current output of the program* is below:*---- paused the curl handle for perform * *---- added the timer for 1sec * *---- came to curl header callback * *---- came to curl callback with data: * *---- added the timer for 1sec again* *---- added the timer for 1sec again* *---- added the timer for 1sec again* *---- continued the curl handle for perform *
The *output that I am looking* for should be something like below: *---- paused the curl handle for perform * *---- added the timer for 1sec * *---- added the timer for 1sec again* *---- added the timer for 1sec again* *---- added the timer for 1sec again* *---- continued the curl handle for perform * *---- came to curl header callback * *---- came to curl callback with data: * Thanks in advance, Ravi On Thu, Oct 15, 2009 at 1:14 PM, Ravi Kasibhatla <kasibhatla.r...@gmail.com>wrote: > Thanks Daniel for the clarification. > In that scenario, the curl behavior in my code is not correct, because for > me the callbacks are getting called even when the curl handle is in paused > state. Can somebody point to me any example/test case, which shows how to > use the api curl_easy_pause()? I searched for the example but couldn't find > any. > > I am using the latest curl release i.e. 7.19.5 for my testing. I have also > tested the same scenario with curl release 7.18.2. > > Thanks in advance, > Ravi > > > On Wed, Oct 14, 2009 at 8:31 AM, Daniel Stenberg <dan...@haxx.se> wrote: > >> On Wed, 7 Oct 2009, Ravi Kasibhatla wrote: >> >> I have a query regarding the usage of the function curl_easy_pause(). In >>> my code, I have defined all the 3 curl callbacks i.e. header, write & read. >>> For some condition I am calling curl_easy_pause() with CURLPAUSE_ALL mask >>> value for a curl handle. After that also, I see the invocation of header >>> callback by curl for that curl handle. Is this the expected behavior? >>> >> >> No. >> >> From the given documentation, I came to the understanding that the API >>> would just stop the calling of the read & write callbacks only (based on the >>> mask value set). The curl header callback would be called irrespective of >>> whether the curl handle is in paused state or not. >>> >> >> No, the header callback is just a special write callback so a paused >> transfer shouldn't call that either. >> >> -- >> >> / daniel.haxx.se >> >> ------------------------------------------------------------------- >> List admin: http://cool.haxx.se/list/listinfo/curl-library >> Etiquette: http://curl.haxx.se/mail/etiquette.html >> > >
/********* Sample code generated by the curl command line tool ********** * Lines with [REMARK] below might need to be modified to make this code * usable. Add error code checking where appropriate. * Compile this with a suitable header include path. Then link with * libcurl. * If you use any *_LARGE options, make sure your compiler figure * out the correct size for the curl_off_t variable. * Read the details for all curl_easy_setopt() options online on: * http://curlm.haxx.se/libcurl/c/curl_easy_setopt.html ************************************************************************/ #define _FILE_OFFSET_BITS 64 /* for pre libcurl 7.19.0 curl_off_t magic */ #include <curl/curl.h> #include <gtk/gtk.h> #include <stdio.h> #include <string.h> enum { HEADER, WRITE, READ }; struct __data { int timeout_count; int callback_type; char function_name[128]; }; typedef struct __data data_t; static CURL *hnd; static data_t timer_data, hdr_cb, write_cb, read_cb; static gboolean pause_timeoutadd(gpointer data) { data_t* timerdata = (data_t*)data; if(timerdata->timeout_count < 4) { timerdata->timeout_count++; g_timeout_add(1000, pause_timeoutadd, (gpointer)timerdata); printf("---- added the timer for 1sec again\n"); } else { curl_easy_pause(hnd, CURLPAUSE_CONT); printf("---- continued the curl handle for perform \n"); //curl_easy_perform(hnd); } return FALSE; } static void printstruct(data_t* curr) { printf("current data_t ptr %x\ntimeout count: %d\ncallback type: %d\nfunction name: %s\n", curr, curr->timeout_count, curr->callback_type, curr->function_name); } static size_t curl_headercallback( void *ptr, size_t size, size_t nmemb, void *stream) { data_t *data = (data_t *)stream; printf("---- came to curl header callback \n"); //printf("---- came to curl callback with data: \n timer_count: %d\n callback type: %d\n function_name: %s\n", // data->timeout_count, data->callback_type, data->function_name); return size*nmemb; } static size_t curl_writecallback( void *ptr, size_t size, size_t nmemb, void *stream) { data_t *data = (data_t *)stream; printf("---- came to curl callback with data: \n timer_count: %d\n callback type: %d\n function_name: %s\n", data->timeout_count, data->callback_type, data->function_name); return size*nmemb; } static size_t curl_readcallback( void *ptr, size_t size, size_t nmemb, void *stream) { data_t *data = (data_t *)stream; printf("---- came to curl callback with data: \n timer_count: %d\n callback type: %d\n function_name: %s\n", data->timeout_count, data->callback_type, data->function_name); return size*nmemb; } int main(int argc, char *argv[]) { CURLcode ret; hnd = curl_easy_init(); gtk_init(&argc, &argv); memset(&hdr_cb, 0, sizeof(data_t)); hdr_cb.callback_type = HEADER; strcpy(hdr_cb.function_name, "curl_headercallback"); printstruct(&hdr_cb); curl_easy_setopt(hnd, CURLOPT_WRITEHEADER, &hdr_cb); curl_easy_setopt(hnd, CURLOPT_HEADERFUNCTION, curl_headercallback); memset(&write_cb, 0, sizeof(data_t)); write_cb.callback_type = WRITE; strcpy(write_cb.function_name, "curl_writecallback"); printstruct(&write_cb); curl_easy_setopt(hnd, CURLOPT_WRITEDATA, &write_cb); curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, curl_writecallback); memset(&read_cb, 0, sizeof(data_t)); read_cb.callback_type = READ; strcpy(read_cb.function_name, "curl_readcallback"); printstruct(&read_cb); curl_easy_setopt(hnd, CURLOPT_READDATA, &read_cb); curl_easy_setopt(hnd, CURLOPT_READFUNCTION, curl_readcallback); /* curl_easy_setopt(hnd, CURLOPT_SEEKDATA, 0xbf95af74); [REMARK] */ /* curl_easy_setopt(hnd, CURLOPT_SEEKFUNCTION, 0x804deb0); [REMARK] */ curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)-1); curl_easy_setopt(hnd, CURLOPT_URL, "www.rediff.com"); curl_easy_setopt(hnd, CURLOPT_PROXY, "172.17.1.16:8080"); curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1); curl_easy_setopt(hnd, CURLOPT_HEADER, 0); curl_easy_setopt(hnd, CURLOPT_FAILONERROR, 0); curl_easy_setopt(hnd, CURLOPT_UPLOAD, 0); curl_easy_setopt(hnd, CURLOPT_DIRLISTONLY, 0); curl_easy_setopt(hnd, CURLOPT_APPEND, 0); curl_easy_setopt(hnd, CURLOPT_NETRC, 0); curl_easy_setopt(hnd, CURLOPT_FOLLOWLOCATION, 0); curl_easy_setopt(hnd, CURLOPT_UNRESTRICTED_AUTH, 0); curl_easy_setopt(hnd, CURLOPT_TRANSFERTEXT, 0); curl_easy_setopt(hnd, CURLOPT_USERPWD, NULL); curl_easy_setopt(hnd, CURLOPT_PROXYUSERPWD, NULL); curl_easy_setopt(hnd, CURLOPT_NOPROXY, NULL); curl_easy_setopt(hnd, CURLOPT_RANGE, NULL); /* curl_easy_setopt(hnd, CURLOPT_ERRORBUFFER, 0xbf95b0a4); [REMARK] */ curl_easy_setopt(hnd, CURLOPT_TIMEOUT, 0); curl_easy_setopt(hnd, CURLOPT_REFERER, NULL); curl_easy_setopt(hnd, CURLOPT_AUTOREFERER, 0); curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.19.6 (i686-pc-linux-gnu) libcurl/7.19.6 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1"); curl_easy_setopt(hnd, CURLOPT_FTPPORT, NULL); curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_LIMIT, 0); curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_TIME, 0); curl_easy_setopt(hnd, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t)0); curl_easy_setopt(hnd, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t)0); curl_easy_setopt(hnd, CURLOPT_RESUME_FROM_LARGE, (curl_off_t)0); curl_easy_setopt(hnd, CURLOPT_COOKIE, NULL); curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, NULL); curl_easy_setopt(hnd, CURLOPT_SSLCERT, NULL); curl_easy_setopt(hnd, CURLOPT_SSLCERTTYPE, NULL); curl_easy_setopt(hnd, CURLOPT_SSLKEY, NULL); curl_easy_setopt(hnd, CURLOPT_SSLKEYTYPE, NULL); curl_easy_setopt(hnd, CURLOPT_KEYPASSWD, NULL); curl_easy_setopt(hnd, CURLOPT_SSH_PRIVATE_KEYFILE, NULL); curl_easy_setopt(hnd, CURLOPT_SSH_PUBLIC_KEYFILE, NULL); curl_easy_setopt(hnd, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, NULL); curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 2); curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS, "/home/azingo/.ssh/known_hosts"); curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50); curl_easy_setopt(hnd, CURLOPT_CRLF, 0); curl_easy_setopt(hnd, CURLOPT_QUOTE, NULL); curl_easy_setopt(hnd, CURLOPT_POSTQUOTE, NULL); curl_easy_setopt(hnd, CURLOPT_PREQUOTE, NULL); curl_easy_setopt(hnd, CURLOPT_WRITEHEADER, NULL); curl_easy_setopt(hnd, CURLOPT_COOKIEFILE, NULL); curl_easy_setopt(hnd, CURLOPT_COOKIESESSION, 0); curl_easy_setopt(hnd, CURLOPT_SSLVERSION, 0); curl_easy_setopt(hnd, CURLOPT_TIMECONDITION, 0); curl_easy_setopt(hnd, CURLOPT_TIMEVALUE, 0); curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, NULL); /* curl_easy_setopt(hnd, CURLOPT_STDERR, 0xb7d21580); [REMARK] */ curl_easy_setopt(hnd, CURLOPT_HTTPPROXYTUNNEL, 0); curl_easy_setopt(hnd, CURLOPT_INTERFACE, NULL); curl_easy_setopt(hnd, CURLOPT_KRBLEVEL, NULL); curl_easy_setopt(hnd, CURLOPT_TELNETOPTIONS, NULL); curl_easy_setopt(hnd, CURLOPT_RANDOM_FILE, NULL); curl_easy_setopt(hnd, CURLOPT_EGDSOCKET, NULL); curl_easy_setopt(hnd, CURLOPT_CONNECTTIMEOUT, 0); curl_easy_setopt(hnd, CURLOPT_ENCODING, NULL); curl_easy_setopt(hnd, CURLOPT_FTP_CREATE_MISSING_DIRS, 0); curl_easy_setopt(hnd, CURLOPT_IPRESOLVE, 0); curl_easy_setopt(hnd, CURLOPT_FTP_ACCOUNT, NULL); curl_easy_setopt(hnd, CURLOPT_IGNORE_CONTENT_LENGTH, 0); curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 0); curl_easy_setopt(hnd, CURLOPT_FTP_FILEMETHOD, 0); curl_easy_setopt(hnd, CURLOPT_FTP_ALTERNATIVE_TO_USER, NULL); curl_easy_setopt(hnd, CURLOPT_SSL_SESSIONID_CACHE, 1); /* curl_easy_setopt(hnd, CURLOPT_SOCKOPTFUNCTION, 0x804d760); [REMARK] */ /* curl_easy_setopt(hnd, CURLOPT_SOCKOPTDATA, 0xbf95acf0); [REMARK] */ curl_easy_setopt(hnd, CURLOPT_POSTREDIR, 0); ret = curl_easy_pause(hnd, CURLPAUSE_ALL); printf("---- paused the curl handle for perform \n"); if(ret == CURLE_OK) { memset(&timer_data, 0, sizeof(data_t)); timer_data.timeout_count = 1; printstruct(&timer_data); g_timeout_add(1000, pause_timeoutadd, &timer_data); printf("---- added the timer for 1sec \n"); //int timer_id = g_timeout_add(1000, pause_timeoutadd, &timer_data); //if(timer_id) // sleep(5000); } ret = curl_easy_perform(hnd); gtk_main(); curl_easy_cleanup(hnd); return (int)ret; } /**** End of sample code ****/
------------------------------------------------------------------- List admin: http://cool.haxx.se/list/listinfo/curl-library Etiquette: http://curl.haxx.se/mail/etiquette.html