def wait(self): ret = pycurl.E_CALL_MULTI_PERFORM while ret == pycurl.E_CALL_MULTI_PERFORM: ret, num_handles = self.m.perform() end_time = time.time() + self.timeout queued = self.num_requests while num_handles or queued: timeout = end_time - time.time() if timeout <= 0: break ret = self.m.select(timeout) if ret == -1: break ret = pycurl.E_CALL_MULTI_PERFORM while ret == pycurl.E_CALL_MULTI_PERFORM: ret, num_handles = self.m.perform() queued, succ_list, fail_list = self.m.info_read() for c in succ_list: self.process_response(True, self.callback, c.fp.getvalue(), c.callback_arg) self.s_iter += 1 self.m.remove_handle(c) c.fp.close() c.fp = None c.callback_arg = None self.handles.remove(c) ConnPool.put(c) for e in fail_list: self.process_response(False, self.callback, e[2], e[0].callback_arg) self.e_iter += 1 self.m.remove_handle(e[0]) e[0].fp.close() e[0].fp = None e[0].callback_arg = None self.handles.remove(e[0]) ConnPool.put(e[0]) for c in self.handles: self.process_response(False, self.callback, "Timeout", c.callback_arg) self.e_iter += 1 self.m.remove_handle(c) c.fp.close() c.fp = None c.callback_arg = None ConnPool.put(c) self.handles = [ ] if (self.s_iter + self.e_iter) != self.num_requests: Util.err_log("Mismatch in the number of requests queued and result received in CurlReq") Util.err_log("num_requests: %d success: %d error: %d\n" % (self.num_requests, self.s_iter, self.e_iter)) ConnPool.put_multi(self.m) self.m = None return [ self.api_data, self.api_error ]
def process_response(self, success, callback, data, args): if success: retval = Util.decode_post(data) if not retval: Util.err_log("Unable to decode response: args=%s data=%s" % (str(args), data)) self.api_error[ args[0] ] = ApiError.badData("Unable to parse data") return if not Util.status_success(retval): self.api_error[ args[0] ] = ApiError.internalApiError(retval[ Constants.STATUS ]) else: self.api_data[ args[0] ] = retval[ Constants.RESULT ] if callback: callback(args, retval[ Constants.RESULT ]) else: self.api_error[ args[0] ] = ApiError.connectionError(data)