Fix parsing of URLs with query strings but empty paths

The query string was getting slurped into authority
This commit is contained in:
nnposter 2026-03-11 16:11:57 +00:00
parent 8ce9f04570
commit 5698bd1bb6
2 changed files with 18 additions and 5 deletions

View file

@ -12,6 +12,9 @@ o [NSE][GH#2183][GH#3239] Script hostmap-crtsh now reports only true subdomains
necessarily as a suffix). The old behavior can be enabled by setting script
argument hostmap-crtsh.lax. [Sweekar-cmd, nnposter]
o [NSE] Function url.parse was not properly parsing URLs with query strings
but empty paths. [nnposter]
o [NSE][GH#3253] Function stdnse.make_buffer now accepts an extra parameter
that allows preloading the newly created buffer with data. [nnposter]

View file

@ -202,6 +202,11 @@ function parse(url, default)
parsed.fragment = f
return ""
end)
-- get query string
url = string.gsub(url, "%?(.*)", function(q)
parsed.query = q
return ""
end)
-- get scheme. Lower-case according to RFC 3986 section 3.1.
url = string.gsub(url, "^(%w[%w.+-]*):",
function(s) parsed.scheme = string.lower(s); return "" end)
@ -210,11 +215,6 @@ function parse(url, default)
parsed.authority = n
return ""
end)
-- get query stringing
url = string.gsub(url, "%?(.*)", function(q)
parsed.query = q
return ""
end)
-- get params
url = string.gsub(url, "%;(.*)", function(p)
parsed.params = p
@ -509,6 +509,16 @@ local test_urls = {
},
_nil = {"scheme", "userinfo", "port", "params", "extension"}
},
{ _url = "//example?k1=v1&k2=v2",
_res = {
authority = "example",
host = "example",
path = "",
query = "k1=v1&k2=v2",
is_folder = false,
},
_nil = {"scheme", "userinfo", "port", "params", "extension", "fragment"}
},
}
for _, t in ipairs(test_urls) do
local result = parse(t._url)