Rework LuCI build system
[project/luci.git] / libs / luci-lib-nixio / axTLS / www / lua / download.lua
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 ()