예제 #1
0
 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
예제 #2
0
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()
예제 #3
0
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)
예제 #4
0
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()
예제 #5
0
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()
예제 #6
0
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)