diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/examples/Makefile.am | 2 | ||||
| -rw-r--r-- | docs/examples/post-callback.c | 89 | 
2 files changed, 90 insertions, 1 deletions
diff --git a/docs/examples/Makefile.am b/docs/examples/Makefile.am index a2a8417b3..67b8d41c3 100644 --- a/docs/examples/Makefile.am +++ b/docs/examples/Makefile.am @@ -7,7 +7,7 @@ AUTOMAKE_OPTIONS = foreign no-dependencies  EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \  	     win32sockets.c persistant.c ftpget.c Makefile.example \  	     multithread.c getinmemory.c ftpupload.c httpput.c \ -	     simplessl.c ftpgetresp.c http-post.c +	     simplessl.c ftpgetresp.c http-post.c post-callback.c  all:  	@echo "done" diff --git a/docs/examples/post-callback.c b/docs/examples/post-callback.c new file mode 100644 index 000000000..d4664a575 --- /dev/null +++ b/docs/examples/post-callback.c @@ -0,0 +1,89 @@ +/***************************************************************************** + *                                  _   _ ____  _      + *  Project                     ___| | | |  _ \| |     + *                             / __| | | | |_) | |     + *                            | (__| |_| |  _ <| |___  + *                             \___|\___/|_| \_\_____| + * + * $Id$ + * + * An example source code that issues a HTTP POST and we provide the actual + * data through a read callback. + * + * Please be aware of the fact that the size of the posted data MUST be + * specified before the transfer is being made (with CURLOPT_POSTFIELDSIZE). + * This requirement will change when libcurl starts supporting chunked-encoded + * sends. + * + * This example requires libcurl 7.9.6 or later. + */ +#include <stdio.h> +#include <string.h> +#include <curl/curl.h> + +#if LIBCURL_VERSION_NUM < 0x070906 +#error this example source requires libcurl 7.9.6 or newer +#endif + +char data[]="this is what we post to the silly web server"; + +struct WriteThis { +  char *readptr; +  int sizeleft; +}; + +size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp) +{ +  struct WriteThis *pooh = (struct WriteThis *)userp; + +  if(size*nmemb < 1) +    return 0; + +  if(pooh->sizeleft) { +    *(char *)ptr = pooh->readptr[0]; /* copy one single byte */ +    pooh->readptr++;                 /* advance pointer */ +    pooh->sizeleft--;                /* less data left */ +    return 1;                        /* we return 1 byte at a time! */ +  } + +  return -1;                         /* no more data left to deliver */ +} + +int main(void) +{ +  CURL *curl; +  CURLcode res; + +  struct WriteThis pooh; + +  pooh.readptr = data; +  pooh.sizeleft = strlen(data); + +  curl = curl_easy_init(); +  if(curl) { +    /* First set the URL that is about to receive our POST. */ +    curl_easy_setopt(curl, CURLOPT_URL, +                     "http://receivingsite.com.pooh/index.cgi"); +    /* Now specify we want to POST data */ +    curl_easy_setopt(curl, CURLOPT_POST, TRUE); + +    /* Set the expected POST size */ +    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, pooh.sizeleft); + +    /* we want to use our own read function */ +    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); + +    /* pointer to pass to our read function */ +    curl_easy_setopt(curl, CURLOPT_INFILE, &pooh); + +    /* get verbose debug output please */ +    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + +    /* Perform the request, res will get the return code */ +    res = curl_easy_perform(curl); + +    /* always cleanup */ +    curl_easy_cleanup(curl); +  } +  return 0; +}  | 
