]> source.dussan.org Git - rspamd.git/commitdiff
Fix parsing of fragment in urls
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 16 Nov 2015 13:56:06 +0000 (13:56 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 16 Nov 2015 13:56:39 +0000 (13:56 +0000)
src/libserver/url.c
test/lua/unit/url.lua

index 95773baa0c5af02c1bc56141af49a607d0cf4753..18669748349a2c5e3a2339709668e709c6811986 100644 (file)
@@ -754,7 +754,7 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len,
                                }
                                break;
                        case parse_domain:
-                               if (t == '/' || t == ':' || t == '?') {
+                               if (t == '/' || t == ':' || t == '?' || t == '#') {
                                        if (p - c == 0) {
                                                goto out;
                                        }
@@ -767,6 +767,11 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len,
                                                st = parse_query;
                                                c = p + 1;
                                        }
+                                       else if (t == '#') {
+                                               SET_U (u, UF_HOST);
+                                               st = parse_part;
+                                               c = p + 1;
+                                       }
                                        else if (!user_seen) {
                                                /*
                                                 * Here we can have both port and password, hence we need
index 9836ed127f4596549e4bc28c6903edd31e2f1517..e6b1128700d4cd9227756491510b779404bd8576 100644 (file)
@@ -9,7 +9,7 @@ context("URL check functions", function()
   void rspamd_url_init (const char *tld_file);
   unsigned ottery_rand_range(unsigned top);
   ]]
-  
+
   local test_dir = string.gsub(debug.getinfo(1).source, "^@(.+/)[^/]+$", "%1")
 
   ffi.C.rspamd_url_init(string.format('%s/%s', test_dir, "test_tld.dat"))
@@ -33,21 +33,21 @@ context("URL check functions", function()
 
     for _,c in ipairs(cases) do
       local res = url.create(pool, c[1])
-      
+
       assert_not_nil(res, "cannot parse " .. c[1])
       local t = res:to_table()
       --local s = logger.slog("%1 -> %2", c[1], t)
       --print(s)
       assert_not_nil(t, "cannot convert to table " .. c[1])
       assert_equal(c[2][1], t['host'])
-      
+
       if c[2][2] then
         assert_equal(c[2][2], t['user'])
       end
     end
     pool:destroy()
   end)
-  
+
   -- Some cases from https://code.google.com/p/google-url/source/browse/trunk/src/url_canon_unittest.cc
   test("Parse urls", function()
     local pool = mpool.create()
@@ -81,16 +81,19 @@ context("URL check functions", function()
       {"http://[::eeee:192.168.0.1]", true, {
         host = '::eeee:c0a8:1'
       }},
+      {"http://twitter.com#test", true, {
+        host = 'twitter.com', fragment = 'test'
+      }},
     }
-    
+
     for _,c in ipairs(cases) do
       local res = url.create(pool, c[1])
-      
+
       if c[2] then
         assert_not_nil(res, "cannot parse " .. c[1])
-        
+
         local uf = res:to_table()
-        
+
         for k,v in pairs(c[3]) do
           assert_not_nil(uf[k], k .. ' is missing in url, must be ' .. v)
           assert_equal(uf[k], v, 'expected ' .. v .. ' for ' .. k .. ' but got ' .. uf[k] .. ' in url ' .. c[1])
@@ -106,4 +109,4 @@ context("URL check functions", function()
     end
   end
   )
-end)
\ No newline at end of file
+end)