summaryrefslogtreecommitdiffhomepage
path: root/libs/luci-lib-nixio/axTLS/www/lua/download.lua
diff options
context:
space:
mode:
Diffstat (limited to 'libs/luci-lib-nixio/axTLS/www/lua/download.lua')
-rw-r--r--libs/luci-lib-nixio/axTLS/www/lua/download.lua75
1 files changed, 75 insertions, 0 deletions
diff --git a/libs/luci-lib-nixio/axTLS/www/lua/download.lua b/libs/luci-lib-nixio/axTLS/www/lua/download.lua
new file mode 100644
index 000000000..2ee1a71e9
--- /dev/null
+++ b/libs/luci-lib-nixio/axTLS/www/lua/download.lua
@@ -0,0 +1,75 @@
+#!/usr/local/bin/lua
+
+require"luasocket"
+
+function receive (connection)
+ connection:settimeout(0)
+ local s, status = connection:receive (2^10)
+ if status == "timeout" then
+ coroutine.yield (connection)
+ end
+ return s, status
+end
+
+function download (host, file, outfile)
+ --local f = assert (io.open (outfile, "w"))
+ local c = assert (socket.connect (host, 80))
+ c:send ("GET "..file.." HTTP/1.0\r\n\r\n")
+ while true do
+ local s, status = receive (c)
+ --f:write (s)
+ if status == "closed" then
+ break
+ end
+ end
+ c:close()
+ --f:close()
+end
+
+local threads = {}
+function get (host, file, outfile)
+ print (string.format ("Downloading %s from %s to %s", file, host, outfile))
+ local co = coroutine.create (function ()
+ return download (host, file, outfile)
+ end)
+ table.insert (threads, co)
+end
+
+function dispatcher ()
+ while true do
+ local n = table.getn (threads)
+ if n == 0 then
+ break
+ end
+ local connections = {}
+ for i = 1, n do
+ local status, res = coroutine.resume (threads[i])
+ if not res then
+ table.remove (threads, i)
+ break
+ else
+ table.insert (connections, res)
+ end
+ end
+ if table.getn (connections) == n then
+ socket.select (connections)
+ end
+ end
+end
+
+local url = arg[1]
+if not url then
+ print (string.format ("usage: %s url [times]", arg[0]))
+ os.exit()
+end
+local times = arg[2] or 5
+
+url = string.gsub (url, "^http.?://", "")
+local _, _, host, file = string.find (url, "^([^/]+)(/.*)")
+local _, _, fn = string.find (file, "([^/]+)$")
+
+for i = 1, times do
+ get (host, file, fn..i)
+end
+
+dispatcher ()