diff options
author | Felix Fietkau <nbd@nbd.name> | 2016-06-16 18:26:18 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2016-06-16 18:26:18 +0200 |
commit | 242401f544df790b1df7d12b3be5f5b429da091c (patch) | |
tree | 5b35d49454c21740bede1a4ebe05d3d889d4758b | |
parent | fe01ef3f52adae9da38ef47926cd50974af5d6b7 (diff) |
uhttpd: add support for adding arbitrary headers via handler scripts
Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r-- | client.c | 8 | ||||
-rw-r--r-- | file.c | 1 | ||||
-rw-r--r-- | handler.c | 21 | ||||
-rw-r--r-- | uhttpd.h | 1 |
4 files changed, 30 insertions, 1 deletions
@@ -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(); @@ -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); @@ -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; @@ -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; }; |