From 242401f544df790b1df7d12b3be5f5b429da091c Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 16 Jun 2016 18:26:18 +0200 Subject: [PATCH] uhttpd: add support for adding arbitrary headers via handler scripts Signed-off-by: Felix Fietkau --- client.c | 8 ++++++++ file.c | 1 + handler.c | 21 ++++++++++++++++++++- uhttpd.h | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/client.c b/client.c index 73e0e49..05044ed 100644 --- a/client.c +++ b/client.c @@ -45,8 +45,10 @@ const char * const http_methods[] = { void uh_http_header(struct client *cl, int code, const char *summary) { struct http_request *r = &cl->request; + struct blob_attr *cur; const char *enc = "Transfer-Encoding: chunked\r\n"; const char *conn; + int rem; cl->http_code = code; @@ -64,6 +66,10 @@ void uh_http_header(struct client *cl, int code, const char *summary) if (!r->connection_close) ustream_printf(cl->us, "Keep-Alive: timeout=%d\r\n", conf.http_keepalive); + + blobmsg_for_each_attr(cur, cl->hdr_response.head, rem) + ustream_printf(cl->us, "%s: %s\r\n", blobmsg_name(cur), + blobmsg_get_string(cur)); } static void uh_connection_close(struct client *cl) @@ -114,6 +120,7 @@ void uh_request_done(struct client *cl) { uh_chunk_eof(cl); uh_dispatch_done(cl); + blob_buf_init(&cl->hdr_response, 0); memset(&cl->dispatch, 0, sizeof(cl->dispatch)); if (!conf.http_keepalive || cl->request.connection_close) @@ -530,6 +537,7 @@ static void client_close(struct client *cl) close(cl->sfd.fd.fd); list_del(&cl->list); blob_buf_free(&cl->hdr); + blob_buf_free(&cl->hdr_response); free(cl); uh_unblock_listeners(); diff --git a/file.c b/file.c index 12aa130..e801a9e 100644 --- a/file.c +++ b/file.c @@ -863,6 +863,7 @@ void uh_handle_request(struct client *cl) char *url = blobmsg_data(blob_data(cl->hdr.head)); char *error_handler; + blob_buf_init(&cl->hdr_response, 0); url = uh_handle_alias(url); uh_handler_run(cl, &url, false); diff --git a/handler.c b/handler.c index 8e8b9c8..0279a6c 100644 --- a/handler.c +++ b/handler.c @@ -103,6 +103,24 @@ handle_set_uri(struct json_script_ctx *ctx, struct blob_attr *data) } static void +handle_add_header(struct json_script_ctx *ctx, struct blob_attr *data) +{ + struct client *cl = cur_client; + static struct blobmsg_policy policy[2] = { + { .type = BLOBMSG_TYPE_STRING }, + { .type = BLOBMSG_TYPE_STRING }, + }; + struct blob_attr *tb[2]; + + blobmsg_parse_array(policy, ARRAY_SIZE(tb), tb, blobmsg_data(data), blobmsg_data_len(data)); + if (!tb[0] || !tb[1]) + return; + + blobmsg_add_string(&cl->hdr_response, blobmsg_get_string(tb[0]), + blobmsg_get_string(tb[1])); +} + +static void handle_command(struct json_script_ctx *ctx, const char *name, struct blob_attr *data, struct blob_attr *vars) { @@ -111,7 +129,8 @@ handle_command(struct json_script_ctx *ctx, const char *name, void (*func)(struct json_script_ctx *ctx, struct blob_attr *data); } cmds[] = { { "redirect", handle_redirect }, - { "rewrite", handle_set_uri } + { "rewrite", handle_set_uri }, + { "add-header", handle_add_header }, }; int i; diff --git a/uhttpd.h b/uhttpd.h index f9ea761..b022ecf 100644 --- a/uhttpd.h +++ b/uhttpd.h @@ -258,6 +258,7 @@ struct client { struct uh_addr srv_addr, peer_addr; struct blob_buf hdr; + struct blob_buf hdr_response; struct dispatch dispatch; }; -- 2.11.0