def selectsvr_send(self, sendpack): head = nshead.NsHead() #mcpack_body = mcpack.dumps(packData, charset='gb18030') mcpack_body = mcpack.dumps(sendpack) head.body_len = len(mcpack_body) request = head.pack() + mcpack_body if not self.writer.Write(request): print " get cluster writer fail lang %d type %d url %s" % (sendpack['language'], sendpack['type'], sendpack['url']) return False return True
def handle(self, conn): sock, addr = conn timer = ub_timer() # recv timer.settask("rev") sock.settimeout(self.server.rdtmout) head = self.__recv(sock, self.nshead.size) if len(head) == 0: raise socket.error("connection reset by peer") self.nshead.frombin(head) log.setlogid(self.nshead.log_id) log.setreqip("%s", addr[0]) #print 'ready to receive body' body = self.__recv(sock, self.nshead.body_len) if len(body) != self.nshead.body_len: raise socket.error("read body failed") req = mcpack.loads(body) # callback timer.settask("proc") if self.nshead.provider != "__MONITOR__": #print 'ready to callback' #print 'req: %s' % str(req) resp = self.server.callback(req) #print 'response: %s' % str(resp) rpack = mcpack.dumps(resp) rhead = self.nshead rhead.provider = self.server.name rhead.body_len = len(rpack) rbuf = rhead.tobin() + rpack else: #print 'enter in !!!!' log.trace("receive a monitor request with nshead provider '__MONITOR__'."); rhead = self.nshead rhead.provider = self.server.name rhead.body_len = 0 rbuf = rhead.tobin() # send timer.settask("write") sock.settimeout(self.server.wrtmout) sock.sendall(rbuf) timer.endtask() log.setproctime("total:%u(ms) rev:%u+proc:%u+write:%u", timer.gettotal(), timer.gettask("rev"), timer.gettask("proc"), timer.gettask("write")) log.notice("")
def handle(req_type, text): #ret infomation ret = 0 resp_code = 0 resp_content = "xxx" #video_class server ip = "127.0.0.1" port = 9875 server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: #1.build request pack ##@content body = { 'request_type': mcpack.INT32(req_type), 'text': mcpack.STR(text) } mcpack_body = mcpack.dumps(body) ##@head head = nshead.NsHead() head.body_len = len(mcpack_body) #2. connect to server #server_sock.create_connection((ip, port)) server_sock.connect((ip, port)) server_sock.settimeout(60) #3. send request request = head.pack() + mcpack_body server_sock.sendall(request) #4. recv response res_nshead = nshead.NsHead.from_str(server_sock.recv(36)) if res_nshead is False: return -3, -1, "text is invalid" recved = 0 body = '' while recved < res_nshead.body_len: temp = server_sock.recv(1024) recved += len(temp) body = body + temp res_body = mcpack.loads(body) #parse response resp_code = res_body['response_code'] resp_content = res_body['tags'] except Exception as ex: ret = -1 resp_code = -1 resp_content = "maybe error in param!" logging.error(traceback.format_exc()) finally: #5. disconnect with server server_sock.close() return ret, resp_code, resp_content
def thread_work(): head = nshead() pack = mcpack.dumps({"cmd":"test"}) for i in range(COUNT): head.log_id = 1234560000 + i head.body_len = len(pack) resp = cli.invite(head, pack) if not resp: log.warning("ub_client invite error") time.sleep(1) (h, body) = resp print mcpack.loads(body)
def send(self, cmd_id, keys): """ description: send cmd """ try: if self.is_connected == False: self.connect() head = nshead.NsHead() head.id = cmd_id # TODO parse keys body = keys mcpack_body = mcpack.dumps(body) head.body_len = len(mcpack_body) if self.verbose_mode == True: print "Send:" print head print body request = head.pack() + mcpack_body self.sock.send(request) except: print traceback.format_exc() sys.exit(2)
def deal_mcgi(listen, response_type): if response_type == 'normal': req_body = "Hello, Nginx, just do it" req_nshead = nshead.NsHead() header = [ mcpack.STR('Cache-Control : max-age=60'), mcpack.STR('Connection : close'), mcpack.STR('Content-Type : text/html; charset=UTF-8'), mcpack.STR('Server : nginx/1.4.4'), mcpack.STR('Status : 200'), mcpack.STR('Version : HTTP/1.1'), mcpack.STR('X-Powered-By : HPHP'), ] ppack = { 'Status': mcpack.STR('200'), 'Headers': mcpack.ARR(header), 'Content-Length': mcpack.STR(len(req_body)), } res_mcpack = mcpack.dumps(ppack) req_nshead.body_len = len(res_mcpack) + len(req_body) response = req_nshead.pack() + res_mcpack + req_body elif response_type == '4xx': req_nshead = nshead.NsHead() header = [ mcpack.STR('Cache-Control : max-age=60'), mcpack.STR('Connection : close'), mcpack.STR('Content-Type : text/html; charset=UTF-8'), mcpack.STR('Server : nginx/1.4.4'), mcpack.STR('Status : 404'), mcpack.STR('Version : HTTP/1.1'), mcpack.STR('X-Powered-By : HPHP'), ] ppack = { 'Status': mcpack.STR('404'), 'Headers': mcpack.ARR(header), 'Content-Length': mcpack.STR('0'), } res_mcpack = mcpack.dumps(ppack) req_nshead.body_len = len(res_mcpack) response = req_nshead.pack() + res_mcpack elif response_type == '5xx': req_nshead = nshead.NsHead() header = [ mcpack.STR('Cache-Control : max-age=60'), mcpack.STR('Connection : close'), mcpack.STR('Content-Type : text/html; charset=UTF-8'), mcpack.STR('Server : nginx/1.4.4'), mcpack.STR('Status : 503'), mcpack.STR('Version : HTTP/1.1'), mcpack.STR('X-Powered-By : HPHP'), ] ppack = { 'Status': mcpack.STR('503'), 'Headers': mcpack.ARR(header), 'Content-Length': mcpack.STR('0'), } res_mcpack = mcpack.dumps(ppack) req_nshead.body_len = len(res_mcpack) response = req_nshead.pack() + res_mcpack elif response_type == 'retry': req_nshead = nshead.NsHead() header = [ mcpack.STR('Cache-Control : max-age=60'), mcpack.STR('Connection : close'), mcpack.STR('Content-Type : text/html; charset=UTF-8'), mcpack.STR('Server : nginx/1.4.4'), mcpack.STR('Status : 503'), mcpack.STR('X-MCGI-ONERROR : RETRY'), mcpack.STR('Version : HTTP/1.1'), mcpack.STR('X-Powered-By : HPHP'), ] ppack = { 'Status': mcpack.STR('503'), 'Headers': mcpack.ARR(header), 'Content-Length': mcpack.STR('0'), } res_mcpack = mcpack.dumps(ppack) req_nshead.body_len = len(res_mcpack) response = req_nshead.pack() + res_mcpack elif response_type == '302': req_nshead = nshead.NsHead() header = [ mcpack.STR('Cache-Control : max-age=60'), mcpack.STR('Connection : close'), mcpack.STR('Content-Type : text/html; charset=UTF-8'), mcpack.STR('Server : nginx/1.4.4'), mcpack.STR('Status : 302'), mcpack.STR('Location : http://www.baidu.com'), mcpack.STR('Version : HTTP/1.1'), mcpack.STR('X-Powered-By : HPHP'), ] ppack = { 'Status': mcpack.STR('302'), 'Headers': mcpack.ARR(header), 'Content-Length': mcpack.STR('0'), } res_mcpack = mcpack.dumps(ppack) req_nshead.body_len = len(res_mcpack) response = req_nshead.pack() + res_mcpack else: print 'response type not support' usage() serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listen = int(listen) serverSocket.bind(('0.0.0.0', listen)) serverSocket.listen(200) serverSocket.setblocking(0) epoll = select.epoll() epoll.register(serverSocket.fileno(), select.EPOLLIN) try: connections = {} responses = {} arrivedTimes = {} while True: events = epoll.poll(1) for fileno, event in events: if fileno == serverSocket.fileno(): try: connection, address = serverSocket.accept() connection.setblocking(0) epoll.register(connection.fileno(), select.EPOLLIN) connections[connection.fileno()] = connection responses[connection.fileno()] = response except: print "epoll accept error" elif event & select.EPOLLIN: try: res_nshead = nshead.NsHead.from_str( connection.recv(36)) received = 0 body = '' while received < res_nshead.body_len: tmp = connection.recv(1024) received += len(tmp) body = body + tmp res_mcpack = mcpack.loads(body) ext_data = '' if 'HTTP_CONTENT_LENGTH' in res_mcpack and res_mcpack[ 'HTTP_CONTENT_LENGTH'] != 0: ext_data = body[res_nshead.body_len - res_mcpack['data_len']:] print "nshead:" print res_nshead print "" print "mcpack:" for (k, v) in res_mcpack.items(): print " " + k + " : " + v if ext_data != '': print "ext_data : " + ext_data arrivedtime = int(time.time() * 1000) arrivedTimes[fileno] = arrivedtime epoll.modify(fileno, select.EPOLLOUT) except: print traceback.format_exc() print "epoll read error" elif event & select.EPOLLOUT: try: currenttime = int(time.time() * 1000) if (currenttime - arrivedTimes[fileno] > 50): byteswritten = connections[fileno].send( responses[fileno]) responses[fileno] = responses[fileno][ byteswritten:] if len(responses[fileno]) == 0: epoll.modify(fileno, 0) connections[fileno].shutdown(socket.SHUT_WR) except: print traceback.format_exc() print "epoll write error" elif event & select.EPOLLHUP: try: epoll.unregister(fileno) connections[fileno].close() del connections[fileno] except: print traceback.format_exc() print "epoll close error" finally: print 'error' epoll.unregister(serverSocket.fileno()) epoll.close() serverSocket.close()