diff options
-rwxr-xr-x | mirror-checker.lua | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/mirror-checker.lua b/mirror-checker.lua index d141f8e..aab62cc 100755 --- a/mirror-checker.lua +++ b/mirror-checker.lua | |||
@@ -3,6 +3,12 @@ | |||
3 | 3 | ||
4 | local args = {...} | 4 | local args = {...} |
5 | 5 | ||
6 | --[[ TODO - What to do about HTTPS://deb.devuan.org/ redirects. | ||
7 | Some mirrors give a 404. | ||
8 | Sledjhamr gives a 404, coz it's not listening on 443 for deb.devuan.org. | ||
9 | Some mirrors give a 200. | ||
10 | They shouldn't have the proper certificate, but are giving a result anyway. | ||
11 | ]] | ||
6 | 12 | ||
7 | verbosity = 0 | 13 | verbosity = 0 |
8 | keep = false | 14 | keep = false |
@@ -80,6 +86,7 @@ local logFile | |||
80 | local socket = require 'socket' | 86 | local socket = require 'socket' |
81 | local ftp = require 'socket.ftp' | 87 | local ftp = require 'socket.ftp' |
82 | local http = require 'socket.http' | 88 | local http = require 'socket.http' |
89 | local https = require 'ssl.https' -- See https://github.com/brunoos/luasec/wiki/LuaSec-0.6 for docs. | ||
83 | local url = require 'socket.url' | 90 | local url = require 'socket.url' |
84 | 91 | ||
85 | 92 | ||
@@ -117,6 +124,7 @@ dumpTableSub = function (table, space) | |||
117 | return r | 124 | return r |
118 | end | 125 | end |
119 | 126 | ||
127 | |||
120 | local log = function(v, t, s) | 128 | local log = function(v, t, s) |
121 | if v <= verbosity then | 129 | if v <= verbosity then |
122 | if 3 <= verbosity then t = os.date() .. " " .. t end | 130 | if 3 <= verbosity then t = os.date() .. " " .. t end |
@@ -227,9 +235,15 @@ checkURL = function (host, URL, r, retry) | |||
227 | end | 235 | end |
228 | local PU = url.parse(URL, defaultURL) | 236 | local PU = url.parse(URL, defaultURL) |
229 | D(PU.scheme .. " :// " .. check .. " " .. host .. " -> " .. URL) | 237 | D(PU.scheme .. " :// " .. check .. " " .. host .. " -> " .. URL) |
230 | if not testing(PU.scheme) then D("not testing " .. PU.scheme .. " " .. host .. " -> " .. URL); return end | 238 | if not testing(PU.scheme, host) then D("Not testing " .. PU.scheme .. " " .. host .. " -> " .. URL); return end |
239 | -- TODO - Perhaps we should try it anyway, and mark it as a warning if it DOES work? | ||
240 | if "https" == PU.scheme and "deb.devuan.org" == host then D("Not testing " .. PU.scheme .. " " .. host .. " -> " .. URL .. " mirrors shouldn't have the correct cert."); return end | ||
231 | local hd = {Host = host} | 241 | local hd = {Host = host} |
232 | local p, c, h, s = http.request{method = "HEAD", redirect = false, url = URL, headers = hd} | 242 | local htp = http; |
243 | if PU.scheme == "https" then htp = https end | ||
244 | -- NOTE - the docs for lua-sec say that redirect isn't supported is version 0.6, no idea if that means it ignores redirections like we want. | ||
245 | -- The protocol and options are lua-sec specific arguments. | ||
246 | local p, c, h, s = htp.request{method = "HEAD", redirect = false, url = URL, headers = hd, protocol = "any", options = "all"} | ||
233 | if nil == s then s = "" end | 247 | if nil == s then s = "" end |
234 | if nil == p then | 248 | if nil == p then |
235 | E(" " .. c .. " " .. s .. "! " .. check .. " " .. host .. " -> " .. URL) | 249 | E(" " .. c .. " " .. s .. "! " .. check .. " " .. host .. " -> " .. URL) |
@@ -245,18 +259,17 @@ checkURL = function (host, URL, r, retry) | |||
245 | l = h.location | 259 | l = h.location |
246 | if nil ~= l then | 260 | if nil ~= l then |
247 | local pu = url.parse(l, defaultURL) | 261 | local pu = url.parse(l, defaultURL) |
248 | if l == URL then | 262 | if pu.scheme ~= PU.scheme then |
263 | if testing("Protocol") then | ||
264 | W(" protocol changed during redirect! " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l) | ||
265 | end | ||
266 | elseif l == URL then | ||
249 | E(" redirect loop! " .. check .. " " .. host .. " -> " .. URL) | 267 | E(" redirect loop! " .. check .. " " .. host .. " -> " .. URL) |
268 | elseif nil == pu.host then | ||
269 | W(" no location host! " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l) | ||
270 | checkURL(host, PU.scheme .. "://" .. PU.host .. l, r + 1) | ||
250 | else | 271 | else |
251 | if nil == pu.host then | 272 | checkURL(pu.host, l, r + 1) |
252 | W(" no location host! " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l) | ||
253 | checkURL(host, PU.scheme .. "://" .. PU.host .. l, r + 1) | ||
254 | else | ||
255 | if testing("Protocol") and pu.scheme ~= PU.scheme then | ||
256 | W(" protocol changed during redirect! " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l) | ||
257 | end | ||
258 | checkURL(pu.host, l, r + 1, retry) | ||
259 | end | ||
260 | end | 273 | end |
261 | end | 274 | end |
262 | end | 275 | end |