Annotation of embedaddon/axTLS/www/lua/download.lua, revision 1.1
1.1 ! misho 1: #!/usr/local/bin/lua
! 2:
! 3: require"luasocket"
! 4:
! 5: function receive (connection)
! 6: connection:settimeout(0)
! 7: local s, status = connection:receive (2^10)
! 8: if status == "timeout" then
! 9: coroutine.yield (connection)
! 10: end
! 11: return s, status
! 12: end
! 13:
! 14: function download (host, file, outfile)
! 15: --local f = assert (io.open (outfile, "w"))
! 16: local c = assert (socket.connect (host, 80))
! 17: c:send ("GET "..file.." HTTP/1.0\r\n\r\n")
! 18: while true do
! 19: local s, status = receive (c)
! 20: --f:write (s)
! 21: if status == "closed" then
! 22: break
! 23: end
! 24: end
! 25: c:close()
! 26: --f:close()
! 27: end
! 28:
! 29: local threads = {}
! 30: function get (host, file, outfile)
! 31: print (string.format ("Downloading %s from %s to %s", file, host, outfile))
! 32: local co = coroutine.create (function ()
! 33: return download (host, file, outfile)
! 34: end)
! 35: table.insert (threads, co)
! 36: end
! 37:
! 38: function dispatcher ()
! 39: while true do
! 40: local n = table.getn (threads)
! 41: if n == 0 then
! 42: break
! 43: end
! 44: local connections = {}
! 45: for i = 1, n do
! 46: local status, res = coroutine.resume (threads[i])
! 47: if not res then
! 48: table.remove (threads, i)
! 49: break
! 50: else
! 51: table.insert (connections, res)
! 52: end
! 53: end
! 54: if table.getn (connections) == n then
! 55: socket.select (connections)
! 56: end
! 57: end
! 58: end
! 59:
! 60: local url = arg[1]
! 61: if not url then
! 62: print (string.format ("usage: %s url [times]", arg[0]))
! 63: os.exit()
! 64: end
! 65: local times = arg[2] or 5
! 66:
! 67: url = string.gsub (url, "^http.?://", "")
! 68: local _, _, host, file = string.find (url, "^([^/]+)(/.*)")
! 69: local _, _, fn = string.find (file, "([^/]+)$")
! 70:
! 71: for i = 1, times do
! 72: get (host, file, fn..i)
! 73: end
! 74:
! 75: dispatcher ()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>