class Worker(object): def __init__(self): pass def process(self, data, epoll_fd, fd): res = "" add_head = "" code = 200 request = None try: request = HTTPRequest(data["readdata"]) except Exception, e: res = "http format error: " + e.message code = 400 headers = {} try: headers["Connection"] = "keep-alive" controller = vars.controller_dic.get(request.controller) controller = getattr(controller, request.controller) method = getattr(controller, request.action) res, new_headers = method(request) headers.update(new_headers) except Exception, e: print e, vars.backtrace() vars.logger.error(str(e) + vars.backtrace()) res = "page not found" code = 404
def clear_fd(fd): try: _param = params[fd] epoll_fd.unregister(fd) _param["connection"].close() except Exception, e: print e, vars.backtrace() pass
def processer(self, args, kwargs): try: param = args[0] epoll_fd = args[1] fd = args[2] self.worker.process(param, epoll_fd, fd) except: print "job error:" + backtrace()
def poll_connects(self, listen_fd): try: epoll_fd = select.epoll() epoll_fd.register( listen_fd.fileno(), select.EPOLLIN | select.EPOLLET | select.EPOLLERR | select.EPOLLHUP) except select.error, e: print e, vars.backtrace() vars.logger.error(e)
def run(self): while True: try: args, kwargs = self.share_object.get() self.processer(args, kwargs) except Queue.Empty: continue except: print "thread error:" + backtrace()
while True: try: sendlen += cur_sock.send(writedata[sendlen:]) if sendlen == total_write_len: if param.get("keepalive", True): param["readdata"] = "" param["writedata"] = "" param["writelen"] = 0 epoll_fd.modify( fd, select.EPOLLET | select.EPOLLIN | select.EPOLLERR | select.EPOLLHUP) else: clear_fd(fd) break except socket.error, e: print e, vars.backtrace() if e.errno == errno.EAGAIN: param["writelen"] = sendlen break clear_fd(fd) else: continue # check time out if cur_time - last_min_time > vars.timeout_total: last_min_time = cur_time objs = params.items() for (key_fd, value) in objs: fd_time = value.get("time", 0) del_time = cur_time - fd_time if del_time > vars.timeout_total: clear_fd(key_fd)
code = 400 headers = {} try: headers["Connection"] = "keep-alive" controller = vars.controller_dic.get(request.controller) controller = getattr(controller, request.controller) method = getattr(controller, request.action) res, new_headers = method(request) headers.update(new_headers) except Exception, e: print e, vars.backtrace() vars.logger.error(str(e) + vars.backtrace()) res = "page not found" code = 404 try: if headers.get("Connection", "") != "close": data["keepalive"] = True res_len = len(res) headers["Content-Length"] = res_len for key in headers: add_head += "%s: %s\r\n" % (key, headers[key]) data["writedata"] = "HTTP/1.1 %s %s\r\n%s\r\n%s" % (code, res, add_head, res) data["readdata"] = "" epoll_fd.modify( fd, select.EPOLLET | select.EPOLLOUT | select.EPOLLERR | select.EPOLLHUP) except Exception, e: print str(e) + vars.backtrace()