From: Christopher Faulet Date: Tue, 5 Jul 2022 07:48:39 +0000 (+0200) Subject: MINOR: http: Add function to get port part of a host X-Git-Tag: v2.7-dev2~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=658f971621839f3b928da099dfe3092b47cbc958;p=thirdparty%2Fhaproxy.git MINOR: http: Add function to get port part of a host http_get_host_port() function can be used to get the port part of a host. It will be used to get the port of an uri authority or a host header value. This function only look for a port starting from the end of the host. It is the caller responsibility to call it with a valid host value. An indirect string is returned. --- diff --git a/include/haproxy/http.h b/include/haproxy/http.h index a213f5bfd2..aba8e65a3b 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); +struct ist http_get_host_port(const struct ist host); 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); diff --git a/src/http.c b/src/http.c index bc0a8085f2..7a7fb0cbb9 100644 --- a/src/http.c +++ b/src/http.c @@ -478,6 +478,24 @@ const char *http_get_reason(unsigned int status) } } +/* Returns the ist string corresponding to port part (without ':') in the host + * or IST_NULL if not found. +*/ +struct ist http_get_host_port(const struct ist host) +{ + char *start, *end, *ptr; + + start = istptr(host); + end = istend(host); + for (ptr = end; ptr > start && isdigit((unsigned char)*--ptr);); + + /* no port found */ + if (likely(*ptr != ':' || ptr+1 == end || ptr == start)) + return IST_NULL; + + return istnext(ist2(ptr, end - ptr)); +} + /* 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 "://").