1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Copyright (C) 2015-2020, TBOOX Open Source Group.
--
-- @author ruki
-- @file proxy.lua
--
-- imports
import("core.base.global")
-- get proxy hosts
function _proxy_hosts()
local proxy_hosts = _g._PROXY_HOSTS
if proxy_hosts == nil then
proxy_hosts = global.get("proxy_hosts")
if proxy_hosts then
proxy_hosts = proxy_hosts:split(',', {plain = true})
end
_g._PROXY_HOSTS = proxy_hosts or false
end
return proxy_hosts or nil
end
-- get proxy pac file
function _proxy_pac()
local proxy_pac = _g._PROXY_PAC
if proxy_pac == nil then
local pac = global.get("proxy_pac")
local pacfile
if pac and pac:endswith(".lua") then
if os.isfile(pac) then
pacfile = pac
end
if not pacfile and not path.is_absolute(pac) then
pacfile = path.join(global.directory(), pac)
end
end
if pacfile and os.isfile(pacfile) then
proxy_pac = import(path.basename(pacfile), {rootdir = path.directory(pacfile), try = true, anonymous = true})
end
_g._PROXY_PAC = proxy_pac or false
end
return proxy_pac or nil
end
-- convert host pattern to a lua pattern
function _host_pattern(pattern)
pattern = pattern:gsub("([%+%.%-%^%$%(%)%%])", "%%%1")
pattern = pattern:gsub("%*", "\001")
pattern = pattern:gsub("\001", ".*")
return pattern
end
-- get proxy configuration from the given url, [protocol://]host[:port]
function get(url)
-- enable proxy for the given url and configuration pattern
if url then
-- get proxy from the given hosts pattern
local host = url:match("://(.-)/") or url:match("@(.-):")
local proxy_hosts = _proxy_hosts()
if host and proxy_hosts then
host = host:lower()
for _, proxy_host in ipairs(proxy_hosts) do
proxy_host = proxy_host:lower()
if host == proxy_hosts or host:match(_host_pattern(proxy_host)) then
return global.get("proxy")
end
end
end
-- get proxy from the pac file
local proxy_pac = _proxy_pac()
if proxy_pac and proxy_pac(url, host) then
return global.get("proxy")
end
return
end
-- enable global proxy
return global.get("proxy")
end
|