Exemplo n.º 1
0
	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 ]
Exemplo n.º 2
0
	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)