From 658f971621839f3b928da099dfe3092b47cbc958 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 5 Jul 2022 09:48:39 +0200 Subject: [PATCH] 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. --- include/haproxy/http.h | 1 + src/http.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) 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 "://").