Add the --post-file option to send form data from a file.  As with
--post-data it's up to the user to ensure that the data is encoded
as appropriate:  all wget does is stuff the provided data into
the request.

The --post-data and --post-file options are mutually exclusive and
only one instance of either may be given.

Additionally:

- update the usage message to include missing details of the --post-data
  and --header options;

- free POST data if FEATURE_CLEAN_UP is enabled.

function                                             old     new   delta
packed_usage                                       34158   34214     +56
wget_main                                           2762    2805     +43
.rodata                                            99225   99240     +15
static.wget_longopts                                 266     278     +12
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/0 up/down: 126/0)             Total: 126 bytes

Signed-off-by: Ron Yorston <[email protected]>
---
 networking/wget.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/networking/wget.c b/networking/wget.c
index 6a9604421..ae24aa524 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -135,7 +135,8 @@
 
 //usage:#define wget_trivial_usage
 //usage:       IF_FEATURE_WGET_LONG_OPTIONS(
-//usage:       "[-cqS] [--spider] [-O FILE] [-o LOGFILE] [--header 'HEADER: 
VALUE'] [-Y on/off]\n"
+//usage:       "[-cqS] [--spider] [-O FILE] [-o LOGFILE] [--header STR]\n"
+//usage:       "       [--post-data STR | --post-file FILE] [-Y on/off]\n"
 /* Since we ignore these opts, we don't show them in --help */
 /* //usage:    "       [--no-cache] [--passive-ftp] [-t TRIES]" */
 /* //usage:    "       [-nv] [-nc] [-nH] [-np]" */
@@ -148,6 +149,9 @@
 //usage:       "Retrieve files via HTTP or FTP\n"
 //usage:       IF_FEATURE_WGET_LONG_OPTIONS(
 //usage:     "\n       --spider        Only check URL existence: $? is 0 if 
exists"
+//usage:     "\n       --header STR    Add STR (of form 'header: value') to 
headers"
+//usage:     "\n       --post-data STR Send STR using POST method"
+//usage:     "\n       --post-file FILE        Send FILE using POST method"
 //usage:       IF_FEATURE_WGET_OPENSSL(
 //usage:     "\n       --no-check-certificate  Don't validate the server's 
certificate"
 //usage:       )
@@ -244,6 +248,7 @@ struct globals {
        char *dir_prefix;
 #if ENABLE_FEATURE_WGET_LONG_OPTIONS
        char *post_data;
+       char *post_file;
        char *extra_headers;
        unsigned char user_headers; /* Headers mentioned by the user */
 #endif
@@ -292,10 +297,13 @@ enum {
        WGET_OPT_POST_DATA  = (1 << 12) * ENABLE_FEATURE_WGET_LONG_OPTIONS,
        WGET_OPT_SPIDER     = (1 << 13) * ENABLE_FEATURE_WGET_LONG_OPTIONS,
        WGET_OPT_NO_CHECK_CERT = (1 << 14) * ENABLE_FEATURE_WGET_LONG_OPTIONS,
+       WGET_OPT_POST_FILE  = (1 << 15) * ENABLE_FEATURE_WGET_LONG_OPTIONS,
        /* hijack this bit for other than opts purposes: */
        WGET_NO_FTRUNCATE   = (1 << 31)
 };
 
+#define WGET_OPT_POST (WGET_OPT_POST_DATA | WGET_OPT_POST_FILE)
+
 enum {
        PROGRESS_START = -1,
        PROGRESS_END   = 0,
@@ -1213,7 +1221,7 @@ static void download_one_url(const char *url)
                                target.path);
                } else {
                        SENDFMT(sfp, "%s /%s HTTP/1.1\r\n",
-                               (option_mask32 & WGET_OPT_POST_DATA) ? "POST" : 
"GET",
+                               (option_mask32 & WGET_OPT_POST) ? "POST" : 
"GET",
                                target.path);
                }
                if (!USR_HEADER_HOST)
@@ -1246,7 +1254,13 @@ static void download_one_url(const char *url)
                        fputs(G.extra_headers, sfp);
                }
 
-               if (option_mask32 & WGET_OPT_POST_DATA) {
+               if (option_mask32 & WGET_OPT_POST_FILE) {
+                       int fd = xopen_stdin(G.post_file);
+                       G.post_data = xmalloc_read(fd, NULL);
+                       close(fd);
+               }
+
+               if (G.post_data) {
                        SENDFMT(sfp,
                                "Content-Type: 
application/x-www-form-urlencoded\r\n"
                                "Content-Length: %u\r\n"
@@ -1489,6 +1503,7 @@ IF_DESKTOP(       "tries\0"            Required_argument 
"t")
                "post-data\0"        Required_argument "\xfe"
                "spider\0"           No_argument       "\xfd"
                "no-check-certificate\0" No_argument   "\xfc"
+               "post-file\0"        Required_argument "\xfb"
                /* Ignored (we always use PASV): */
 IF_DESKTOP(    "passive-ftp\0"      No_argument       "\xf0")
                /* Ignored (we don't support caching) */
@@ -1532,6 +1547,9 @@ IF_DESKTOP(       "no-parent\0"        No_argument       
"\xf0")
                 */
                "\0"
                "-1" /* at least one URL */
+               IF_FEATURE_WGET_LONG_OPTIONS(":\xfe--\xfb")
+               IF_FEATURE_WGET_LONG_OPTIONS(":\xfe--\xfe")
+               IF_FEATURE_WGET_LONG_OPTIONS(":\xfb--\xfb")
                IF_FEATURE_WGET_LONG_OPTIONS(":\xff::") /* --header is a list */
                LONGOPTS
                , &G.fname_out, &G.fname_log, &G.dir_prefix,
@@ -1541,6 +1559,7 @@ IF_DESKTOP(       "no-parent\0"        No_argument       
"\xf0")
                NULL  /* -n[ARG] */
                IF_FEATURE_WGET_LONG_OPTIONS(, &headers_llist)
                IF_FEATURE_WGET_LONG_OPTIONS(, &G.post_data)
+               IF_FEATURE_WGET_LONG_OPTIONS(, &G.post_file)
        );
 #if 0 /* option bits debug */
        if (option_mask32 & WGET_OPT_RETRIES) bb_error_msg("-t NUM");
@@ -1549,6 +1568,7 @@ IF_DESKTOP(       "no-parent\0"        No_argument       
"\xf0")
        if (option_mask32 & WGET_OPT_POST_DATA) bb_error_msg("--post-data");
        if (option_mask32 & WGET_OPT_SPIDER) bb_error_msg("--spider");
        if (option_mask32 & WGET_OPT_NO_CHECK_CERT) 
bb_error_msg("--no-check-certificate");
+       if (option_mask32 & WGET_OPT_POST_FILE) bb_error_msg("--post-file");
        exit(0);
 #endif
        argv += optind;
@@ -1617,6 +1637,8 @@ IF_DESKTOP(       "no-parent\0"        No_argument       
"\xf0")
 
 #if ENABLE_FEATURE_CLEAN_UP && ENABLE_FEATURE_WGET_LONG_OPTIONS
        free(G.extra_headers);
+       free(G.post_data);
+       free(G.post_file);
 #endif
        FINI_G();
 
-- 
2.31.1

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to