diff options
-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; +} |