aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/examples/Makefile.am2
-rw-r--r--docs/examples/post-callback.c89
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;
+}