Merge pull request #49 from moteus/master
Update `uvwget` example [ci skip]
This commit is contained in:
commit
13d21e5016
@ -1,16 +1,22 @@
|
|||||||
|
--
|
||||||
|
-- implementation of uvwget example from
|
||||||
|
-- http://nikhilm.github.io/uvbook/index.html
|
||||||
|
--
|
||||||
|
|
||||||
local curl = require "cURL"
|
local curl = require "cURL"
|
||||||
local uv = require "lluv"
|
local uv = require "lluv"
|
||||||
local ut = require "lluv.utils"
|
local ut = require "lluv.utils"
|
||||||
|
|
||||||
local fprintf = function(f, ...) f:write((string.format(...))) end
|
local fprintf = function(f, ...) f:write((string.format(...))) end
|
||||||
local printf = function(...) fprintf(io.stdout, ...) end
|
|
||||||
|
|
||||||
local stderr = io.stderr
|
local stderr = io.stderr
|
||||||
|
|
||||||
local trace = false
|
local trace = false do
|
||||||
|
|
||||||
trace = trace and print or function() end
|
trace = trace and print or function() end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
local ACTION_NAMES = {
|
local ACTION_NAMES = {
|
||||||
[curl.POLL_IN ] = "POLL_IN";
|
[curl.POLL_IN ] = "POLL_IN";
|
||||||
[curl.POLL_INOUT ] = "POLL_INOUT";
|
[curl.POLL_INOUT ] = "POLL_INOUT";
|
||||||
@ -19,9 +25,15 @@ local ACTION_NAMES = {
|
|||||||
[curl.POLL_REMOVE ] = "POLL_REMOVE";
|
[curl.POLL_REMOVE ] = "POLL_REMOVE";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local POLL_IO_FLAGS = {
|
||||||
|
[ curl.POLL_IN ] = uv.READABLE;
|
||||||
|
[ curl.POLL_OUT ] = uv.WRITABLE;
|
||||||
|
[ curl.POLL_INOUT ] = uv.READABLE + uv.WRITABLE;
|
||||||
|
}
|
||||||
|
|
||||||
local EVENT_NAMES = {
|
local EVENT_NAMES = {
|
||||||
[ uv.READABLE ] = "READABLE";
|
[ uv.READABLE ] = "READABLE";
|
||||||
[ uv.WRITABLE ] = "WRITABLE";
|
[ uv.WRITABLE ] = "WRITABLE";
|
||||||
[ uv.READABLE + uv.WRITABLE ] = "READABLE + WRITABLE";
|
[ uv.READABLE + uv.WRITABLE ] = "READABLE + WRITABLE";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,12 +43,6 @@ local FLAGS = {
|
|||||||
[ uv.READABLE + uv.WRITABLE ] = curl.CSELECT_IN + curl.CSELECT_OUT;
|
[ uv.READABLE + uv.WRITABLE ] = curl.CSELECT_IN + curl.CSELECT_OUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
local POLL_IO_FLAGS = {
|
|
||||||
[ curl.POLL_IN ] = uv.READABLE;
|
|
||||||
[ curl.POLL_OUT ] = uv.WRITABLE;
|
|
||||||
[ curl.POLL_INOUT ] = uv.READABLE + uv.WRITABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
local Context = ut.class() do
|
local Context = ut.class() do
|
||||||
|
|
||||||
function Context:__init(fd)
|
function Context:__init(fd)
|
||||||
@ -66,12 +72,11 @@ end
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Number of parallel request
|
local MAX_REQUESTS = 64 -- Number of parallel request
|
||||||
local MAX_REQUESTS
|
|
||||||
local timer, multi
|
local timer, multi
|
||||||
local qtask = ut.Queue.new() -- wait tasks
|
local qtask = ut.Queue.new() -- wait tasks
|
||||||
local qfree = ut.Queue.new() -- avaliable easy handles
|
local qfree = ut.Queue.new() -- avaliable easy handles
|
||||||
local qeasy = {} -- all easy handles
|
local qeasy = {} -- all easy handles
|
||||||
|
|
||||||
local function on_begin(handle, url, num)
|
local function on_begin(handle, url, num)
|
||||||
local filename = tostring(num) .. ".download"
|
local filename = tostring(num) .. ".download"
|
||||||
@ -92,9 +97,9 @@ local function on_end(handle, err, url)
|
|||||||
handle.data.file = nil
|
handle.data.file = nil
|
||||||
|
|
||||||
if err then
|
if err then
|
||||||
printf("%s ERROR - %s\n", url, tostring(err));
|
fprintf(stderr, "%s ERROR - %s\n", url, tostring(err));
|
||||||
else
|
else
|
||||||
printf("%s DONE\n", url);
|
fprintf(stderr, "%s DONE\n", url);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -103,6 +108,13 @@ local function cleanup()
|
|||||||
|
|
||||||
for i, easy in ipairs(qeasy) do
|
for i, easy in ipairs(qeasy) do
|
||||||
multi:remove_handle(easy)
|
multi:remove_handle(easy)
|
||||||
|
if easy.data then
|
||||||
|
local context = easy.data.context
|
||||||
|
if context then context:close() end
|
||||||
|
|
||||||
|
local file = easy.data.file
|
||||||
|
if file then on_end(easy, 'closed', easy:getinfo_effective_url()) end
|
||||||
|
end
|
||||||
easy:close()
|
easy:close()
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -223,12 +235,12 @@ local curl_check_multi_info = function()
|
|||||||
proceed_queue()
|
proceed_queue()
|
||||||
end
|
end
|
||||||
|
|
||||||
on_libuv_poll = function(handle, err, events)
|
on_libuv_poll = function(poller, err, events)
|
||||||
trace("UV::POLL", handle, err, EVENT_NAMES[events] or events)
|
trace("UV::POLL", poller, err, EVENT_NAMES[events] or events)
|
||||||
|
|
||||||
local flags = assert(FLAGS[events], ("unknown event:" .. events))
|
local flags = assert(FLAGS[events], ("unknown event:" .. events))
|
||||||
|
|
||||||
context = handle.data.context
|
local context = poller.data.context
|
||||||
|
|
||||||
multi:socket_action(context:fileno(), flags)
|
multi:socket_action(context:fileno(), flags)
|
||||||
|
|
||||||
@ -238,15 +250,13 @@ end
|
|||||||
on_libuv_timeout = function(timer)
|
on_libuv_timeout = function(timer)
|
||||||
trace("UV::TIMEOUT", timer)
|
trace("UV::TIMEOUT", timer)
|
||||||
|
|
||||||
local running_handles, err = multi:socket_action()
|
multi:socket_action()
|
||||||
|
|
||||||
curl_check_multi_info()
|
curl_check_multi_info()
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
MAX_REQUESTS = 64
|
|
||||||
|
|
||||||
timer = uv.timer()
|
timer = uv.timer()
|
||||||
|
|
||||||
multi = curl.multi{
|
multi = curl.multi{
|
Loading…
x
Reference in New Issue
Block a user