internet fixes
This commit is contained in:
parent
7b486671a8
commit
530be4d214
@ -15,6 +15,7 @@
|
|||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
static int l_open(lua_State *L) { //TODO: Any mem leaks?
|
static int l_open(lua_State *L) { //TODO: Any mem leaks?
|
||||||
const char* hostaddr = lua_tostring(L, 1);
|
const char* hostaddr = lua_tostring(L, 1);
|
||||||
@ -75,7 +76,10 @@ static int l_write(lua_State *L) {
|
|||||||
|
|
||||||
while(total < len) {
|
while(total < len) {
|
||||||
n = send(fd, data+total, len, 0);
|
n = send(fd, data+total, len, 0);
|
||||||
if (n == -1) { break; }
|
if (n == -1) {
|
||||||
|
if(errno == EPIPE)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
total += n;
|
total += n;
|
||||||
len -= n;
|
len -= n;
|
||||||
}
|
}
|
||||||
@ -106,6 +110,8 @@ static int l_read(lua_State *L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void internet_start(lua_State *L) {
|
void internet_start(lua_State *L) {
|
||||||
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
lua_createtable (L, 0, 1);
|
lua_createtable (L, 0, 1);
|
||||||
|
|
||||||
pushctuple(L, "open", l_open);
|
pushctuple(L, "open", l_open);
|
||||||
|
@ -15,9 +15,14 @@ function internet.start()
|
|||||||
--Old TCP
|
--Old TCP
|
||||||
function component.connect(address, port)
|
function component.connect(address, port)
|
||||||
checkArg(1, address, "string")
|
checkArg(1, address, "string")
|
||||||
checkArg(2, port, "number")
|
checkArg(2, port, "number", "nil")
|
||||||
|
if not port then
|
||||||
|
address, port = address:match("(.+):(.+)")
|
||||||
|
port = tonumber(port)
|
||||||
|
end
|
||||||
|
|
||||||
local sfd, reason = net.open(address, port)
|
local sfd, reason = net.open(address, port)
|
||||||
|
local closed = false
|
||||||
return {
|
return {
|
||||||
finishConnect = function()
|
finishConnect = function()
|
||||||
if not sfd then
|
if not sfd then
|
||||||
@ -26,15 +31,30 @@ function internet.start()
|
|||||||
return true
|
return true
|
||||||
end,
|
end,
|
||||||
read = function(n)
|
read = function(n)
|
||||||
|
if closed then return nil, "connection lost" end
|
||||||
n = n or 65535
|
n = n or 65535
|
||||||
checkArg(1, n, "number")
|
checkArg(1, n, "number")
|
||||||
return net.read(sfd, n)
|
local data = net.read(sfd, n)
|
||||||
|
if not data then
|
||||||
|
closed = true
|
||||||
|
native.fs_close(sfd)
|
||||||
|
return nil, "connection lost"
|
||||||
|
end
|
||||||
|
return data
|
||||||
end,
|
end,
|
||||||
write = function(data)
|
write = function(data)
|
||||||
|
if closed then return nil, "connection lost" end
|
||||||
checkArg(1, data, "string")
|
checkArg(1, data, "string")
|
||||||
return net.write(sfd, data)
|
local written = net.write(sfd, data)
|
||||||
|
if not written then
|
||||||
|
closed = true
|
||||||
|
native.fs_close(sfd)
|
||||||
|
return nil, "connection lost"
|
||||||
|
end
|
||||||
|
return written
|
||||||
end,
|
end,
|
||||||
close = function()
|
close = function()
|
||||||
|
closed = true
|
||||||
native.fs_close(sfd)
|
native.fs_close(sfd)
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
@ -42,6 +62,7 @@ function internet.start()
|
|||||||
|
|
||||||
function component.request(url, post)
|
function component.request(url, post)
|
||||||
local host = url:match("http://([^/]+)")
|
local host = url:match("http://([^/]+)")
|
||||||
|
if not host then io.stderr:write("LERR" .. url .. "\n") end
|
||||||
local socket = component.connect(host, 80)
|
local socket = component.connect(host, 80)
|
||||||
if socket.finishConnect() then
|
if socket.finishConnect() then
|
||||||
socket.write("GET " .. url .. " HTTP/1.1\r\nHost: " .. host .. "\r\nConnection: close\r\n\r\n")
|
socket.write("GET " .. url .. " HTTP/1.1\r\nHost: " .. host .. "\r\nConnection: close\r\n\r\n")
|
||||||
@ -86,7 +107,6 @@ function internet.start()
|
|||||||
if not line or line == "" or line == "\r" then
|
if not line or line == "" or line == "\r" then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
io.stderr:write("\nline: " .. line .. "\n")
|
|
||||||
local k, v = line:match("([^:]+): (.+)\r")
|
local k, v = line:match("([^:]+): (.+)\r")
|
||||||
header[k:lower()] = v
|
header[k:lower()] = v
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user