def handle_request_from_client(self, conn, remote_addr, data, err): if err.errcode != connection.E_OK or not data: return sess = self.handler.new_session() sess.client_addr = remote_addr sess.send_ts = time.time() sess.req_data = data is_continue, resp = self.handler.on_client_request(sess) if resp: self.send_response(sess.client_addr, resp) return if not is_continue: self.logger.error("[sid=%d] invalid request from client", sess.sid) return for addr in self.upstreams: remote_addr = addr[1], addr[2] if addr.protocol == 'udp': conn = connection.UDPConnection(io_engine=self.io_engine) conn.asend(remote_addr, sess.req_data, self.handle_udp_request) elif addr.protocol == 'tcp': conn = connection.TCPConnection(io_engine=self.io_engine) conn.aconnect(remote_addr, self.handle_tcp_connected) else: self.logger.error("[sid=%d] invalid protocol %s", sess.sid, addr.protocol) continue if conn: self.sessions[conn] = sess
def test_arecv_zero(): server = socketserver.TCPServer( ("127.0.0.1", random.randint(20000, 30000)), TcpEchoHandler) server_addr = server.server_address pcs = Process(target=server.serve_forever) pcs.start() io_engine = ioloop.get_ioloop("select") client = connection.TCPConnection(io_engine=io_engine) def on_recved(_, data, err): client.close() client.stop() assert not data def on_sent(conn, err): assert err.errcode == connection.E_OK os.kill(pcs.pid, signal.SIGTERM) conn.arecv(2048, on_recved) pcs.join() def on_connected(conn, err): assert err.errcode == connection.E_OK conn.asend(b'x' * 2048, on_sent) time.sleep(1) client.aconnect(server_addr, on_connected) client.run()
def test_tcp_bind(my_tcp_server): server_addr = my_tcp_server time.sleep(1) io_engine = ioloop.get_ioloop("select") server = connection.TCPConnection(io_engine=io_engine) with pytest.raises(connection.BindException): server.bind(server_addr)
def test_aconnect_fail(): server_addr = ("127.0.0.1234", 2) io_engine = ioloop.get_ioloop("select") client = connection.TCPConnection(io_engine=io_engine) def on_connected(_, err): client.stop() assert err.errcode == connection.E_FAIL client.aconnect(server_addr, on_connected) client.run()
def test_tcp_client(tcp_server_process): server_addr = tcp_server_process io_engine = ioloop.get_ioloop("select") client = connection.TCPConnection(io_engine=io_engine) def on_recved(_, data, err): client.close() client.stop() assert data == b'x' * 2048 assert err.errcode == connection.E_OK def on_sent(conn, err): assert err.errcode == connection.E_OK conn.arecv(2048, on_recved) def on_connected(conn, err): assert err.errcode == connection.E_OK conn.asend(b'x' * 2048, on_sent) client.aconnect(server_addr, on_connected) client.run()
def start_tcp_server(): io_engine = ioloop.get_ioloop("select") server = connection.TCPConnection(io_engine=io_engine) server.bind(("127.0.0.1", random.randint(20000, 30000))) def on_sent(_, err): server.close() server.stop() assert err.errcode == connection.E_OK def on_recved(conn, data, err): assert err.errcode == connection.E_OK conn.asend(data, on_sent) def on_connected(newconn, err): assert err.errcode == connection.E_OK newconn.arecv(2000, on_recved) server.accept(on_connected) pcs = Process(target=server.run) pcs.start() return (server.bind_addr, pcs)