From 3bbf694d5a40a26a9eb8c261498048182508a7ca Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 6 May 2002 13:38:28 +0000 Subject: Added multi-post.c, based on the source file posted by Gustaf Hui --- docs/examples/Makefile.am | 2 +- docs/examples/multi-post.c | 126 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 docs/examples/multi-post.c diff --git a/docs/examples/Makefile.am b/docs/examples/Makefile.am index c6dcdf215..13634302e 100644 --- a/docs/examples/Makefile.am +++ b/docs/examples/Makefile.am @@ -8,7 +8,7 @@ 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 post-callback.c \ - multi-app.c multi-double.c multi-single.c + multi-app.c multi-double.c multi-single.c multi-post.c all: @echo "done" diff --git a/docs/examples/multi-post.c b/docs/examples/multi-post.c new file mode 100644 index 000000000..b5a436449 --- /dev/null +++ b/docs/examples/multi-post.c @@ -0,0 +1,126 @@ +/***************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * $Id$ + * + * This is an example application source code using the multi interface + * to do a multipart formpost without "blocking". + */ +#include +#include +#include + +#include + +int main(int argc, char *argv[]) +{ + CURL *curl; + CURLcode res; + + CURLM *multi_handle; + int still_running; + + struct HttpPost *formpost=NULL; + struct HttpPost *lastptr=NULL; + struct curl_slist *headerlist=NULL; + char buf[] = "Expect:"; + + /* Fill in the file upload field */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "sendfile", + CURLFORM_FILE, "postit2.c", + CURLFORM_END); + + /* Fill in the filename field */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "filename", + CURLFORM_COPYCONTENTS, "postit2.c", + CURLFORM_END); + + + /* Fill in the submit field too, even if this is rarely needed */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "submit", + CURLFORM_COPYCONTENTS, "send", + CURLFORM_END); + + curl = curl_easy_init(); + multi_handle = curl_multi_init(); + + /* initalize custom header list (stating that Expect: 100-continue is not + wanted */ + headerlist = curl_slist_append(headerlist, buf); + if(curl && multi_handle) { + int perform=0; + + /* what URL that receives this POST */ + curl_easy_setopt(curl, CURLOPT_URL, + "http://www.fillinyoururl.com/upload.cgi"); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); + curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); + + curl_multi_add_handle(multi_handle, curl); + + while(CURLM_CALL_MULTI_PERFORM == + curl_multi_perform(multi_handle, &still_running)); + + while(still_running) { + struct timeval timeout; + int rc; /* select() return code */ + + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + int maxfd; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* set a suitable timeout to play around with */ + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + /* get file descriptors from the transfers */ + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + + switch(rc) { + case -1: + /* select error */ + break; + case 0: + printf("timeout!\n"); + default: + /* timeout or readable/writable sockets */ + printf("perform!\n"); + while(CURLM_CALL_MULTI_PERFORM == + curl_multi_perform(multi_handle, &still_running)); + printf("running: %d!\n", still_running); + break; + } + } + + curl_multi_cleanup(multi_handle); + + /* always cleanup */ + curl_easy_cleanup(curl); + + /* then cleanup the formpost chain */ + curl_formfree(formpost); + + /* free slist */ + curl_slist_free_all (headerlist); + } + return 0; +} -- cgit v1.2.3