summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client.c8
-rw-r--r--file.c1
-rw-r--r--handler.c21
-rw-r--r--uhttpd.h1
4 files changed, 30 insertions, 1 deletions
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;
};