diff --git a/include/lnm/http/req.h b/include/lnm/http/req.h index 2abb12d..885dead 100644 --- a/include/lnm/http/req.h +++ b/include/lnm/http/req.h @@ -18,7 +18,7 @@ * Internal representation of a header in a request, defined using offsets * relative to the full buffer. */ -typedef struct lnm_http_req_iheader { +typedef struct lnm_http_req_ihdr { struct { size_t o; size_t len; @@ -27,21 +27,7 @@ typedef struct lnm_http_req_iheader { size_t o; size_t len; } value; -} lnm_http_req_iheader; - -/** - * Represents an actual header value, with offsets already resolved. - */ -typedef struct lnm_http_req_header { - struct { - const char *s; - size_t len; - } name; - struct { - const char *s; - size_t len; - } value; -} lnm_http_req_header; +} lnm_http_req_ihhr; /** * Represents the parsed HTTP request @@ -64,7 +50,7 @@ typedef struct lnm_http_req { size_t len; } query; struct { - lnm_http_req_iheader arr[LNM_HTTP_MAX_REQ_HEADERS]; + lnm_http_req_ihhr arr[LNM_HTTP_MAX_REQ_HEADERS]; size_t len; } headers; struct { @@ -99,6 +85,20 @@ lnm_http_parse_err lnm_http_req_parse(lnm_http_req *req, char *buf, size_t len); */ void lnm_http_req_reset(lnm_http_req *req); +/** + * Represents an actual header value, with offsets already resolved. + */ +typedef struct lnm_http_req_hdr { + struct { + const char *s; + size_t len; + } name; + struct { + const char *s; + size_t len; + } value; +} lnm_http_req_hdr; + /** * Retrieve a known type header from the request. * @@ -109,7 +109,7 @@ void lnm_http_req_reset(lnm_http_req *req); * @param req request to look for header in * @param type type of header to look for */ -lnm_err lnm_http_req_header_get(lnm_http_req_header *out, lnm_http_req *req, +lnm_err lnm_http_req_header_get(lnm_http_req_hdr *out, lnm_http_req *req, lnm_http_header type); /** @@ -122,7 +122,7 @@ lnm_err lnm_http_req_header_get(lnm_http_req_header *out, lnm_http_req *req, * @param req request to look for header in * @param name name of the header; matches case-insensitive */ -lnm_err lnm_http_req_header_get_s(lnm_http_req_header *out, lnm_http_req *req, +lnm_err lnm_http_req_header_get_s(lnm_http_req_hdr *out, lnm_http_req *req, const char *name); /** @@ -135,4 +135,32 @@ lnm_err lnm_http_req_header_get_s(lnm_http_req_header *out, lnm_http_req *req, size_t lnm_http_req_route_segment(const char **out, lnm_http_req *req, const char *key); +/** + * Represents a parameter in an HTTP header. + */ +typedef struct lnm_http_req_hdr_param { + struct { + const char *s; + size_t len; + } key; + struct { + const char *s; + size_t len; + } value; +} lnm_http_req_hdr_param; + +/** + * Retrieve a specific key-value parameter from a header. + * + * Pointers retrieved from this function should never be used between step + * functions; simply request the header again if you need to. + * + * @param out output struct + * @param header header to look in + * @param key name of the parameter to return from the header + */ +lnm_err lnm_http_req_header_param(lnm_http_req_hdr_param *param, + const lnm_http_req_hdr *header, + const char *key); + #endif diff --git a/src/lnm/http/lnm_http_loop_process.c b/src/lnm/http/lnm_http_loop_process.c index ab7d799..33d7654 100644 --- a/src/lnm/http/lnm_http_loop_process.c +++ b/src/lnm/http/lnm_http_loop_process.c @@ -79,7 +79,7 @@ void lnm_http_loop_process_parse_headers(lnm_http_conn *conn) { lnm_http_loop_ctx *ctx = conn->ctx; lnm_http_req *req = &ctx->req; - lnm_http_req_header header; + lnm_http_req_hdr header; if (lnm_http_req_header_get(&header, req, lnm_http_header_content_length) == lnm_err_ok) { req->body.expected_len = lnm_atoi(header.value.s, header.value.len); diff --git a/src/lnm/http/lnm_http_loop_steps.c b/src/lnm/http/lnm_http_loop_steps.c index 6819986..900422c 100644 --- a/src/lnm/http/lnm_http_loop_steps.c +++ b/src/lnm/http/lnm_http_loop_steps.c @@ -30,7 +30,7 @@ lnm_http_step_err lnm_http_loop_step_auth(lnm_http_conn *conn) { // If there's no API key, requests are always authorized bool authorized = ctx->g->api_key == NULL; - lnm_http_req_header header; + lnm_http_req_hdr header; if (!authorized && lnm_http_req_header_get_s(&header, &ctx->req, "X-Api-Key") == lnm_err_ok) { diff --git a/src/lnm/http/lnm_http_req.c b/src/lnm/http/lnm_http_req.c index 086788e..e05f810 100644 --- a/src/lnm/http/lnm_http_req.c +++ b/src/lnm/http/lnm_http_req.c @@ -88,17 +88,17 @@ void lnm_http_req_reset(lnm_http_req *req) { memset(req, 0, sizeof(lnm_http_req)); } -lnm_err lnm_http_req_header_get(lnm_http_req_header *out, lnm_http_req *req, +lnm_err lnm_http_req_header_get(lnm_http_req_hdr *out, lnm_http_req *req, lnm_http_header type) { return lnm_http_req_header_get_s(out, req, lnm_http_header_names[type]); } -lnm_err lnm_http_req_header_get_s(lnm_http_req_header *out, lnm_http_req *req, +lnm_err lnm_http_req_header_get_s(lnm_http_req_hdr *out, lnm_http_req *req, const char *name) { size_t name_len = strlen(name); for (size_t i = 0; i < req->headers.len; i++) { - const lnm_http_req_iheader *header = &req->headers.arr[i]; + const lnm_http_req_ihhr *header = &req->headers.arr[i]; if (lnm_strnieq(req->buf.s + header->name.o, header->name.len, name, name_len)) {