diff --git a/include/haproxy/http.h b/include/haproxy/http.h index a213f5bfd..aba8e65a3 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 bc0a8085f..7a7fb0cbb 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 "://").