aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/url.lua26
-rw-r--r--test/urltest.lua25
2 files changed, 36 insertions, 15 deletions
diff --git a/src/url.lua b/src/url.lua
index 110ea94..29b6734 100644
--- a/src/url.lua
+++ b/src/url.lua
@@ -88,20 +88,18 @@ local function absolute_path(base_path, relative_path)
88 if string.sub(relative_path, 1, 1) == "/" then return relative_path end 88 if string.sub(relative_path, 1, 1) == "/" then return relative_path end
89 local path = string.gsub(base_path, "[^/]*$", "") 89 local path = string.gsub(base_path, "[^/]*$", "")
90 path = path .. relative_path 90 path = path .. relative_path
91 path = string.gsub(path, "([^/]*%./)", function (s) 91 repeat
92 if s ~= "./" then return s else return "" end 92 local was = path
93 end) 93 path = path:gsub('/%./', '/')
94 path = string.gsub(path, "/%.$", "/") 94 until path == was
95 local reduced 95 repeat
96 while reduced ~= path do 96 local was = path
97 reduced = path 97 path = path:gsub('[^/]+/%.%./([^/]+)', '%1')
98 path = string.gsub(reduced, "([^/]*/%.%./)", function (s) 98 until path == was
99 if s ~= "../../" then return "" else return s end 99 path = path:gsub('[^/]+/%.%./*$', '')
100 end) 100 path = path:gsub('/%.%.$', '/')
101 end 101 path = path:gsub('/%.$', '/')
102 path = string.gsub(reduced, "([^/]*/%.%.)$", function (s) 102 path = path:gsub('^/%.%.', '')
103 if s ~= "../.." then return "" else return s end
104 end)
105 return path 103 return path
106end 104end
107 105
diff --git a/test/urltest.lua b/test/urltest.lua
index 1090a7e..63a33ea 100644
--- a/test/urltest.lua
+++ b/test/urltest.lua
@@ -61,7 +61,7 @@ end
61local check_absolute_url = function(base, relative, absolute) 61local check_absolute_url = function(base, relative, absolute)
62 local res = socket.url.absolute(base, relative) 62 local res = socket.url.absolute(base, relative)
63 if res ~= absolute then 63 if res ~= absolute then
64 io.write("absolute: In test for '", relative, "' expected '", 64 io.write("absolute: In test for base='", base, "', rel='", relative, "' expected '",
65 absolute, "' but got '", res, "'\n") 65 absolute, "' but got '", res, "'\n")
66 os.exit() 66 os.exit()
67 end 67 end
@@ -637,6 +637,17 @@ check_absolute_url("http://a/b/c/d;p?q#f", "g;x", "http://a/b/c/g;x")
637check_absolute_url("http://a/b/c/d;p?q#f", "g;x?y#s", "http://a/b/c/g;x?y#s") 637check_absolute_url("http://a/b/c/d;p?q#f", "g;x?y#s", "http://a/b/c/g;x?y#s")
638check_absolute_url("http://a/b/c/d;p?q#f", ".", "http://a/b/c/") 638check_absolute_url("http://a/b/c/d;p?q#f", ".", "http://a/b/c/")
639check_absolute_url("http://a/b/c/d;p?q#f", "./", "http://a/b/c/") 639check_absolute_url("http://a/b/c/d;p?q#f", "./", "http://a/b/c/")
640check_absolute_url("http://a/b/c/d;p?q#f", "./g", "http://a/b/c/g")
641check_absolute_url("http://a/b/c/d;p?q#f", "./g/", "http://a/b/c/g/")
642check_absolute_url("http://a/b/c/d;p?q#f", "././g", "http://a/b/c/g")
643check_absolute_url("http://a/b/c/d;p?q#f", "././g/", "http://a/b/c/g/")
644check_absolute_url("http://a/b/c/d;p?q#f", "g/.", "http://a/b/c/g/")
645check_absolute_url("http://a/b/c/d;p?q#f", "g/./", "http://a/b/c/g/")
646check_absolute_url("http://a/b/c/d;p?q#f", "g/./.", "http://a/b/c/g/")
647check_absolute_url("http://a/b/c/d;p?q#f", "g/././", "http://a/b/c/g/")
648check_absolute_url("http://a/b/c/d;p?q#f", "./.", "http://a/b/c/")
649check_absolute_url("http://a/b/c/d;p?q#f", "././.", "http://a/b/c/")
650check_absolute_url("http://a/b/c/d;p?q#f", "././g/./.", "http://a/b/c/g/")
640check_absolute_url("http://a/b/c/d;p?q#f", "..", "http://a/b/") 651check_absolute_url("http://a/b/c/d;p?q#f", "..", "http://a/b/")
641check_absolute_url("http://a/b/c/d;p?q#f", "../", "http://a/b/") 652check_absolute_url("http://a/b/c/d;p?q#f", "../", "http://a/b/")
642check_absolute_url("http://a/b/c/d;p?q#f", "../g", "http://a/b/g") 653check_absolute_url("http://a/b/c/d;p?q#f", "../g", "http://a/b/g")
@@ -655,6 +666,17 @@ check_absolute_url("http://a/b/c/d;p?q#f", "./g/.", "http://a/b/c/g/")
655check_absolute_url("http://a/b/c/d;p?q#f", "g/./h", "http://a/b/c/g/h") 666check_absolute_url("http://a/b/c/d;p?q#f", "g/./h", "http://a/b/c/g/h")
656check_absolute_url("http://a/b/c/d;p?q#f", "g/../h", "http://a/b/c/h") 667check_absolute_url("http://a/b/c/d;p?q#f", "g/../h", "http://a/b/c/h")
657 668
669check_absolute_url("http://a/b/c/d:p?q#f/", "../g/", "http://a/b/g/")
670check_absolute_url("http://a/b/c/d:p?q#f/", "../g", "http://a/b/g")
671check_absolute_url("http://a/b/c/d:p?q#f/", "../.g/", "http://a/b/.g/")
672check_absolute_url("http://a/b/c/d:p?q#f/", "../.g", "http://a/b/.g")
673check_absolute_url("http://a/b/c/d:p?q#f/", "../.g.h/", "http://a/b/.g.h/")
674check_absolute_url("http://a/b/c/d:p?q#f/", "../.g.h", "http://a/b/.g.h")
675
676check_absolute_url("http://a/b/c/d:p?q#f/", "g.h/", "http://a/b/c/g.h/")
677check_absolute_url("http://a/b/c/d:p?q#f/", "../g.h/", "http://a/b/g.h/")
678check_absolute_url("http://a/", "../g.h/", "http://a/g.h/")
679
658-- extra tests 680-- extra tests
659check_absolute_url("//a/b/c/d;p?q#f", "d/e/f", "//a/b/c/d/e/f") 681check_absolute_url("//a/b/c/d;p?q#f", "d/e/f", "//a/b/c/d/e/f")
660check_absolute_url("/a/b/c/d;p?q#f", "d/e/f", "/a/b/c/d/e/f") 682check_absolute_url("/a/b/c/d;p?q#f", "d/e/f", "/a/b/c/d/e/f")
@@ -662,6 +684,7 @@ check_absolute_url("a/b/c/d", "d/e/f", "a/b/c/d/e/f")
662check_absolute_url("a/b/c/d/../", "d/e/f", "a/b/c/d/e/f") 684check_absolute_url("a/b/c/d/../", "d/e/f", "a/b/c/d/e/f")
663check_absolute_url("http://velox.telemar.com.br", "/dashboard/index.html", 685check_absolute_url("http://velox.telemar.com.br", "/dashboard/index.html",
664 "http://velox.telemar.com.br/dashboard/index.html") 686 "http://velox.telemar.com.br/dashboard/index.html")
687check_absolute_url("http://example.com/", "../.badhost.com/", "http://example.com/.badhost.com/")
665 688
666print("testing path parsing and composition") 689print("testing path parsing and composition")
667check_parse_path("/eu/tu/ele", { "eu", "tu", "ele"; is_absolute = 1 }) 690check_parse_path("/eu/tu/ele", { "eu", "tu", "ele"; is_absolute = 1 })