diff --git a/include/common/http.h b/include/common/http.h index 537be5a01..fbbc33c0c 100644 --- a/include/common/http.h +++ b/include/common/http.h @@ -154,6 +154,7 @@ int http_find_next_url_param(const char **chunks, int http_parse_header(const struct ist hdr, struct ist *name, struct ist *value); int http_parse_stline(const struct ist line, struct ist *p1, struct ist *p2, struct ist *p3); +int http_parse_status_val(const struct ist value, struct ist *status, struct ist *reason); /* * Given a path string and its length, find the position of beginning of the diff --git a/src/http.c b/src/http.c index c77f8c8bc..fe7ed4cdf 100644 --- a/src/http.c +++ b/src/http.c @@ -980,3 +980,34 @@ int http_parse_stline(const struct ist line, struct ist *p1, struct ist *p2, str return 1; } + +/* Parses value of a Status header with the following format: "Status: Code[ + * Reason]". The parsing is pretty naive and just skip spaces. It return the + * numeric value of the status code. + */ +int http_parse_status_val(const struct ist value, struct ist *status, struct ist *reason) +{ + char *p = value.ptr; + char *end = p + value.len; + uint16_t code; + + status->len = reason->len = 0; + + /* Skip leading spaces */ + for (; p < end && HTTP_IS_SPHT(*p); p++); + + /* Set the status part */ + status->ptr = p; + for (; p < end && HTTP_IS_TOKEN(*p); p++); + status->len = p - status->ptr; + + /* Skip spaces between status and reason */ + for (; p < end && HTTP_IS_SPHT(*p); p++); + + /* the remaining is the reason */ + reason->ptr = p; + reason->len = end - p; + + code = strl2ui(status->ptr, status->len); + return code; +}