mirror of
https://github.com/lunarmodules/luasocket.git
synced 2025-07-15 21:39:51 +02:00
Compare commits
2 Commits
1531e31dfb
...
hjelmeland
Author | SHA1 | Date | |
---|---|---|---|
5c4fc93d5f | |||
ccef3bc4e2 |
@ -89,7 +89,7 @@ it should be easy to use LuaSocket. Just fire the interpreter and use the
|
|||||||
Lua 5.2.2 Copyright (C) 1994-2013 Lua.org, PUC-Rio
|
Lua 5.2.2 Copyright (C) 1994-2013 Lua.org, PUC-Rio
|
||||||
> socket = require("socket")
|
> socket = require("socket")
|
||||||
> print(socket._VERSION)
|
> print(socket._VERSION)
|
||||||
--> LuaSocket 3.1.0
|
--> LuaSocket 3.0.0
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p> Each module loads their dependencies automatically, so you only need to
|
<p> Each module loads their dependencies automatically, so you only need to
|
||||||
|
@ -69,7 +69,6 @@ local function make_plat(plat)
|
|||||||
["socket.smtp"] = "src/smtp.lua",
|
["socket.smtp"] = "src/smtp.lua",
|
||||||
ltn12 = "src/ltn12.lua",
|
ltn12 = "src/ltn12.lua",
|
||||||
socket = "src/socket.lua",
|
socket = "src/socket.lua",
|
||||||
mbox = "src/mbox.lua",
|
|
||||||
mime = "src/mime.lua"
|
mime = "src/mime.lua"
|
||||||
}
|
}
|
||||||
if plat == "unix"
|
if plat == "unix"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# Distribution makefile
|
# Distribution makefile
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
DIST = luasocket-3.1.0
|
DIST = luasocket-3.0.0
|
||||||
|
|
||||||
TEST = \
|
TEST = \
|
||||||
test/README \
|
test/README \
|
||||||
|
110
src/http.lua
110
src/http.lua
@ -203,15 +203,8 @@ end
|
|||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
local function adjusturi(reqt)
|
local function adjusturi(reqt)
|
||||||
local u = reqt
|
local u = reqt
|
||||||
local proxy
|
-- if there is a proxy, we need the full url. otherwise, just a part.
|
||||||
if reqt.proxy then
|
if not reqt.proxy and not _M.PROXY then
|
||||||
proxy = url.parse(reqt.proxy)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- We just need the path if there's no proxy,
|
|
||||||
-- or if we use https over an http proxy.
|
|
||||||
-- Otherwise, we use a full url
|
|
||||||
if not proxy or (reqt.scheme == "https" and proxy.scheme == "http") then
|
|
||||||
u = {
|
u = {
|
||||||
path = socket.try(reqt.path, "invalid path 'nil'"),
|
path = socket.try(reqt.path, "invalid path 'nil'"),
|
||||||
params = reqt.params,
|
params = reqt.params,
|
||||||
@ -222,7 +215,17 @@ local function adjusturi(reqt)
|
|||||||
return url.build(u)
|
return url.build(u)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function adjustheaders(reqt, https_connect)
|
local function adjustproxy(reqt)
|
||||||
|
local proxy = reqt.proxy or _M.PROXY
|
||||||
|
if proxy then
|
||||||
|
proxy = url.parse(proxy)
|
||||||
|
return proxy.host, proxy.port or 3128
|
||||||
|
else
|
||||||
|
return reqt.host, reqt.port
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function adjustheaders(reqt)
|
||||||
-- default headers
|
-- default headers
|
||||||
local host = reqt.host
|
local host = reqt.host
|
||||||
local port = tostring(reqt.port)
|
local port = tostring(reqt.port)
|
||||||
@ -241,8 +244,9 @@ local function adjustheaders(reqt, https_connect)
|
|||||||
url.unescape(reqt.password)))
|
url.unescape(reqt.password)))
|
||||||
end
|
end
|
||||||
-- if we have proxy authentication information, pass it along
|
-- if we have proxy authentication information, pass it along
|
||||||
if reqt.proxy and (reqt.scheme == "http" or https_connect) then
|
local proxy = reqt.proxy or _M.PROXY
|
||||||
local proxy = url.parse(reqt.proxy)
|
if proxy then
|
||||||
|
proxy = url.parse(proxy)
|
||||||
if proxy.user and proxy.password then
|
if proxy.user and proxy.password then
|
||||||
lower["proxy-authorization"] =
|
lower["proxy-authorization"] =
|
||||||
"Basic " .. (mime.b64(proxy.user .. ":" .. proxy.password))
|
"Basic " .. (mime.b64(proxy.user .. ":" .. proxy.password))
|
||||||
@ -255,80 +259,6 @@ local function adjustheaders(reqt, https_connect)
|
|||||||
return lower
|
return lower
|
||||||
end
|
end
|
||||||
|
|
||||||
local function reg(conn)
|
|
||||||
local mt = getmetatable(conn.sock).__index
|
|
||||||
for name, method in pairs(mt) do
|
|
||||||
if type(method) == "function" then
|
|
||||||
conn[name] = function (self, ...)
|
|
||||||
return method(self.sock, ...)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function proxy_connect_create(params, proxy)
|
|
||||||
-- Copied and adapted from luasec's https.lua
|
|
||||||
-- in function ssl.http.tcp()
|
|
||||||
|
|
||||||
local ssl = assert(
|
|
||||||
require("ssl"), 'LuaSocket: LuaSec not found')
|
|
||||||
local https = assert(
|
|
||||||
require("ssl.https"), 'LuaSocket: LuaSec not found')
|
|
||||||
|
|
||||||
-- Force client mode
|
|
||||||
params.mode = "client"
|
|
||||||
-- 'create' function
|
|
||||||
return function ()
|
|
||||||
local conn = {}
|
|
||||||
conn.proxy_sock = _M.open(proxy.host, proxy.port, proxy.create)
|
|
||||||
local try = conn.proxy_sock.try
|
|
||||||
|
|
||||||
function conn:settimeout(...)
|
|
||||||
return self.proxy_sock.c:settimeout(https.TIMEOUT)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Wrap the underlying connection function
|
|
||||||
function conn:connect(host, port)
|
|
||||||
conn.proxy_sock:sendrequestline("CONNECT", host .. ":" .. tostring(port))
|
|
||||||
conn.proxy_sock:sendheaders(adjustheaders(proxy, true))
|
|
||||||
|
|
||||||
local code, _ = conn.proxy_sock:receivestatusline()
|
|
||||||
try(code == 200 or nil)
|
|
||||||
|
|
||||||
self.sock = try(ssl.wrap(self.proxy_sock.c, params))
|
|
||||||
self.sock:sni(host)
|
|
||||||
self.sock:settimeout(https.TIMEOUT)
|
|
||||||
try(self.sock:dohandshake())
|
|
||||||
reg(self)
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Close the underlying socket
|
|
||||||
function conn:close()
|
|
||||||
conn.proxy_sock:close()
|
|
||||||
end
|
|
||||||
|
|
||||||
return conn
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function adjustproxy(reqt)
|
|
||||||
if reqt.proxy then
|
|
||||||
local proxy = url.parse(reqt.proxy)
|
|
||||||
proxy.port = proxy.port or 3128
|
|
||||||
proxy.create = SCHEMES[proxy.scheme].create(reqt)
|
|
||||||
|
|
||||||
if reqt.scheme == "https" and proxy.scheme == "http" then
|
|
||||||
local wrapped_create = proxy_connect_create(reqt, proxy)
|
|
||||||
return reqt.host, reqt.port, wrapped_create
|
|
||||||
else
|
|
||||||
return proxy.host, proxy.port, proxy.create
|
|
||||||
end
|
|
||||||
else
|
|
||||||
return reqt.host, reqt.port, reqt.create
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- default url parts
|
-- default url parts
|
||||||
local default = {
|
local default = {
|
||||||
path ="/"
|
path ="/"
|
||||||
@ -338,8 +268,6 @@ local default = {
|
|||||||
local function adjustrequest(reqt)
|
local function adjustrequest(reqt)
|
||||||
-- parse url if provided
|
-- parse url if provided
|
||||||
local nreqt = reqt.url and url.parse(reqt.url, default) or {}
|
local nreqt = reqt.url and url.parse(reqt.url, default) or {}
|
||||||
-- get global proxy
|
|
||||||
nreqt.proxy = reqt.proxy or _M.PROXY
|
|
||||||
-- explicit components override url
|
-- explicit components override url
|
||||||
for i,v in base.pairs(reqt) do nreqt[i] = v end
|
for i,v in base.pairs(reqt) do nreqt[i] = v end
|
||||||
-- default to scheme particulars
|
-- default to scheme particulars
|
||||||
@ -354,7 +282,7 @@ local function adjustrequest(reqt)
|
|||||||
-- compute uri if user hasn't overriden
|
-- compute uri if user hasn't overriden
|
||||||
nreqt.uri = reqt.uri or adjusturi(nreqt)
|
nreqt.uri = reqt.uri or adjusturi(nreqt)
|
||||||
-- adjust headers in request
|
-- adjust headers in request
|
||||||
nreqt.headers = adjustheaders(nreqt, false)
|
nreqt.headers = adjustheaders(nreqt)
|
||||||
if nreqt.source
|
if nreqt.source
|
||||||
and not nreqt.headers["content-length"]
|
and not nreqt.headers["content-length"]
|
||||||
and not nreqt.headers["transfer-encoding"]
|
and not nreqt.headers["transfer-encoding"]
|
||||||
@ -362,8 +290,8 @@ local function adjustrequest(reqt)
|
|||||||
nreqt.headers["transfer-encoding"] = "chunked"
|
nreqt.headers["transfer-encoding"] = "chunked"
|
||||||
end
|
end
|
||||||
|
|
||||||
-- adjust host, port and create if there is a proxy
|
-- ajust host and port if there is a proxy
|
||||||
nreqt.host, nreqt.port, nreqt.create = adjustproxy(nreqt)
|
nreqt.host, nreqt.port = adjustproxy(nreqt)
|
||||||
return nreqt
|
return nreqt
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -290,7 +290,7 @@ int inet_meth_getsockname(lua_State *L, p_socket ps, int family)
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
lua_pushstring(L, name);
|
lua_pushstring(L, name);
|
||||||
lua_pushinteger(L, (int) strtol(port, (char **) NULL, 10));
|
lua_pushstring(L, port);
|
||||||
switch (family) {
|
switch (family) {
|
||||||
case AF_INET: lua_pushliteral(L, "inet"); break;
|
case AF_INET: lua_pushliteral(L, "inet"); break;
|
||||||
case AF_INET6: lua_pushliteral(L, "inet6"); break;
|
case AF_INET6: lua_pushliteral(L, "inet6"); break;
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
/*-------------------------------------------------------------------------* \
|
/*-------------------------------------------------------------------------* \
|
||||||
* Current socket library version
|
* Current socket library version
|
||||||
\*-------------------------------------------------------------------------*/
|
\*-------------------------------------------------------------------------*/
|
||||||
#define LUASOCKET_VERSION "LuaSocket 3.1.0"
|
#define LUASOCKET_VERSION "LuaSocket 3.0.0"
|
||||||
#define LUASOCKET_COPYRIGHT "Copyright (C) 1999-2013 Diego Nehab"
|
#define LUASOCKET_COPYRIGHT "Copyright (C) 1999-2013 Diego Nehab"
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*\
|
/*-------------------------------------------------------------------------*\
|
||||||
|
@ -272,7 +272,7 @@ SOCKET_win64=wsocket.obj
|
|||||||
#
|
#
|
||||||
SO=$(SO_$(PLAT))
|
SO=$(SO_$(PLAT))
|
||||||
O=$(O_$(PLAT))
|
O=$(O_$(PLAT))
|
||||||
SOCKET_V=3.1.0
|
SOCKET_V=3.0.0
|
||||||
MIME_V=1.0.3
|
MIME_V=1.0.3
|
||||||
SOCKET_SO=socket-$(SOCKET_V).$(SO)
|
SOCKET_SO=socket-$(SOCKET_V).$(SO)
|
||||||
MIME_SO=mime-$(MIME_V).$(SO)
|
MIME_SO=mime-$(MIME_V).$(SO)
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#define PIE_CONNREFUSED "connection refused"
|
#define PIE_CONNREFUSED "connection refused"
|
||||||
#define PIE_CONNABORTED "closed"
|
#define PIE_CONNABORTED "closed"
|
||||||
#define PIE_CONNRESET "closed"
|
#define PIE_CONNRESET "closed"
|
||||||
#define PIE_TIMEDOUT "timeout"
|
#define PIE_TIMEDOUT "connection timeout"
|
||||||
#define PIE_AGAIN "temporary failure in name resolution"
|
#define PIE_AGAIN "temporary failure in name resolution"
|
||||||
#define PIE_BADFLAGS "invalid value for ai_flags"
|
#define PIE_BADFLAGS "invalid value for ai_flags"
|
||||||
#define PIE_BADHINTS "invalid value for hints"
|
#define PIE_BADHINTS "invalid value for hints"
|
||||||
|
@ -152,7 +152,7 @@ function _M.parse(url, default)
|
|||||||
url = string.gsub(url, "^([%w][%w%+%-%.]*)%:",
|
url = string.gsub(url, "^([%w][%w%+%-%.]*)%:",
|
||||||
function(s) parsed.scheme = s; return "" end)
|
function(s) parsed.scheme = s; return "" end)
|
||||||
-- get authority
|
-- get authority
|
||||||
url = string.gsub(url, "^//([^/%?#]*)", function(n)
|
url = string.gsub(url, "^//([^/]*)", function(n)
|
||||||
parsed.authority = n
|
parsed.authority = n
|
||||||
return ""
|
return ""
|
||||||
end)
|
end)
|
||||||
|
@ -262,7 +262,6 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got,
|
|||||||
if (err != WSAEWOULDBLOCK) {
|
if (err != WSAEWOULDBLOCK) {
|
||||||
if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
|
if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
|
||||||
prev = err;
|
prev = err;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
|
if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
|
||||||
}
|
}
|
||||||
@ -292,7 +291,6 @@ int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,
|
|||||||
if (err != WSAEWOULDBLOCK) {
|
if (err != WSAEWOULDBLOCK) {
|
||||||
if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
|
if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
|
||||||
prev = err;
|
prev = err;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
|
if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user