blob: 00fbf644c374a19c70cfa7917f124c68ddab18bf [file] [log] [blame] [raw]
local buffer = require("buffer")
local component = require("component")
local internet = {}
-------------------------------------------------------------------------------
function internet.request(url, data)
checkArg(1, url, "string")
checkArg(2, data, "string", "table", "nil")
local inet = component.internet
if not inet then
error("no primary internet card found", 2)
end
local post
if type(data) == "string" then
post = data
elseif type(data) == "table" then
for k, v in pairs(data) do
post = post and (post .. "&") or ""
post = post .. tostring(k) .. "=" .. tostring(v)
end
end
local request, reason = inet.request(url, post)
if not request then
error(reason, 2)
end
return function()
while true do
local data, reason = request.read()
if not data then
request.close()
if reason then
error(reason, 2)
else
return nil -- eof
end
elseif #data > 0 then
return data
end
-- else: no data, block
os.sleep(0)
end
end
end
-------------------------------------------------------------------------------
local socketStream = {}
function socketStream:close()
if self.socket then
self.socket.close()
self.socket = nil
end
end
function socketStream:seek()
return nil, "bad file descriptor"
end
function socketStream:read(n)
if not self.socket then
return nil, "connection is closed"
end
return self.socket.read(n)
end
function socketStream:write(value)
if not self.socket then
return nil, "connection is closed"
end
while #value > 0 do
local written, reason = self.socket.write(value)
if not written then
return nil, reason
end
value = string.sub(value, written + 1)
end
return true
end
function internet.socket(address, port)
checkArg(1, address, "string")
checkArg(2, port, "number", "nil")
if port then
address = address .. ":" .. port
end
local inet = component.internet
local socket, reason = inet.connect(address)
if not socket then
return nil, reason
end
local stream = {inet = inet, socket = socket}
local metatable = {__index = socketStream,
__metatable = "socketstream"}
return setmetatable(stream, metatable)
end
function internet.open(address, port)
local stream, reason = internet.socket(address, port)
if not stream then
return nil, reason
end
return buffer.new("rwb", stream)
end
-------------------------------------------------------------------------------
return internet