MINOR: http: Add function to detect default port

http_is_default_port() can be used to test if a port is a default HTTP/HTTPS
port. A scheme may be specified. In this case, it is used to detect defaults
ports, 80 for "http://" and 443 for "https://". Otherwise, with no scheme, both
are considered as default ports.
This commit is contained in:
Christopher Faulet 2022-07-05 09:53:37 +02:00
parent 658f971621
commit ca7218aaf0
2 changed files with 15 additions and 0 deletions

View File

@ -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);

View File

@ -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 <port> is a default port. If the scheme <schm> 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 <schm> is syntactically correct according to
* RFC3986#3.1, otherwise zero. It expects only the scheme and nothing else
* (particularly not the following "://").