def work(self, task): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: pro_, rest = splittype(task[0]) host, rest = splithost(rest) host, port = splitport(host) task.append(rest) task.append(host) sock.setblocking(0) sock.connect_ex((host, int(port) if port else 80)) def timeout_cb(): if not sock._closed: KBEngine.deregisterWriteFileDescriptor(sock.fileno()) sock.close() if task and task[2]: task[2](None) self._write_timer[sock.fileno()] = self.add_timer( REQUEST_TIMEOUT, timeout_cb) KBEngine.registerWriteFileDescriptor( sock.fileno(), Functor(self.onSend, task, sock)) except: self._tasks.append(task) self.logsError() if not sock._closed: sock.close()
def write_response(self, response): self._write_buffer = response.output() self.send_body_size = len(self._write_buffer) self._write_to_fd(False, self._fd) if self._check_send_finish(): self.write_completed() else: # 一次没有发完,注册fd,交给epoll DEBUG_MSG("Connection::register write fd: %s" % self._fd) KBEngine.registerWriteFileDescriptor( self._fd, Functor(self._write_to_fd, True))
def steps(self): if not self._sock and len(self._reqs) > 0: try: self._reqs_curt = self._reqs.pop() self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._sock_send = False proto, rest = urllib.parse.splittype(self._reqs_curt[0]) host, rest = urllib.parse.splithost(rest) host, port = urllib.parse.splitport(host) self._reqs_curt.append(rest) self._reqs_curt.append(host) self._sock.setblocking(0) self._sock.connect_ex((host, int(port) if port else 80)) self._write_dt = self.addTimer(10, 60, TIME_TYPE_TIME_OUT) KBEngine.registerWriteFileDescriptor(self._sock.fileno(), self.onSend) except: self._reqs.append(self._reqs_curt) self.logsError() self.cleanSocketStatus()
def registerWrite(self): if self._registerWrite == False: KBEngine.registerWriteFileDescriptor(self._socket.fileno(), self.onWrite) self._registerWrite = True