File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / axTLS / www / lua / download.lua
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Sep 28 11:55:55 2012 UTC (12 years, 6 months ago) by misho
Branches: v1_4_8, MAIN
CVS tags: datecs, HEAD
axTLS

    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>