From 99ade9e0dac03be464ea488e2424351ee0bc2aae Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 21 Nov 2022 18:57:49 +0100 Subject: [PATCH] MINOR: http: Considere empty ports as valid default ports In RFC3986#6.2.3, following URIs are considered as equivalent: http://example.com http://example.com/ http://example.com:/ http://example.com:80/ The third one is interristing because the port is empty and it is still considered as a default port. Thus, http_get_host_port() does no longer return IST_NULL when the port is empty. Now, a ist is returned, it points on the first character after the colon (':') with a length of 0. In addition, http_is_default_port() now considers an empty port as a default port, regardless the scheme. This patch must not be backported, if so, without the previous one ("MINOR: h1: Consider empty port as invalid in authority for CONNECT"). --- src/http.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/http.c b/src/http.c index fbb995e44..c52277533 100644 --- a/src/http.c +++ b/src/http.c @@ -479,7 +479,9 @@ 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. + * , IST_NULL if no ':' is found or an empty IST if there is no digit. In + * the last case, the result is the original ist trimed to 0. So be sure to test + * the result length before doing any pointer arithmetic. */ struct ist http_get_host_port(const struct ist host) { @@ -490,8 +492,10 @@ struct ist http_get_host_port(const struct ist host) for (ptr = end; ptr > start && isdigit((unsigned char)*--ptr);); /* no port found */ - if (likely(*ptr != ':' || ptr+1 == end || ptr == start)) + if (likely(*ptr != ':')) return IST_NULL; + if (ptr+1 == end) + return isttrim(host, 0); return istnext(ist2(ptr, end - ptr)); } @@ -503,6 +507,9 @@ struct ist http_get_host_port(const struct ist host) */ int http_is_default_port(const struct ist schm, const struct ist port) { + if (!istlen(port)) + return 1; + if (!isttest(schm)) return (isteq(port, ist("443")) || isteq(port, ist("80"))); else