diff --git a/include/lander.h b/include/lander.h index 1bb38d3..a83cf74 100644 --- a/include/lander.h +++ b/include/lander.h @@ -68,4 +68,6 @@ bool lander_post_file_lsm(event_loop_conn *conn); */ bool lander_headers_to_attrs(event_loop_conn *conn); +bool lander_attrs_to_headers(event_loop_conn *conn); + #endif diff --git a/landerctl b/landerctl index f7bdded..d586942 100755 --- a/landerctl +++ b/landerctl @@ -44,6 +44,7 @@ elif [ "$1" = f ]; then -w "${URL}%header{location}" \ -XPOST \ -H "X-Api-Key: $API_KEY" \ + -H "X-Lander-Content-Type: $(file --mime-type --brief $2)" \ --data-binary @"$2" \ "$URL/f/$3" fi diff --git a/src/lander/lander.c b/src/lander/lander.c index 79518b0..11e5af1 100644 --- a/src/lander/lander.c +++ b/src/lander/lander.c @@ -1,5 +1,6 @@ #include +#include "http/types.h" #include "http_loop.h" #include "lander.h" #include "lsm/store.h" @@ -15,7 +16,7 @@ http_route lander_routes[] = { .type = http_route_regex, .method = http_get, .path = "^/([^/]+)$", - .steps = {lander_get_entry_lsm, NULL}, + .steps = {lander_get_entry_lsm, lander_attrs_to_headers, NULL}, .steps_res = {http_loop_step_write_header, lander_stream_body_to_client, NULL}, }, @@ -48,7 +49,8 @@ http_route lander_routes[] = { .method = http_post, .path = "^/f(l?)/([^/]*)$", .steps = {http_loop_step_auth, http_loop_step_parse_content_length, - lander_post_file_lsm, lander_headers_to_attrs, lander_stream_body_to_entry, NULL}, + lander_post_file_lsm, lander_headers_to_attrs, + lander_stream_body_to_entry, NULL}, .steps_res = {http_loop_step_write_header, http_loop_step_write_body, NULL}}, }; @@ -56,9 +58,11 @@ http_route lander_routes[] = { struct { char *header; lander_attr_type attr_type; + http_header header_type; } header_to_attr_type[] = { - { "X-Lander-Content-Type", lander_attr_type_content_type }, - { NULL, 0 }, + {"X-Lander-Content-Type", lander_attr_type_content_type, + http_header_content_type}, + {NULL, 0}, }; void *lander_gctx_init() { return calloc(1, sizeof(lander_gctx)); } @@ -87,11 +91,13 @@ bool lander_headers_to_attrs(event_loop_conn *conn) { int j = 0; while (header_to_attr_type[j].header != NULL) { - if (strncmp(header->name, header_to_attr_type[j].header, header->name_len) == 0) { + if (strncmp(header->name, header_to_attr_type[j].header, + header->name_len) == 0) { lsm_str *value; lsm_str_init_copy_n(&value, (char *)header->value, header->value_len); - lsm_entry_attr_insert(c_ctx->entry, header_to_attr_type[j].attr_type, value); + lsm_entry_attr_insert(c_ctx->entry, header_to_attr_type[j].attr_type, + value); break; } @@ -102,3 +108,27 @@ bool lander_headers_to_attrs(event_loop_conn *conn) { return true; } + +bool lander_attrs_to_headers(event_loop_conn *conn) { + http_loop_ctx *ctx = conn->ctx; + lander_ctx *c_ctx = ctx->c; + + int j = 0; + lsm_str *value; + + while (header_to_attr_type[j].header != NULL) { + if (lsm_entry_attr_get(&value, c_ctx->entry, + header_to_attr_type[j].attr_type) == lsm_error_ok) { + char *buf = malloc(lsm_str_len(value) + 1); + memcpy(buf, lsm_str_ptr(value), lsm_str_len(value)); + buf[lsm_str_len(value)] = '\0'; + + http_res_add_header(&ctx->res, header_to_attr_type[j].header_type, buf, + true); + } + + j++; + } + + return true; +} diff --git a/src/lander/lander_get.c b/src/lander/lander_get.c index 03076c8..dead552 100644 --- a/src/lander/lander_get.c +++ b/src/lander/lander_get.c @@ -92,9 +92,11 @@ bool lander_get_entry_lsm(event_loop_conn *conn) { break; case lsm_error_not_found: ctx->res.status = http_not_found; + conn->state = event_loop_conn_state_res; return true; default: ctx->res.status = http_internal_server_error; + conn->state = event_loop_conn_state_res; return true; }