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>