1
+ --
2
+ -- implementation of uvwget example from
3
+ -- http://nikhilm.github.io/uvbook/index.html
4
+ --
5
+
1
6
local curl = require " cURL"
2
7
local uv = require " lluv"
3
8
local ut = require " lluv.utils"
4
9
5
10
local fprintf = function (f , ...) f :write ((string.format (... ))) end
6
- local printf = function (...) fprintf (io.stdout , ... ) end
7
11
8
12
local stderr = io.stderr
9
13
10
- local trace = false
14
+ local trace = false do
11
15
12
16
trace = trace and print or function () end
13
17
18
+ end
19
+
14
20
local ACTION_NAMES = {
15
21
[curl .POLL_IN ] = " POLL_IN" ;
16
22
[curl .POLL_INOUT ] = " POLL_INOUT" ;
@@ -19,9 +25,15 @@ local ACTION_NAMES = {
19
25
[curl .POLL_REMOVE ] = " POLL_REMOVE" ;
20
26
}
21
27
28
+ local POLL_IO_FLAGS = {
29
+ [ curl .POLL_IN ] = uv .READABLE ;
30
+ [ curl .POLL_OUT ] = uv .WRITABLE ;
31
+ [ curl .POLL_INOUT ] = uv .READABLE + uv .WRITABLE ;
32
+ }
33
+
22
34
local EVENT_NAMES = {
23
- [ uv .READABLE ] = " READABLE" ;
24
- [ uv .WRITABLE ] = " WRITABLE" ;
35
+ [ uv .READABLE ] = " READABLE" ;
36
+ [ uv .WRITABLE ] = " WRITABLE" ;
25
37
[ uv .READABLE + uv .WRITABLE ] = " READABLE + WRITABLE" ;
26
38
}
27
39
@@ -31,12 +43,6 @@ local FLAGS = {
31
43
[ uv .READABLE + uv .WRITABLE ] = curl .CSELECT_IN + curl .CSELECT_OUT ;
32
44
}
33
45
34
- local POLL_IO_FLAGS = {
35
- [ curl .POLL_IN ] = uv .READABLE ;
36
- [ curl .POLL_OUT ] = uv .WRITABLE ;
37
- [ curl .POLL_INOUT ] = uv .READABLE + uv .WRITABLE ;
38
- }
39
-
40
46
local Context = ut .class () do
41
47
42
48
function Context :__init (fd )
66
72
67
73
end
68
74
69
- -- Number of parallel request
70
- local MAX_REQUESTS
75
+ local MAX_REQUESTS = 64 -- Number of parallel request
71
76
local timer , multi
72
77
local qtask = ut .Queue .new () -- wait tasks
73
78
local qfree = ut .Queue .new () -- avaliable easy handles
74
- local qeasy = {} -- all easy handles
79
+ local qeasy = {} -- all easy handles
75
80
76
81
local function on_begin (handle , url , num )
77
82
local filename = tostring (num ) .. " .download"
@@ -92,9 +97,9 @@ local function on_end(handle, err, url)
92
97
handle .data .file = nil
93
98
94
99
if err then
95
- printf ( " %s ERROR - %s\n " , url , tostring (err ));
100
+ fprintf ( stderr , " %s ERROR - %s\n " , url , tostring (err ));
96
101
else
97
- printf ( " %s DONE\n " , url );
102
+ fprintf ( stderr , " %s DONE\n " , url );
98
103
end
99
104
end
100
105
@@ -103,6 +108,13 @@ local function cleanup()
103
108
104
109
for i , easy in ipairs (qeasy ) do
105
110
multi :remove_handle (easy )
111
+ if easy .data then
112
+ local context = easy .data .context
113
+ if context then context :close () end
114
+
115
+ local file = easy .data .file
116
+ if file then on_end (easy , ' closed' , easy :getinfo_effective_url ()) end
117
+ end
106
118
easy :close ()
107
119
end
108
120
@@ -223,12 +235,12 @@ local curl_check_multi_info = function()
223
235
proceed_queue ()
224
236
end
225
237
226
- on_libuv_poll = function (handle , err , events )
227
- trace (" UV::POLL" , handle , err , EVENT_NAMES [events ] or events )
238
+ on_libuv_poll = function (poller , err , events )
239
+ trace (" UV::POLL" , poller , err , EVENT_NAMES [events ] or events )
228
240
229
241
local flags = assert (FLAGS [events ], (" unknown event:" .. events ))
230
242
231
- context = handle .data .context
243
+ local context = poller .data .context
232
244
233
245
multi :socket_action (context :fileno (), flags )
234
246
@@ -238,15 +250,13 @@ end
238
250
on_libuv_timeout = function (timer )
239
251
trace (" UV::TIMEOUT" , timer )
240
252
241
- local running_handles , err = multi :socket_action ()
253
+ multi :socket_action ()
242
254
243
255
curl_check_multi_info ()
244
256
end
245
257
246
258
end
247
259
248
- MAX_REQUESTS = 64
249
-
250
260
timer = uv .timer ()
251
261
252
262
multi = curl .multi {
0 commit comments