Advertisement
Good_Pudge

Internet API (not (C))

Dec 1st, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.97 KB | None | 0 0
  1. --############################################################################--
  2. --################Creators is MightyPirates and others...######################--
  3. --############################################################################--
  4.  
  5. local buffer = require("buffer")
  6. local component = require("component")
  7. local event = require("event")
  8.  
  9. local internet = {}
  10.  
  11. -------------------------------------------------------------------------------
  12.  
  13. function internet.request(url, data, headers)
  14.   checkArg(1, url, "string")
  15.   checkArg(2, data, "string", "table", "nil")
  16.   checkArg(3, headers, "table", "nil")
  17.  
  18.   local inet = component.internet
  19.   if not inet then
  20.     error("no primary internet card found", 2)
  21.   end
  22.  
  23.   local post
  24.   if type(data) == "string" then
  25.     post = data
  26.   elseif type(data) == "table" then
  27.     for k, v in pairs(data) do
  28.       post = post and (post .. "&") or ""
  29.       post = post .. tostring(k) .. "=" .. tostring(v)
  30.     end
  31.   end
  32.  
  33.   local request, reason = inet.request(url, post, headers)
  34.   if not request then
  35.     error(reason, 2)
  36.   end
  37.  
  38.   return function()
  39.     while true do
  40.       local data, reason = request.read()
  41.       if not data then
  42.         request.close()
  43.         if reason then
  44.           error(reason, 2)
  45.         else
  46.           return nil -- eof
  47.         end
  48.       elseif #data > 0 then
  49.         return data
  50.       end
  51.       -- else: no data, block
  52.       os.sleep(0)
  53.     end
  54.   end
  55. end
  56.  
  57. -------------------------------------------------------------------------------
  58.  
  59. local socketStream = {}
  60.  
  61. function socketStream:close()
  62.   if self.socket then
  63.     self.socket.close()
  64.     self.socket = nil
  65.   end
  66. end
  67.  
  68. function socketStream:seek()
  69.   return nil, "bad file descriptor"
  70. end
  71.  
  72. function socketStream:read(n)
  73.   if not self.socket then
  74.     return nil, "connection is closed"
  75.   end
  76.   return self.socket.read(n)
  77. end
  78.  
  79. function socketStream:write(value)
  80.   if not self.socket then
  81.     return nil, "connection is closed"
  82.   end
  83.   while #value > 0 do
  84.     local written, reason = self.socket.write(value)
  85.     if not written then
  86.       return nil, reason
  87.     end
  88.     value = string.sub(value, written + 1)
  89.   end
  90.   return true
  91. end
  92.  
  93. function internet.socket(address, port)
  94.   checkArg(1, address, "string")
  95.   checkArg(2, port, "number", "nil")
  96.   if port then
  97.     address = address .. ":" .. port
  98.   end
  99.  
  100.   local inet = component.internet
  101.   local socket, reason = inet.connect(address)
  102.   if not socket then
  103.     return nil, reason
  104.   end
  105.  
  106.   local stream = {inet = inet, socket = socket}
  107.   local metatable = {__index = socketStream,
  108.                      __metatable = "socketstream"}
  109.   return setmetatable(stream, metatable)
  110. end
  111.  
  112. function internet.open(address, port)
  113.   local stream, reason = internet.socket(address, port)
  114.   if not stream then
  115.     return nil, reason
  116.   end
  117.   return buffer.new("rwb", stream)
  118. end
  119.  
  120. -------------------------------------------------------------------------------
  121.  
  122. return internet
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement