[OpenWrt-Devel] [PATCH uclient v2] uclient-fetch: add option to read POST data from file

Daniel Golle daniel at makrotopia.org
Fri Jun 12 10:25:38 EDT 2020


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.

Signed-off-by: Gioacchino Mazzurco <gio at eigenlab.org>
Signed-off-by: Daniel Golle <daniel at makrotopia.org>
---
v2: make it compile, handle errors, add usage info, fix typos

 uclient-fetch.c | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/uclient-fetch.c b/uclient-fetch.c
index a06be5d..6119328 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[1000];
+		size_t rlen = 0;
+		do
+		{
+			rlen = fread(tbuf, 1, 1000, 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=<password>		HTTP authentication password\n"
 		"	--user-agent|-U <str>		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"
@@ -516,6 +538,7 @@ enum {
 	L_PASSWORD,
 	L_USER_AGENT,
 	L_POST_DATA,
+	L_POST_FILE,
 	L_SPIDER,
 	L_TIMEOUT,
 	L_CONTINUE,
@@ -532,6 +555,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 },
@@ -598,6 +622,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;
@@ -718,7 +745,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.27.0


_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list