]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix complicated case of percent encoding.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 1 Jul 2015 16:18:32 +0000 (17:18 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 2 Jul 2015 10:42:09 +0000 (11:42 +0100)
src/libserver/url.c

index 378929aa56fad92351559a31a3f5ac7971b4db5a..3f4d9a2583c175757f2b4a28bfb7b2760ffa7dcd 100644 (file)
@@ -737,7 +737,7 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len,
                                p ++;
                        }
                        else {
-                               if (*p != '.' && *p != '-' && *p != '_') {
+                               if (*p != '.' && *p != '-' && *p != '_' && *p != '%') {
                                        uc = g_utf8_get_char_validated (p, last - p);
 
                                        if (uc == (gunichar)-1) {
@@ -1127,7 +1127,25 @@ rspamd_url_parse (struct rspamd_url *uri, gchar *uristring, gsize len,
        /* Now decode url symbols */
        uri->string = p;
        uri->urllen = len;
-       rspamd_unescape_uri (uri->string, uri->string, len);
+
+       if (uri->userlen == 0) {
+               rspamd_unescape_uri (uri->string, uri->string, len);
+       }
+       else {
+               rspamd_unescape_uri (uri->string, uri->string, uri->protocollen);
+               rspamd_unescape_uri (uri->host, uri->host, uri->hostlen);
+
+               if (uri->datalen) {
+                       rspamd_unescape_uri (uri->data, uri->data, uri->datalen);
+               }
+               if (uri->querylen) {
+                       rspamd_unescape_uri (uri->query, uri->query, uri->querylen);
+               }
+               if (uri->fragmentlen) {
+                       rspamd_unescape_uri (uri->fragment, uri->fragment, uri->fragmentlen);
+               }
+       }
+
        rspamd_str_lc (uri->string, uri->protocollen);
        rspamd_str_lc_utf8 (uri->host,   uri->hostlen);