--post-file parameter only support text file not binary file. "Content-Length" is more compatible to the http server world.
Signed-off-by: xinglp <xin...@gmail.com> --- diff --git a/uclient-fetch.c b/uclient-fetch.c index 065742e..13f2fe2 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 char *post_file_content; static struct ustream_ssl_ctx *ssl_ctx; static const struct ustream_ssl_ops *ssl_ops; static int quiet = false; @@ -449,6 +450,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 contents of FILE\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" @@ -491,6 +493,30 @@ static int no_ssl(const char *progname) return 1; } +static ssize_t load_file(const char *path, char **buf) +{ + int fd; + if ((fd = open(path, O_RDONLY)) < 0) { + if (!quiet) + fprintf(stderr, "open %s: %s\n", path, strerror(errno)); + return -1; + } + struct stat st; + if (fstat(fd, &st)) { + if (!quiet) + fprintf(stderr, "fstat %s: %s\n", path, strerror(errno)); + return -1; + } + *buf = malloc(st.st_size); + if(st.st_size != read(fd, *buf, st.st_size)) { + if (!quiet) + fprintf(stderr, "read size different from fstat %s\n", path); + return -1; + } + close(fd); + return st.st_size; +} + enum { L_NO_CHECK_CERTIFICATE, L_CA_CERTIFICATE, @@ -498,6 +524,7 @@ enum { L_PASSWORD, L_USER_AGENT, L_POST_DATA, + L_POST_FILE, L_SPIDER, L_TIMEOUT, L_CONTINUE, @@ -512,6 +539,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 }, @@ -568,6 +596,11 @@ int main(int argc, char **argv) case L_POST_DATA: post_data = optarg; break; + case L_POST_FILE: + if(load_file(optarg, &post_file_content) < 0) + exit(1); + post_data = post_file_content; + break; case L_SPIDER: no_output = true; break; @@ -697,5 +730,8 @@ int main(int argc, char **argv) if (ssl_ctx) ssl_ops->context_free(ssl_ctx); + if (post_file_content) + free(post_file_content); + return error_ret; } diff --git a/uclient-http.c b/uclient-http.c index f0451cc..07de2d4 100644 --- a/uclient-http.c +++ b/uclient-http.c @@ -286,18 +286,6 @@ static void uclient_http_process_headers(struct uclient_http *uh) uh->auth_type = uclient_http_update_auth_type(uh); } -static bool uclient_request_supports_body(enum request_type req_type) -{ - switch (req_type) { - case REQ_POST: - case REQ_PUT: - case REQ_DELETE: - return true; - default: - return false; - } -} - static void uclient_http_add_auth_basic(struct uclient_http *uh) { @@ -576,9 +564,6 @@ uclient_http_send_headers(struct uclient_http *uh) blobmsg_for_each_attr(cur, uh->headers.head, rem) ustream_printf(uh->us, "%s: %s\r\n", blobmsg_name(cur), (char *) blobmsg_data(cur)); - if (uclient_request_supports_body(uh->req_type)) - ustream_printf(uh->us, "Transfer-Encoding: chunked\r\n"); - uclient_http_add_auth_header(uh); ustream_printf(uh->us, "\r\n"); @@ -984,12 +969,16 @@ uclient_http_send_data(struct uclient *cl, const char *buf, unsigned int len) if (uh->state >= HTTP_STATE_REQUEST_DONE) return -1; + if (len > 0) { + char buf[32]; + sprintf(buf, "%d", len); + uclient_http_set_header(cl, "Content-Length", buf); + } + uclient_http_send_headers(uh); if (len > 0) { - ustream_printf(uh->us, "%X\r\n", len); ustream_write(uh->us, buf, len, false); - ustream_printf(uh->us, "\r\n"); } return len; @@ -1004,8 +993,6 @@ uclient_http_request_done(struct uclient *cl) return -1; uclient_http_send_headers(uh); - if (uclient_request_supports_body(uh->req_type)) - ustream_printf(uh->us, "0\r\n\r\n"); uh->state = HTTP_STATE_REQUEST_DONE; return 0; _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev