diff --git a/include/haproxy/http.h b/include/haproxy/http.h index aba8e65a3..ee2f92208 100644 --- a/include/haproxy/http.h +++ b/include/haproxy/http.h @@ -37,6 +37,7 @@ 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_is_default_port(const struct ist schm, const struct ist port); 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 7a7fb0cbb..fbb995e44 100644 --- a/src/http.c +++ b/src/http.c @@ -496,6 +496,20 @@ struct ist http_get_host_port(const struct ist host) return istnext(ist2(ptr, end - ptr)); } + +/* Return non-zero if the port is a default port. If the scheme is + * set, it is used to detect default ports (HTTP => 80 and HTTPS => 443) + * port. Otherwise, both are considered as default ports. + */ +int http_is_default_port(const struct ist schm, const struct ist port) +{ + if (!isttest(schm)) + return (isteq(port, ist("443")) || isteq(port, ist("80"))); + else + return (isteq(port, ist("443")) && isteqi(schm, ist("https://"))) || + (isteq(port, ist("80")) && isteqi(schm, ist("http://"))); +} + /* 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 "://").