From 51e16ebffc740c6afcdd45aced20fc0354a502d7 Mon Sep 17 00:00:00 2001 From: Gio Date: Fri, 12 Jun 2020 12:59:52 +0200 Subject: [PATCH] uclient-fetch: add option to read POST data from file Passing post data in command line is convenient but has limited size, and may become tricky to correctly escape passed data especially in scripts. This patch add the option --post-file so the data to post can be read from a file. Tested on x86/64. Acked-by: Jo-Philipp Wich Signed-off-by: Gioacchino Mazzurco Signed-off-by: Daniel Golle (cherry picked from commit c66098611f16806a936a3a3f92113a16382fc4d9) --- uclient-fetch.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/uclient-fetch.c b/uclient-fetch.c index 38c9c53..5285b6e 100644 --- a/uclient-fetch.c +++ b/uclient-fetch.c @@ -43,6 +43,7 @@ static const char *user_agent = "uclient-fetch"; static const char *post_data; +static const char *post_file; static struct ustream_ssl_ctx *ssl_ctx; static const struct ustream_ssl_ops *ssl_ops; static int quiet = false; @@ -334,7 +335,7 @@ static int init_request(struct uclient *cl) msg_connecting(cl); - rc = uclient_http_set_request_type(cl, post_data ? "POST" : "GET"); + rc = uclient_http_set_request_type(cl, post_data || post_file ? "POST" : "GET"); if (rc) return rc; @@ -347,6 +348,26 @@ static int init_request(struct uclient *cl) uclient_http_set_header(cl, "Content-Type", "application/x-www-form-urlencoded"); uclient_write(cl, post_data, strlen(post_data)); } + else if(post_file) + { + FILE *input_file; + uclient_http_set_header(cl, "Content-Type", "application/x-www-form-urlencoded"); + + input_file = fopen(post_file, "r"); + if (!input_file) + return errno; + + char tbuf[1024]; + size_t rlen = 0; + do + { + rlen = fread(tbuf, 1, sizeof(tbuf), input_file); + uclient_write(cl, tbuf, rlen); + } + while(rlen); + + fclose(input_file); + } rc = uclient_request(cl); if (rc) @@ -460,6 +481,7 @@ static int usage(const char *progname) " --password= HTTP authentication password\n" " --user-agent|-U Set HTTP user agent\n" " --post-data=STRING use the POST method; send STRING as the data\n" + " --post-file=FILE use the POST method; send FILE as the data\n" " --spider|-s Spider mode - only check file existence\n" " --timeout=N|-T N Set connect/request timeout to N seconds\n" " --proxy=on|off|-Y on|off Enable/disable env var configured proxy\n" @@ -514,6 +536,7 @@ enum { L_PASSWORD, L_USER_AGENT, L_POST_DATA, + L_POST_FILE, L_SPIDER, L_TIMEOUT, L_CONTINUE, @@ -529,6 +552,7 @@ static const struct option longopts[] = { [L_PASSWORD] = { "password", required_argument }, [L_USER_AGENT] = { "user-agent", required_argument }, [L_POST_DATA] = { "post-data", required_argument }, + [L_POST_FILE] = { "post-file", required_argument }, [L_SPIDER] = { "spider", no_argument }, [L_TIMEOUT] = { "timeout", required_argument }, [L_CONTINUE] = { "continue", no_argument }, @@ -586,6 +610,9 @@ int main(int argc, char **argv) case L_POST_DATA: post_data = optarg; break; + case L_POST_FILE: + post_file = optarg; + break; case L_SPIDER: no_output = true; break; @@ -706,7 +733,7 @@ int main(int argc, char **argv) /* no error received, we can enter main loop */ uloop_run(); } else { - fprintf(stderr, "Failed to establish connection\n"); + fprintf(stderr, "Failed to send request: %s\n", strerror(rc)); error_ret = 4; } -- 2.30.2