diff --git a/etc/check-links.lua b/etc/check-links.lua index a4e9ef8..4487593 100644 --- a/etc/check-links.lua +++ b/etc/check-links.lua @@ -8,8 +8,6 @@ local http = require("http") local url = require("url") http.TIMEOUT = 10 -cache = {} - function readfile(path) path = url.unescape(path) local file, error = io.open(path, "r") @@ -22,22 +20,14 @@ end function getstatus(u) local parsed = url.parse(u, {scheme = "file"}) - if cache[u] then return cache[u] end - local res if parsed.scheme == "http" then - local request = {url = u, method = "HEAD"} - local response = http.request(request) - if response.code == 200 then res = nil - else res = response.status or response.error end + local r, c, h, s = http.request{url = u, method = "HEAD"} + if c ~= 200 then return s or c end elseif parsed.scheme == "file" then local file, error = io.open(url.unescape(parsed.path), "r") - if file then - file:close() - res = nil - else res = error end - else res = string.format("unhandled scheme '%s'", parsed.scheme) end - cache[u] = res - return res + if file then file:close() + else return error end + else return string.format("unhandled scheme '%s'", parsed.scheme) end end function retrieve(u) @@ -45,10 +35,13 @@ function retrieve(u) local body, headers, code, error local base = u if parsed.scheme == "http" then - body, headers, code, error = http.get(u) + body, code, headers = http.request(u) if code == 200 then base = base or headers.location end + if not body then + error = code + end elseif parsed.scheme == "file" then body, error = readfile(parsed.path) else error = string.format("unhandled scheme '%s'", parsed.scheme) end diff --git a/etc/get.lua b/etc/get.lua index 0603ce5..c7e2a43 100644 --- a/etc/get.lua +++ b/etc/get.lua @@ -87,9 +87,9 @@ end -- determines the size of a http file function gethttpsize(u) - local respt = http.request {method = "HEAD", url = u} - if respt.code == 200 then - return tonumber(respt.headers["content-length"]) + local r, c, h = http.request {method = "HEAD", url = u} + if c == 200 then + return tonumber(h["content-length"]) end end @@ -98,8 +98,8 @@ function getbyhttp(u, file) local save = ltn12.sink.file(file or io.stdout) -- only print feedback if output is not stdout if file then save = ltn12.sink.chain(stats(gethttpsize(u)), save) end - local respt = http.request {url = u, sink = save } - if respt.code ~= 200 then print(respt.status or respt.error) end + local r, c, h, s = http.request {url = u, sink = save } + if c ~= 200 then io.stderr:write(s or c, "\n") end end -- downloads a file using the ftp protocol diff --git a/src/http.lua b/src/http.lua index e0c4c27..b341ebb 100644 --- a/src/http.lua +++ b/src/http.lua @@ -122,7 +122,7 @@ local function uri(reqt) local u = reqt if not reqt.proxy and not PROXY then u = { - path = reqt.path, + path = socket.try(reqt.path, "invalid path 'nil'"), params = reqt.params, query = reqt.query, fragment = reqt.fragment @@ -152,18 +152,15 @@ local default = { local function adjustrequest(reqt) -- parse url if provided - if reqt.url then - local parsed = url.parse(reqt.url, default) - -- explicit components override url - for i,v in parsed do reqt[i] = reqt[i] or v end - end - socket.try(reqt.host, "invalid host '" .. tostring(reqt.host) .. "'") - socket.try(reqt.path, "invalid path '" .. tostring(reqt.path) .. "'") + local nreqt = reqt.url and url.parse(reqt.url, default) or {} + -- explicit components override url + for i,v in reqt do nreqt[i] = reqt[i] end + socket.try(nreqt.host, "invalid host '" .. tostring(nreqt.host) .. "'") -- compute uri if user hasn't overriden - reqt.uri = reqt.uri or uri(reqt) + nreqt.uri = nreqt.uri or uri(nreqt) -- adjust headers in request - reqt.headers = adjustheaders(reqt.headers, reqt.host) - return reqt + nreqt.headers = adjustheaders(nreqt.headers, nreqt.host) + return nreqt end local function shouldredirect(reqt, code) diff --git a/src/url.lua b/src/url.lua index ec26e62..c708e19 100644 --- a/src/url.lua +++ b/src/url.lua @@ -115,7 +115,8 @@ end ----------------------------------------------------------------------------- function parse(url, default) -- initialize default parameters - local parsed = default or {} + local parsed = {} + for i,v in (default or parsed) do parsed[i] = v end -- empty url is parsed to nil if not url or url == "" then return nil, "invalid url" end -- remove whitespace