[vlc-commits] httprequests.lua: refactor getbrowsetable()
Pierre Ynard
git at videolan.org
Tue Aug 18 17:18:39 CEST 2020
vlc/vlc-3.0 | branch: master | Pierre Ynard <linkfanel at yahoo.fr> | Tue Aug 18 17:03:43 2020 +0200| [ac6f18a0f1e14bbaf96f7363a9f02a234b77c739] | committer: Pierre Ynard
httprequests.lua: refactor getbrowsetable()
No more gratuitious trailing '/' appending on the main, URI code path.
Dot segment resolution is now performed on URLs rather than file paths,
which allows it to work on Windows too. The legacy dir code path is
still broken, but it's now clearer how.
Refs #5075, #17470
(cherry picked from commit 07ed2734d02ac8f1485211e0b34861c6bf771b02)
Signed-off-by: Pierre Ynard <linkfanel at yahoo.fr>
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=ac6f18a0f1e14bbaf96f7363a9f02a234b77c739
---
share/lua/intf/modules/httprequests.lua | 92 ++++++++++++++++++---------------
1 file changed, 49 insertions(+), 43 deletions(-)
diff --git a/share/lua/intf/modules/httprequests.lua b/share/lua/intf/modules/httprequests.lua
index 252874c397..b4cb7e16e2 100644
--- a/share/lua/intf/modules/httprequests.lua
+++ b/share/lua/intf/modules/httprequests.lua
@@ -368,63 +368,69 @@ end
getbrowsetable = function ()
- local dir = nil
- local uri = _GET["uri"]
+ --paths are returned as an array of elements
+ local result = { element = { _array = {} } }
+
+ local dir
--uri takes precedence, but fall back to dir
- if uri then
- if uri == "file://~" then
- dir = uri
+ if _GET["uri"] then
+ if _GET["uri"] == "file://~" then
+ dir = "~"
else
- dir = vlc.strings.make_path(uri)
+ local uri = string.gsub(_GET["uri"], "[?#].*$", "")
+ if not string.match(uri, "/$") then
+ uri = uri.."/"
+ end
+ dir = vlc.strings.make_path(common.realpath(uri))
end
else
dir = _GET["dir"]
+
+ -- "" dir means listing all drive letters e.g. "A:\", "C:\"...
+ --however the opendir() API won't resolve "X:\.." to that behavior,
+ --so we offer this resolution as "backwards compatibility"
+ if string.match(dir, '^[a-zA-Z]:[\\/]*%.%.$') or
+ string.match(dir, '^[a-zA-Z]:[\\/]*%.%.[\\/]') then
+ dir = ""
+ end
+
+ if dir ~= "" and dir ~= "~" then
+ dir = dir.."/" --luckily Windows accepts '/' as '\'
+ end
+ end
+ if not dir then
+ return result
end
- --backwards compatibility with old format driveLetter:\\..
- --this is forgiving with the slash type and number
- if dir then
- local position=string.find(dir, '%a:[\\/]*%.%.',0)
- if position==1 then dir="" end
+ if dir == "~" then
+ dir = vlc.config.homedir().."/"
end
- local result={}
- --paths are returned as an array of elements
- result.element={}
- result.element._array={}
-
- if dir then
- if dir == "~" or dir == "file://~" then dir = vlc.config.homedir() end
- -- FIXME: hack for Win32 drive list
- if dir~="" then
- dir = common.realpath(dir.."/")
- end
+ local d = vlc.net.opendir(dir)
+ table.sort(d)
- local d = vlc.net.opendir(dir)
- table.sort(d)
-
- for _,f in pairs(d) do
- if f == ".." or not string.match(f,"^%.") then
- local path = common.realpath(dir..f)
- local element={}
-
- local s = vlc.net.stat(path)
- if (s) then
- for k,v in pairs(s) do
- element[k]=v
- end
- else
- element["type"]="unknown"
- end
- element["path"]=path
- element["name"]=f
+ for _,f in pairs(d) do
+ if f == ".." or not string.match(f,"^%.") then
+ local path = dir..f
+ local element={}
- local uri=vlc.strings.make_uri(path)
- element["uri"]=uri
+ local s = vlc.net.stat(path)
+ if (s) then
+ for k,v in pairs(s) do
+ element[k]=v
+ end
+ else
+ element["type"]="unknown"
+ end
+ element["path"]=path
+ element["name"]=f
- table.insert(result.element._array,element)
+ local uri=vlc.strings.make_uri(path)
+ if uri then
+ element["uri"]=common.realpath(uri)
end
+ table.insert(result.element._array,element)
end
end
More information about the vlc-commits
mailing list