diff --git a/luci-app-passwall/root/usr/share/passwall/subscribe.lua b/luci-app-passwall/root/usr/share/passwall/subscribe.lua index 736c3e968..b1f8aca1f 100755 --- a/luci-app-passwall/root/usr/share/passwall/subscribe.lua +++ b/luci-app-passwall/root/usr/share/passwall/subscribe.lua @@ -1303,19 +1303,21 @@ local function processData(szType, content, add_mode, add_from) end local function curl(url, file, ua, mode) - local curl_args = api.clone(api.curl_args) + local curl_args = { + "-skL", "-w %{http_code}", "--retry 3", "--connect-timeout 3" + } if ua and ua ~= "" and ua ~= "curl" then - table.insert(curl_args, '--user-agent "' .. ua .. '"') + curl_args[#curl_args + 1] = '--user-agent "' .. ua .. '"' end - local return_code + local return_code, result if mode == "direct" then - return_code = api.curl_direct(url, file, curl_args) + return_code, result = api.curl_direct(url, file, curl_args) elseif mode == "proxy" then - return_code = api.curl_proxy(url, file, curl_args) + return_code, result = api.curl_proxy(url, file, curl_args) else - return_code = api.curl_auto(url, file, curl_args) + return_code, result = api.curl_auto(url, file, curl_args) end - return return_code + return tonumber(result) end local function truncate_nodes(add_from) @@ -1714,34 +1716,23 @@ local execute = function() local result = (not access_mode) and "自动" or (access_mode == "direct" and "直连访问" or (access_mode == "proxy" and "通过代理" or "自动")) log('正在订阅:【' .. remark .. '】' .. url .. ' [' .. result .. ']') local tmp_file = "/tmp/" .. cfgid - local raw = curl(url, tmp_file, ua, access_mode) - if raw ~= 0 then + value.http_code = curl(url, tmp_file, ua, access_mode) + if value.http_code ~= 200 then fail_list[#fail_list + 1] = value else if luci.sys.call("[ -f " .. tmp_file .. " ] && sed -i -e '/^[ \t]*$/d' -e '/^[ \t]*\r$/d' " .. tmp_file) == 0 then local f = io.open(tmp_file, "r") - local count = 0 - for _ in f:lines() do - count = count + 1 - end - if count == 1 then - f:seek("set") - local stdout = f:read("*all") - f:close() - local raw_data = trim(stdout) - local old_md5 = value.md5 or "" - local new_md5 = luci.sys.exec("md5sum " .. tmp_file .. " 2>/dev/null | awk '{print $1}'"):gsub("\n", "") - os.remove(tmp_file) - if old_md5 == new_md5 then - log('订阅:【' .. remark .. '】没有变化,无需更新。') - else - parse_link(raw_data, "2", remark, cfgid) - uci:set(appname, cfgid, "md5", new_md5) - end + local stdout = f:read("*all") + f:close() + local raw_data = trim(stdout) + local old_md5 = value.md5 or "" + local new_md5 = luci.sys.exec("md5sum " .. tmp_file .. " 2>/dev/null | awk '{print $1}'"):gsub("\n", "") + os.remove(tmp_file) + if old_md5 == new_md5 then + log('订阅:【' .. remark .. '】没有变化,无需更新。') else - f:close() - os.remove(tmp_file) - fail_list[#fail_list + 1] = value + parse_link(raw_data, "2", remark, cfgid) + uci:set(appname, cfgid, "md5", new_md5) end else fail_list[#fail_list + 1] = value @@ -1760,7 +1751,7 @@ local execute = function() if #fail_list > 0 then for index, value in ipairs(fail_list) do - log(string.format('【%s】订阅失败,可能是订阅地址无效,或是网络问题,请诊断!', value.remark)) + log(string.format('【%s】订阅失败,可能是订阅地址无效,或是网络问题,请诊断![%s]', value.remark, tostring(value.http_code))) end end update_node(0)