From: Willy Tarreau Date: Tue, 10 Aug 2021 13:35:36 +0000 (+0200) Subject: MINOR: http: add a new function http_validate_scheme() to validate a scheme X-Git-Tag: v2.5-dev4~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3d8d03d98c6624c8b15b81f7b80dd22fc3f9fd2;p=thirdparty%2Fhaproxy.git MINOR: http: add a new function http_validate_scheme() to validate a scheme While http_parse_scheme() extracts a scheme from a URI by extracting exactly the valid characters and stopping on delimiters, this new function performs the same on a fixed-size string. --- diff --git a/include/haproxy/http.h b/include/haproxy/http.h index 150ebdb7f9..a213f5bfd2 100644 --- a/include/haproxy/http.h +++ b/include/haproxy/http.h @@ -36,6 +36,7 @@ extern const uint8_t http_char_classes[256]; enum http_meth_t find_http_meth(const char *str, const int len); int http_get_status_idx(unsigned int status); const char *http_get_reason(unsigned int status); +int http_validate_scheme(const struct ist schm); struct ist http_parse_scheme(struct http_uri_parser *parser); struct ist http_parse_authority(struct http_uri_parser *parser, int no_userinfo); struct ist http_parse_path(struct http_uri_parser *parser); diff --git a/src/http.c b/src/http.c index 75c899d774..0d6e92d911 100644 --- a/src/http.c +++ b/src/http.c @@ -468,6 +468,29 @@ const char *http_get_reason(unsigned int status) } } +/* Returns non-zero if the scheme is syntactically correct according to + * RFC3986#3.1, otherwise zero. It expects only the scheme and nothing else + * (particularly not the following "://"). + * Scheme = alpha *(alpha|digit|'+'|'-'|'.') + */ +int http_validate_scheme(const struct ist schm) +{ + size_t i; + + for (i = 0; i < schm.len; i++) { + if (likely((schm.ptr[i] >= 'a' && schm.ptr[i] <= 'z') || + (schm.ptr[i] >= 'A' && schm.ptr[i] <= 'Z'))) + continue; + if (unlikely(!i)) // first char must be alpha + return 0; + if ((schm.ptr[i] >= '0' && schm.ptr[i] <= '9') || + schm.ptr[i] == '+' || schm.ptr[i] == '-' || schm.ptr[i] == '.') + continue; + return 0; + } + return !!i; +} + /* Parse the uri and looks for the scheme. If not found, an empty ist is * returned. Otherwise, the ist pointing to the scheme is returned. *