From 37f4877e569cdd0d1afa6bb0d7cd3a463ee75ac9 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sat, 24 Jun 2006 21:46:41 +0000 Subject: Michael Wallner added curl_formget(), which allows an application to extract (serialise) a previously built formpost (as with curl_formadd()). --- CHANGES | 4 +++ RELEASE-NOTES | 3 ++- docs/libcurl/Makefile.am | 8 +++--- docs/libcurl/curl_formget.3 | 49 ++++++++++++++++++++++++++++++++++++ include/curl/curl.h | 20 +++++++++++++++ lib/formdata.c | 60 +++++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 docs/libcurl/curl_formget.3 diff --git a/CHANGES b/CHANGES index 6cf3d624f..e4bd7d90e 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,10 @@ Changelog +Daniel (24 June 2006) +- Michael Wallner added curl_formget(), which allows an application to extract + (serialise) a previously built formpost (as with curl_formadd()). + Daniel (23 June 2006) - Arve Knudsen found a flaw in curl_multi_fdset() for systems where curl_socket_t is unsigned (like Windows) that could cause it to wrongly diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 03bf9a6a1..cff353ced 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -11,6 +11,7 @@ Curl and libcurl 7.15.5 This release includes the following changes: + o added curl_formget() o added CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE o configure --enable-hidden-symbols @@ -31,6 +32,6 @@ New curl mirrors: This release would not have looked like this without help, code, reports and advice from friends like these: - Dan Fandrich, Peter Silva, Arve Knudsen + Dan Fandrich, Peter Silva, Arve Knudsen, Michael Wallner Thanks! (and sorry if I forgot to mention someone) diff --git a/docs/libcurl/Makefile.am b/docs/libcurl/Makefile.am index 85dd281eb..e43a0b67c 100644 --- a/docs/libcurl/Makefile.am +++ b/docs/libcurl/Makefile.am @@ -18,7 +18,7 @@ man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \ curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3 \ libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3 \ curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \ - curl_multi_timeout.3 + curl_multi_timeout.3 curl_formget.3 HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \ curl_easy_init.html curl_easy_perform.html curl_easy_setopt.html \ @@ -35,7 +35,8 @@ HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \ libcurl-errors.html curl_easy_strerror.html curl_multi_strerror.html \ curl_share_strerror.html curl_global_init_mem.html libcurl-tutorial.html \ curl_easy_reset.html curl_easy_escape.html curl_easy_unescape.html \ - curl_multi_setopt.html curl_multi_socket.html curl_multi_timeout.html + curl_multi_setopt.html curl_multi_socket.html curl_multi_timeout.html \ + curl_formget.html PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf curl_easy_init.pdf \ curl_easy_perform.pdf curl_easy_setopt.pdf curl_easy_duphandle.pdf \ @@ -51,7 +52,8 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf curl_easy_init.pdf \ libcurl-errors.pdf curl_easy_strerror.pdf curl_multi_strerror.pdf \ curl_share_strerror.pdf curl_global_init_mem.pdf libcurl-tutorial.pdf \ curl_easy_reset.pdf curl_easy_escape.pdf curl_easy_unescape.pdf \ - curl_multi_setopt.pdf curl_multi_socket.pdf curl_multi_timeout.pdf + curl_multi_setopt.pdf curl_multi_socket.pdf curl_multi_timeout.pdf \ + curl_formget.pdf CLEANFILES = $(HTMLPAGES) $(PDFPAGES) diff --git a/docs/libcurl/curl_formget.3 b/docs/libcurl/curl_formget.3 new file mode 100644 index 000000000..b0aad3670 --- /dev/null +++ b/docs/libcurl/curl_formget.3 @@ -0,0 +1,49 @@ +.\" You can view this file with: +.\" nroff -man [file] +.\" $Id$ +.\" +.TH curl_formget 3 "20 June 2006" "libcurl 7.15.5" "libcurl Manual" +.SH NAME +curl_formget - serialize a previously build multipart/formdata HTTP POST chain +.SH SYNOPSIS +.B #include +.sp +.BI "void curl_formget(struct curl_httppost *" form, " void *" arg, +.BI " curl_formget_callback " append); +.ad +.SH DESCRIPTION +curl_formget() is used to serialize data previously built/appended with +\fIcurl_formadd(3)\fP. Accepts a void pointer as second argument which will be +passed to the curl_formget_callback function. + +.B "typedef size_t (*curl_formget_callback)(void *" arg, " const char *" buf, +.B " size_t " len); +.nf + +The curl_formget_callback will be executed for each part of the httppost +struct. The void *arg pointer will be the one passed as second argument to +curl_formget(). The character buffer passed to it must not be freed. The +callback should return the buffer length passed to it on success. +.SH RETURN VALUE +0 means everything was ok, non-zero means an error occurred +.SH EXAMPLE +.nf + + size_t print_httppost_callback(void *arg, const char *buf, size_t len) + { + fwrite(buf, len, 1, stdout); + (*(size_t *) arg) += len; + return len; + } + size_t print_httppost(struct curl_httppost *post) + { + size_t total_size = 0; + if(curl_formget(post, &total_size, out)) { + return (size_t) -1; + } + return total_size; + } +.SH AVAILABILITY +This function was added in libcurl 7.15.5 +.SH "SEE ALSO" +.BR curl_formadd "(3) " diff --git a/include/curl/curl.h b/include/curl/curl.h index 79e71ca0a..1a118a36c 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -1158,6 +1158,26 @@ CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, struct curl_httppost **last_post, ...); +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); /* * NAME curl_formfree() * diff --git a/lib/formdata.c b/lib/formdata.c index 86c297745..0fbb23aa7 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -137,6 +137,8 @@ Content-Disposition: form-data; name="FILECONTENT" char *basename(char *path); #endif +static size_t readfromfile(struct Form *form, char *buffer, size_t size); + /* What kind of Content-Type to use on un-specified files with unrecognized extensions. */ #define HTTPPOST_CONTENTTYPE_DEFAULT "application/octet-stream" @@ -885,6 +887,51 @@ void Curl_formclean(struct FormData *form) } while((form=next)); /* continue */ } +/* + * curl_formget() + * Serialize a curl_httppost struct. + * Returns 0 on success. + */ +int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append) +{ + CURLFORMcode rc; + curl_off_t size; + struct FormData *data, *ptr; + + if ((rc = Curl_getFormData(&data, form, &size))) { + return (int)rc; + } + + for (ptr = data; ptr; ptr = ptr->next) { + if (ptr->type == FORM_FILE) { + char buffer[8192]; + size_t read; + struct Form temp; + + Curl_FormInit(&temp, ptr); + + do { + read = readfromfile(&temp, buffer, sizeof(buffer)); + if ((read == (size_t) -1) || (read != append(arg, buffer, read))) { + if (temp.fp) { + fclose(temp.fp); + } + Curl_formclean(data); + return -1; + } + } while (read == sizeof(buffer)); + } else { + if (ptr->length != append(arg, ptr->line, ptr->length)) { + Curl_formclean(data); + return -1; + } + } + } + Curl_formclean(data); + return 0; +} + /* * curl_formfree() is an external function to free up a whole form post * chain @@ -1284,7 +1331,7 @@ static size_t readfromfile(struct Form *form, char *buffer, size_t size) nread = fread(buffer, 1, size, form->fp); if(nread != size) { - /* this is the last chunk form the file, move on */ + /* this is the last chunk from the file, move on */ fclose(form->fp); form->fp = NULL; form->data = form->data->next; @@ -1527,6 +1574,15 @@ CURLFORMcode curl_formadd(struct curl_httppost **httppost, return CURL_FORMADD_DISABLED; } +CURLFORMCode curl_formget(struct curl_httppost *post, void *arg, + curl_formget_callback append) +{ + (void) post; + (void) arg; + (void) append; + return CURL_FORMADD_DISABLED; +} + void curl_formfree(struct curl_httppost *form) { (void)form; -- cgit v1.2.3