From a2595d668f2f095c56cbc55aee9f0bbea8efb2f9 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 22 Apr 2015 17:43:02 +0100 Subject: Parse ipv6 URL's. --- src/libserver/url.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/libserver/url.c') diff --git a/src/libserver/url.c b/src/libserver/url.c index cfe925ea3..43ef9f9b1 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -557,6 +557,7 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len, parse_password_start, parse_password, parse_domain, + parse_ipv6, parse_port_password, parse_port, parse_suffix_slash, @@ -610,6 +611,36 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len, c = p; st = parse_domain; slash = p; + + if (*p == '[') { + st = parse_ipv6; + p ++; + c = p; + } + break; + case parse_ipv6: + if (t == ']') { + if (p - c == 0) { + goto out; + } + SET_U (u, UF_HOST); + p ++; + + if (*p == ':') { + st = parse_port; + c = p + 1; + } + else if (*p == '/') { + st = parse_path; + c = p + 1; + } + else if (p != last) { + goto out; + } + } + else { + p ++; + } break; case parse_user: if (t == ':') { @@ -861,6 +892,15 @@ set: } ret = 0; break; + case parse_ipv6: + if (t != ']') { + ret = 1; + } + else { + /* e.g. http://[::] */ + ret = 0; + } + break; default: /* Error state */ ret = 1; -- cgit v1.2.3