@@ -36,10 +36,8 @@ local function wrap_setopt_flags(k, flags)
3636 end
3737end
3838
39- local function make_iterator (self , perform )
40- local curl = require " lcurl.safe"
41-
42- local buffers = {resp = {}, _ = {}} do
39+ local function new_buffers ()
40+ local buffers = {resp = {}, _ = {}}
4341
4442 function buffers :append (e , ...)
4543 local resp = assert (e :getinfo_response_code ())
@@ -62,27 +60,43 @@ local function make_iterator(self, perform)
6260 end
6361 end
6462
65- end
63+ return buffers
64+ end
6665
67- local remain = self ._easy .n
68- for h , e in pairs (self ._easy ) do
69- if h ~= ' n' then
70- e :setopt_writefunction (function (str ) buffers :append (e , " data" , str ) end )
71- e :setopt_headerfunction (function (str ) buffers :append (e , " header" , str ) end )
66+ local function make_iterator (self , perform )
67+ local curl = require " lcurl.safe"
68+
69+ local buffers = new_buffers ()
70+
71+ -- reset callbacks to all easy handles
72+ local function reset_easy (self )
73+ if not self ._easy_mark then -- that means we have some new easy handles
74+ for h , e in pairs (self ._easy ) do if h ~= ' n' then
75+ e :setopt_writefunction (function (str ) buffers :append (e , " data" , str ) end )
76+ e :setopt_headerfunction (function (str ) buffers :append (e , " header" , str ) end )
77+ end end
78+ self ._easy_mark = true
7279 end
80+ return self ._easy .n
7381 end
7482
83+ if 0 == reset_easy (self ) then return end
84+
7585 assert (perform (self ))
7686
7787 return function ()
88+ -- we can add new handle during iteration
89+ local remain = reset_easy (self )
90+
91+ -- wait next event
7892 while true do
7993 local e , t = buffers :next ()
8094 if t then return t [2 ], t [1 ], e end
8195 if remain == 0 then break end
8296
8397 self :wait ()
8498
85- local n , err = assert (perform (self ))
99+ local n = assert (perform (self ))
86100
87101 if n <= remain then
88102 while true do
@@ -95,8 +109,9 @@ local function make_iterator(self, perform)
95109 else buffers :append (e , " error" , err ) end
96110 self :remove_handle (e )
97111 end
98- remain = n
99112 end
113+
114+ remain = n
100115 end
101116 end
102117end
@@ -502,6 +517,8 @@ function Multi:add_handle(e)
502517 local ok , err = add_handle (self , h )
503518 if not ok then return nil , err end
504519 self ._easy [h ], self ._easy .n = e , self ._easy .n + 1
520+ self ._easy_mark = nil
521+
505522 return self
506523end
507524
0 commit comments