Skip to content

Commit

Permalink
refactor(socket): embed ipv6 parameters in options
Browse files Browse the repository at this point in the history
Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
  • Loading branch information
zhaojh329 committed Mar 13, 2024
1 parent c625d4c commit 30c34c4
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 49 deletions.
6 changes: 4 additions & 2 deletions http/client.lua
Original file line number Diff line number Diff line change
Expand Up @@ -378,10 +378,12 @@ function methods:request(method, url, body, opts)
local sock

for _, a in ipairs(addresses) do
opts.ipv6 = a.type == dns.TYPE_AAAA

if scheme_info.use_ssl then
sock, err = ssl.connect(a.address, port, opts, a.type == dns.TYPE_AAAA)
sock, err = ssl.connect(a.address, port, opts)
else
sock, err = socket.connect_tcp(a.address, port, a.type == dns.TYPE_AAAA)
sock, err = socket.connect_tcp(a.address, port, opts)
end

if sock then
Expand Down
4 changes: 2 additions & 2 deletions http/server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -783,9 +783,9 @@ function M.listen(ipaddr, port, options, handler)

if options.cert and options.key then
options.ssl = true
sock, err = ssl.listen(ipaddr, port, options, options.ipv6)
sock, err = ssl.listen(ipaddr, port, options)
else
sock, err = socket.listen_tcp(ipaddr, port, options, options.ipv6)
sock, err = socket.listen_tcp(ipaddr, port, options)
end

if not sock then
Expand Down
104 changes: 63 additions & 41 deletions socket.lua
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ function methods:recvfrom(n, timeout)
return self.sock:recvfrom(n, timeout)
end

function M.socket(family, domain, protocol)
function M.socket(family, domain, protocol, options)
local sock, err = socket.socket(family, domain, protocol)
if not sock then
return nil, err
Expand All @@ -160,6 +160,24 @@ function M.socket(family, domain, protocol)
o.b = bufio.new(sock:getfd(), { eof_error = 'closed' })
end

options = options or {}

if options.reuseaddr then
sock:setoption('reuseaddr', true)
end

if options.reuseport then
sock:setoption('reuseport', true)
end

if options.ipv6_v6only then
sock:setoption('ipv6_v6only', true)
end

if options.mark then
sock:setoption('mark', options.mark)
end

return setmetatable(o, metatable)
end

Expand Down Expand Up @@ -204,24 +222,14 @@ function M.netlink(protocol)
return M.socket(socket.AF_NETLINK, socket.SOCK_RAW, protocol)
end

function M.listen_tcp(ipaddr, port, options, ipv6)
local sock, err = M.socket(ipv6 and socket.AF_INET6 or socket.AF_INET, socket.SOCK_STREAM)
if not sock then
return nil, err
end

function M.listen_tcp(ipaddr, port, options)
options = options or {}

if options.reuseaddr then
sock:setoption('reuseaddr', true)
end

if options.reuseport then
sock:setoption('reuseport', true)
end
local family = options.ipv6 and socket.AF_INET6 or socket.AF_INET

if options.ipv6_v6only then
sock:setoption('ipv6_v6only', true)
local sock, err = M.socket(family, socket.SOCK_STREAM, nil, options)
if not sock then
return nil, err
end

if options.tcp_nodelay then
Expand Down Expand Up @@ -257,60 +265,74 @@ function M.listen_tcp(ipaddr, port, options, ipv6)
end

function M.listen_tcp6(ipaddr, port, options)
return M.listen_tcp(ipaddr, port, options, true)
options = options or {}

options.ipv6 = true

return M.listen_tcp(ipaddr, port, options)
end

function M.connect_tcp(ipaddr, port, ipv6)
local sock, err = M.socket(ipv6 and socket.AF_INET6 or socket.AF_INET, socket.SOCK_STREAM)
function M.connect_tcp(ipaddr, port, options)
options = options or {}

local family = options.ipv6 and socket.AF_INET6 or socket.AF_INET

local sock, err = M.socket(family, socket.SOCK_STREAM, nil, options)
if not sock then
return nil, err
end

return sock:connect(ipaddr, port)
end

function M.connect_tcp6(ipaddr, port)
return M.connect_tcp(ipaddr, port, true)
end
function M.connect_tcp6(ipaddr, port, options)
options = options or {}

function M.listen_udp(ipaddr, port, options, ipv6)
local sock, err = M.socket(ipv6 and socket.AF_INET6 or socket.AF_INET, socket.SOCK_DGRAM)
if not sock then
return nil, err
end
options.ipv6 = true

options = options or {}
return M.connect_tcp(ipaddr, port, options)
end

if options.reuseaddr then
sock:setoption('reuseaddr', true)
end
function M.listen_udp(ipaddr, port, options)
options = options or {}

if options.reuseport then
sock:setoption('reuseport', true)
end
local family = options.ipv6 and socket.AF_INET6 or socket.AF_INET

if options.ipv6_v6only then
sock:setoption('ipv6_v6only', true)
local sock, err = M.socket(family, socket.SOCK_DGRAM, nil, options)
if not sock then
return nil, err
end

return sock:bind(ipaddr, port)
end

function M.listen_udp6(ipaddr, port, options)
return M.listen_udp(ipaddr, port, options, true)
options = options or {}

options.ipv6 = true

return M.listen_udp(ipaddr, port, options)
end

function M.connect_udp(ipaddr, port, ipv6)
local sock, err = M.socket(ipv6 and socket.AF_INET6 or socket.AF_INET, socket.SOCK_DGRAM)
function M.connect_udp(ipaddr, port, options)
options = options or {}

local family = options.ipv6 and socket.AF_INET6 or socket.AF_INET

local sock, err = M.socket(family, socket.SOCK_DGRAM, nil, options)
if not sock then
return nil, err
end

return sock:connect(ipaddr, port)
end

function M.connect_udp6(ipaddr, port)
return M.connect_udp(ipaddr, port, true)
function M.connect_udp6(ipaddr, port, options)
options = options or {}

options.ipv6 = true

return M.connect_udp(ipaddr, port, options)
end

function M.listen_unix(path, options)
Expand Down
8 changes: 4 additions & 4 deletions ssl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -181,10 +181,10 @@ local srv_metatable = {
__gc = srv_methods.close
}

function M.listen(ipaddr, port, options, ipv6)
function M.listen(ipaddr, port, options)
options = options or {}

local sock, err = socket.listen_tcp(ipaddr, port, options, ipv6)
local sock, err = socket.listen_tcp(ipaddr, port, options)
if not sock then
return nil, err
end
Expand All @@ -203,10 +203,10 @@ function M.listen(ipaddr, port, options, ipv6)
return setmetatable({ ctx = ctx, sock = sock, insecure = options.insecure }, srv_metatable)
end

function M.connect(ipaddr, port, options, ipv6)
function M.connect(ipaddr, port, options)
options = options or {}

local sock, err = socket.connect_tcp(ipaddr, port, ipv6)
local sock, err = socket.connect_tcp(ipaddr, port, options)
if not sock then
return nil, err
end
Expand Down

0 comments on commit 30c34c4

Please sign in to comment.