feat(lander): store filename if provided
							parent
							
								
									04aef2643f
								
							
						
					
					
						commit
						6a5b23afaa
					
				|  | @ -20,16 +20,9 @@ typedef enum lander_attr_type : uint8_t { | ||||||
|   lander_attr_type_entry_type = 0, |   lander_attr_type_entry_type = 0, | ||||||
|   lander_attr_type_content_type = 1, |   lander_attr_type_content_type = 1, | ||||||
|   lander_attr_type_url = 2, |   lander_attr_type_url = 2, | ||||||
|  |   lander_attr_type_file_name = 3, | ||||||
| } lander_attr_type; | } lander_attr_type; | ||||||
| 
 | 
 | ||||||
| typedef struct { |  | ||||||
|   char *header; |  | ||||||
|   lander_attr_type attr_type; |  | ||||||
|   http_header header_type; |  | ||||||
| } header_to_attr; |  | ||||||
| 
 |  | ||||||
| extern header_to_attr header_to_attrs[]; |  | ||||||
| 
 |  | ||||||
| typedef enum lander_entry_type : uint8_t { | typedef enum lander_entry_type : uint8_t { | ||||||
|   lander_entry_type_redirect = 0, |   lander_entry_type_redirect = 0, | ||||||
|   lander_entry_type_paste = 1, |   lander_entry_type_paste = 1, | ||||||
|  | @ -67,11 +60,15 @@ bool lander_remove_entry(event_loop_conn *conn); | ||||||
| bool lander_post_file(event_loop_conn *conn); | bool lander_post_file(event_loop_conn *conn); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Parse any custom headers and add them as attributes to the context's LSM |  * Store the requested header as an attribute, if it's present. | ||||||
|  * entry |  | ||||||
|  */ |  */ | ||||||
| bool lander_headers_to_attrs(event_loop_conn *conn); | void lander_header_to_attr(http_loop_ctx *ctx, char *header, | ||||||
|  |                            lander_attr_type attr_type); | ||||||
| 
 | 
 | ||||||
| bool lander_attrs_to_headers(event_loop_conn *conn); | /**
 | ||||||
|  |  * Store the attribute's value as the provided header, if present. | ||||||
|  |  */ | ||||||
|  | void lander_attr_to_header(http_loop_ctx *ctx, lander_attr_type attr_type, | ||||||
|  |                            http_header header_type); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
							
								
								
									
										42
									
								
								landerctl
								
								
								
								
							
							
						
						
									
										42
									
								
								landerctl
								
								
								
								
							|  | @ -3,53 +3,49 @@ | ||||||
| API_KEY=test | API_KEY=test | ||||||
| URL=http://localhost:18080 | URL=http://localhost:18080 | ||||||
| 
 | 
 | ||||||
|  | if [[ "$2" != '-' ]]; then | ||||||
|  |     filename="$2" | ||||||
|  |     content_type="$(file --mime-type --brief $2)" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| if [ "$1" = g ]; then | if [ "$1" = g ]; then | ||||||
|     curl -is "$URL/$2" |  |     curl -is "$URL/$2" |  | ||||||
|         sed -En 's/^[lL]ocation: (.*)/\1/p' |         sed -En 's/^[lL]ocation: (.*)/\1/p' | ||||||
| 
 | 
 | ||||||
| elif [ "$1" = s ]; then | elif [ "$1" = s ] || [ "$1" = sl ]; then | ||||||
|     curl \ |     curl \ | ||||||
|  |         --fail \ | ||||||
|         -w "${URL}%header{location}" \ |         -w "${URL}%header{location}" \ | ||||||
|         -XPOST \ |         -XPOST \ | ||||||
|         -d "$2" \ |         -d "$2" \ | ||||||
|         -H "X-Api-Key: $API_KEY" \ |         -H "X-Api-Key: $API_KEY" \ | ||||||
|         "$URL/s/$3" |         "$URL/$1/$3" | ||||||
| 
 | 
 | ||||||
| elif [ "$1" = sl ]; then | elif [ "$1" = p ] || [ "$1" = pl ]; then | ||||||
|     curl \ |  | ||||||
|         -w "${URL}%header{location}" \ |  | ||||||
|         -XPOST \ |  | ||||||
|         -d "$2" \ |  | ||||||
|         -H "X-Api-Key: $API_KEY" \ |  | ||||||
|         "$URL/sl/$3" |  | ||||||
| 
 |  | ||||||
| elif [ "$1" = p ]; then |  | ||||||
|     curl \ |     curl \ | ||||||
|  |         --fail \ | ||||||
|         -w "${URL}%header{location}" \ |         -w "${URL}%header{location}" \ | ||||||
|         -XPOST \ |         -XPOST \ | ||||||
|         -H "X-Api-Key: $API_KEY" \ |         -H "X-Api-Key: $API_KEY" \ | ||||||
|  |         -H "X-Lander-Filename: ${filename}" \ | ||||||
|         --data-binary @"$2" \ |         --data-binary @"$2" \ | ||||||
|         "$URL/p/$3" |         "$URL/$1/$3" | ||||||
| 
 | 
 | ||||||
| elif [ "$1" = pl ]; then | elif [ "$1" = f ] || [ "$1" = fl ]; then | ||||||
|     curl \ |     curl \ | ||||||
|  |         --fail \ | ||||||
|         -w "${URL}%header{location}" \ |         -w "${URL}%header{location}" \ | ||||||
|         -XPOST \ |         -XPOST \ | ||||||
|         -H "X-Api-Key: $API_KEY" \ |         -H "X-Api-Key: $API_KEY" \ | ||||||
|  |         -H "X-Lander-Content-Type: ${content_type}" \ | ||||||
|  |         -H "X-Lander-Filename: ${filename}" \ | ||||||
|         --data-binary @"$2" \ |         --data-binary @"$2" \ | ||||||
|         "$URL/pl/$3" |         "$URL/$1/$3" | ||||||
| 
 |  | ||||||
| elif [ "$1" = f ]; then |  | ||||||
|     curl \ |  | ||||||
|         -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" |  | ||||||
| 
 | 
 | ||||||
| elif [ "$1" = d ]; then | elif [ "$1" = d ]; then | ||||||
|     curl \ |     curl \ | ||||||
|  |         --fail \ | ||||||
|         -XDELETE \ |         -XDELETE \ | ||||||
|         -H "X-Api-Key: $API_KEY" \ |         -H "X-Api-Key: $API_KEY" \ | ||||||
|         "$URL/$2" |         "$URL/$2" | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
| 
 | 
 | ||||||
| #include "http/types.h" | #include "http/types.h" | ||||||
| #include "http_loop.h" | #include "http_loop.h" | ||||||
|  | @ -19,7 +20,7 @@ http_route lander_routes[] = { | ||||||
|         .type = http_route_regex, |         .type = http_route_regex, | ||||||
|         .method = http_get, |         .method = http_get, | ||||||
|         .path = "^/([^/]+)$", |         .path = "^/([^/]+)$", | ||||||
|         .steps = {lander_get_entry, lander_attrs_to_headers, NULL}, |         .steps = {lander_get_entry, NULL}, | ||||||
|         .steps_res = {http_loop_step_write_header, lander_stream_body_to_client, |         .steps_res = {http_loop_step_write_header, lander_stream_body_to_client, | ||||||
|                       NULL}, |                       NULL}, | ||||||
|     }, |     }, | ||||||
|  | @ -52,18 +53,11 @@ http_route lander_routes[] = { | ||||||
|      .method = http_post, |      .method = http_post, | ||||||
|      .path = "^/f(l?)/([^/]*)$", |      .path = "^/f(l?)/([^/]*)$", | ||||||
|      .steps = {http_loop_step_auth, http_loop_step_parse_content_length, |      .steps = {http_loop_step_auth, http_loop_step_parse_content_length, | ||||||
|                lander_post_file, lander_headers_to_attrs, |                lander_post_file, lander_stream_body_to_entry, NULL}, | ||||||
|                lander_stream_body_to_entry, NULL}, |  | ||||||
|      .steps_res = {http_loop_step_write_header, http_loop_step_write_body, |      .steps_res = {http_loop_step_write_header, http_loop_step_write_body, | ||||||
|                    NULL}}, |                    NULL}}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| header_to_attr header_to_attrs[] = { |  | ||||||
|     {"X-Lander-Content-Type", lander_attr_type_content_type, |  | ||||||
|      http_header_content_type}, |  | ||||||
|     {NULL, 0, 0}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| void *lander_gctx_init() { return calloc(1, sizeof(lander_gctx)); } | void *lander_gctx_init() { return calloc(1, sizeof(lander_gctx)); } | ||||||
| 
 | 
 | ||||||
| void *lander_ctx_init() { return calloc(1, sizeof(lander_ctx)); } | void *lander_ctx_init() { return calloc(1, sizeof(lander_ctx)); } | ||||||
|  | @ -77,3 +71,37 @@ void lander_ctx_reset(lander_ctx *ctx) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void lander_ctx_free(lander_ctx *ctx) { free(ctx); } | void lander_ctx_free(lander_ctx *ctx) { free(ctx); } | ||||||
|  | 
 | ||||||
|  | void lander_header_to_attr(http_loop_ctx *ctx, char *header_name, | ||||||
|  |                            lander_attr_type attr_type) { | ||||||
|  |   lander_ctx *c_ctx = ctx->c; | ||||||
|  | 
 | ||||||
|  |   for (size_t i = 0; i < ctx->req.num_headers; i++) { | ||||||
|  |     struct phr_header *header = &ctx->req.headers[i]; | ||||||
|  | 
 | ||||||
|  |     if (strncmp(header->name, header_name, header->name_len) == 0) { | ||||||
|  |       if (header->value_len > 0) { | ||||||
|  |         lsm_str *value; | ||||||
|  |         lsm_str_init_copy_n(&value, (char *)header->value, header->value_len); | ||||||
|  | 
 | ||||||
|  |         lsm_entry_attr_insert(c_ctx->entry, attr_type, value); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void lander_attr_to_header(http_loop_ctx *ctx, lander_attr_type attr_type, | ||||||
|  |                            http_header header_type) { | ||||||
|  |   lander_ctx *c_ctx = ctx->c; | ||||||
|  |   lsm_str *value; | ||||||
|  | 
 | ||||||
|  |   if (lsm_entry_attr_get(&value, c_ctx->entry, 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_type, buf, true); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -73,6 +73,8 @@ void lander_get_file(event_loop_conn *conn) { | ||||||
|   lander_ctx *c_ctx = ctx->c; |   lander_ctx *c_ctx = ctx->c; | ||||||
| 
 | 
 | ||||||
|   ctx->res.body.expected_len = lsm_entry_data_len(c_ctx->entry); |   ctx->res.body.expected_len = lsm_entry_data_len(c_ctx->entry); | ||||||
|  |   lander_attr_to_header(ctx, lander_attr_type_content_type, | ||||||
|  |                         http_header_content_type); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool lander_get_entry(event_loop_conn *conn) { | bool lander_get_entry(event_loop_conn *conn) { | ||||||
|  |  | ||||||
|  | @ -104,6 +104,7 @@ bool lander_post_paste(event_loop_conn *conn) { | ||||||
| 
 | 
 | ||||||
|   lsm_entry_attr_insert_uint8_t(c_ctx->entry, lander_attr_type_entry_type, |   lsm_entry_attr_insert_uint8_t(c_ctx->entry, lander_attr_type_entry_type, | ||||||
|                                 lander_entry_type_paste); |                                 lander_entry_type_paste); | ||||||
|  |   lander_header_to_attr(ctx, "X-Lander-Filename", lander_attr_type_file_name); | ||||||
| 
 | 
 | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  | @ -119,6 +120,9 @@ bool lander_post_file(event_loop_conn *conn) { | ||||||
| 
 | 
 | ||||||
|   lsm_entry_attr_insert_uint8_t(c_ctx->entry, lander_attr_type_entry_type, |   lsm_entry_attr_insert_uint8_t(c_ctx->entry, lander_attr_type_entry_type, | ||||||
|                                 lander_entry_type_file); |                                 lander_entry_type_file); | ||||||
|  |   lander_header_to_attr(ctx, "X-Lander-Content-Type", | ||||||
|  |                         lander_attr_type_content_type); | ||||||
|  |   lander_header_to_attr(ctx, "X-Lander-Filename", lander_attr_type_file_name); | ||||||
| 
 | 
 | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -20,54 +20,3 @@ bool lander_stream_body_to_entry(event_loop_conn *conn) { | ||||||
| 
 | 
 | ||||||
|   return lsm_entry_data_len(c_ctx->entry) == ctx->req.body.expected_len; |   return lsm_entry_data_len(c_ctx->entry) == ctx->req.body.expected_len; | ||||||
| } | } | ||||||
| 
 |  | ||||||
| bool lander_headers_to_attrs(event_loop_conn *conn) { |  | ||||||
|   http_loop_ctx *ctx = conn->ctx; |  | ||||||
|   lander_ctx *c_ctx = ctx->c; |  | ||||||
| 
 |  | ||||||
|   for (size_t i = 0; i < ctx->req.num_headers; i++) { |  | ||||||
|     struct phr_header *header = &ctx->req.headers[i]; |  | ||||||
| 
 |  | ||||||
|     int j = 0; |  | ||||||
| 
 |  | ||||||
|     while (header_to_attrs[j].header != NULL) { |  | ||||||
|       if (strncmp(header->name, header_to_attrs[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_attrs[j].attr_type, |  | ||||||
|                               value); |  | ||||||
| 
 |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       j++; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   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_attrs[j].header != NULL) { |  | ||||||
|     if (lsm_entry_attr_get(&value, c_ctx->entry, |  | ||||||
|                            header_to_attrs[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_attrs[j].header_type, buf, true); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     j++; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue