]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: http: Considere empty ports as valid default ports
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 21 Nov 2022 17:57:49 +0000 (18:57 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 22 Nov 2022 15:56:49 +0000 (16:56 +0100)
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

index fbb995e44bedd06567ad6f2e5452ff8b6b55b572..c522775336ef829fe73e3bdd85db77a43edb6cf0 100644 (file)
@@ -479,7 +479,9 @@ const char *http_get_reason(unsigned int status)
 }
 
 /* Returns the ist string corresponding to port part (without ':') in the host
- * <host> or IST_NULL if not found.
+ * <host>, 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