X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fmain.c;h=c895c4eeb4e5de19dd13e4409dfc8d53245a9281;hb=eee1589ef3d198a21635d15c9086df2b99f9013d;hp=4c2eb45b29286945bc1ea1e1c14e591537860d6d;hpb=74f6cb88841b63ee9399e249ee993ac31a262a7f;p=wget diff --git a/src/main.c b/src/main.c index 4c2eb45b..c895c4ee 100644 --- a/src/main.c +++ b/src/main.c @@ -167,6 +167,8 @@ static struct cmdline_option option_data[] = { "backups", 0, OPT_BOOLEAN, "backups", -1 }, { "base", 'B', OPT_VALUE, "base", -1 }, { "bind-address", 0, OPT_VALUE, "bindaddress", -1 }, + { "body-data", 0, OPT_VALUE, "bodydata", -1 }, + { "body-file", 0, OPT_VALUE, "bodyfile", -1 }, { IF_SSL ("ca-certificate"), 0, OPT_VALUE, "cacertificate", -1 }, { IF_SSL ("ca-directory"), 0, OPT_VALUE, "cadirectory", -1 }, { "cache", 0, OPT_BOOLEAN, "cache", -1 }, @@ -231,6 +233,7 @@ static struct cmdline_option option_data[] = { "load-cookies", 0, OPT_VALUE, "loadcookies", -1 }, { "local-encoding", 0, OPT_VALUE, "localencoding", -1 }, { "max-redirect", 0, OPT_VALUE, "maxredirect", -1 }, + { "method", 0, OPT_VALUE, "method", -1 }, { "mirror", 'm', OPT_BOOLEAN, "mirror", -1 }, { "no", 'n', OPT__NO, NULL, required_argument }, { "no-clobber", 0, OPT_BOOLEAN, "noclobber", -1 }, @@ -609,6 +612,12 @@ HTTP options:\n"), --post-data=STRING use the POST method; send STRING as the data.\n"), N_("\ --post-file=FILE use the POST method; send contents of FILE.\n"), + N_("\ + --method=HTTPMethod use method \"HTTPMethod\" in the header.\n"), + N_("\ + --body-data=STRING Send STRING as data. --method MUST be set.\n"), + N_("\ + --body-file=FILE Send contents of FILE. --method MUST be set.\n"), N_("\ --content-disposition honor the Content-Disposition header when\n\ choosing local file names (EXPERIMENTAL).\n"), @@ -1034,7 +1043,6 @@ main (int argc, char **argv) short_options, long_options, &longindex)) != -1) { int confval; - bool userrc_ret = true; struct cmdline_option *config_opt; /* There is no short option for "--config". */ @@ -1044,16 +1052,17 @@ main (int argc, char **argv) config_opt = &option_data[confval & ~BOOLEAN_NEG_MARKER]; if (strcmp (config_opt->long_name, "config") == 0) { + bool userrc_ret = true; userrc_ret &= run_wgetrc (optarg); use_userconfig = true; + if (userrc_ret) + break; + else + { + fprintf (stderr, _("Exiting due to error in %s\n"), optarg); + exit (2); + } } - if (!userrc_ret) - { - fprintf (stderr, _("Exiting due to error in %s\n"), optarg); - exit (2); - } - else - break; } } @@ -1211,6 +1220,7 @@ main (int argc, char **argv) if (opt.verbose == -1) opt.verbose = !opt.quiet; + /* Sanity checks. */ if (opt.verbose && opt.quiet) { @@ -1358,6 +1368,64 @@ for details.\n\n")); if (!opt.rejectregex) exit (1); } + if (opt.post_data || opt.post_file_name) + { + if (opt.post_data && opt.post_file_name) + { + fprintf (stderr, _("You cannot specify both --post-data and --post-file.\n")); + exit (1); + } + else if (opt.method) + { + fprintf (stderr, _("You cannot use --post-data or --post-file along with --method. " + "--method expects data through --body-data and --body-file options")); + exit (1); + } + } + if (opt.body_data || opt.body_file) + { + if (!opt.method) + { + fprintf (stderr, _("You must specify a method through --method=HTTPMethod " + "to use with --body-data or --body-file.\n")); + exit (1); + } + else if (opt.body_data && opt.body_file) + { + fprintf (stderr, _("You cannot specify both --body-data and --body-file.\n")); + exit (1); + } + } + + /* Set various options as required for opt.method. */ + + /* When user specifies HEAD as the method, we do not wish to download any + files. Hence, set wget to run in spider mode. */ + if (opt.method && strcasecmp (opt.method, "HEAD") == 0) + setoptval ("spider", "1", "spider"); + + /* Convert post_data to body-data and post_file_name to body-file options. + This is required so as to remove redundant code later on in gethttp(). + The --post-data and --post-file options may also be removed in + the future hence it makes sense to convert them to aliases for + the more generic --method options. + This MUST occur only after the sanity checks so as to prevent the + user from setting both post and body options simultaneously. + */ + if (opt.post_data || opt.post_file_name) + { + setoptval ("method", "POST", "method"); + if (opt.post_data) + { + setoptval ("bodydata", opt.post_data, "body-data"); + opt.post_data = NULL; + } + else + { + setoptval ("bodyfile", opt.post_file_name, "body-file"); + opt.post_file_name = NULL; + } + } #ifdef ENABLE_IRI if (opt.enable_iri)