From a977c2d32e4e2b5554c8d7606912d4985ad650e4 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Sun, 6 Nov 2016 19:47:42 +0100 Subject: [PATCH] rewrite link_is_protocol() to handle almost any URI --- src/bin/utils.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/bin/utils.c b/src/bin/utils.c index 1bff81d6..57cdb1e3 100644 --- a/src/bin/utils.c +++ b/src/bin/utils.c @@ -121,13 +121,27 @@ homedir_get(char *buf, size_t size) Eina_Bool link_is_protocol(const char *str) { - if (casestartswith(str, "http://") || - casestartswith(str, "https://") || - casestartswith(str, "ftp://") || - casestartswith(str, "file://") || - casestartswith(str, "mailto:")) - return EINA_TRUE; - return EINA_FALSE; + const char *p = str; + int c = *p; + + if (!isalpha(c)) + return EINA_FALSE; + + /* Try to follow RFC3986 a bit + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * hier-part = "//" authority path-abempty + * [...] other stuff not taken into account + * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + */ + + do + { + p++; + c = *p; + } + while (isalpha(c) || (c == '.') || (c == '-') || (c == '+')); + + return (p[0] == ':') && (p[1] == '/') && (p[2] == '/'); } Eina_Bool