Esempio n. 1
0
async def test_https_tunnel_server_auto_close():
    port1 = get_random_port()
    listen_url = "http://127.0.0.1:%d" % port1
    server1 = https.HTTPSTunnelServer(listen_url, ["tcp://"])
    server1.start()

    server2 = DemoTCPServer()
    port2 = get_random_port()
    server2.listen(port2)

    s = socket.socket()
    tun = tunnel.TCPTunnel(s, address=("127.0.0.1", port1))
    await tun.connect()

    await tun.write(b"CONNECT 127.0.0.1:%d HTTP/1.1\r\n\r\n" % port2)
    response = await tun.read()
    assert response.endswith(b"\r\n\r\n")
    first_line = response.splitlines()[0]
    items = first_line.split()
    assert int(items[1]) == 200

    server2.kick_client()
    await asyncio.sleep(1)
    assert server2.stream == None
    assert tun.closed() == True
Esempio n. 2
0
async def test_k8s_tunnel():
    res_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "res")
    port1 = get_random_port()
    start_mock_k8s_websocket_server(port1)

    port2 = get_random_port()
    server = DemoTCPServer()
    server.listen(port2)

    url_list = [
        "k8s://localhost:%d/bin/telnet?pod=pod-1&client_cert=%s&client_key=%s&ca_cert=%s"
        % (
            port1,
            os.path.join(res_dir, "client.crt"),
            os.path.join(res_dir, "client.key"),
            os.path.join(res_dir, "ca.crt"),
        ),
        "k8s://localhost:%d/bin/telnet?pod=pod-1&kubeconfig=%s" %
        (port1, os.path.join(res_dir, "kubeconfig")),
    ]

    for url in url_list:
        s = socket.socket()
        tun = tunnel.TCPTunnel(s, address=("127.0.0.1", port1))
        await tun.connect()

        tun = k8s.KubernetesTunnel(tun, utils.Url(url), ("127.0.0.1", port2))
        await tun.connect()
        await tun.write(b"Hello python\n")
        assert await tun.read() == b"Hello python\n"
        tun.close()
Esempio n. 3
0
async def test_websocket_tunnel_server():
    port1 = get_random_port()
    listen_url = "ws://127.0.0.1:%d/{addr}/{port}" % port1
    server1 = websocket.WebSocketTunnelServer(listen_url, ["tcp://"])
    server1.start()

    server2 = DemoTCPServer()
    port2 = get_random_port()
    server2.listen(port2)

    s = socket.socket()
    tun = tunnel.TCPTunnel(s, address=("127.0.0.1", port1))
    await tun.connect()

    ws_tun = websocket.WebSocketTunnel(tun, utils.Url(listen_url),
                                       ("127.0.0.1", port2))
    await ws_tun.connect()

    await ws_tun.write(b"Hello python\n")
    assert await ws_tun.read() == b"Hello python\n"

    assert server2.stream.closed() == False
    ws_tun.close()
    await asyncio.sleep(1)

    assert server2.stream.closed() == True
Esempio n. 4
0
 async def async_task():
     s = socket.socket()
     tun = tunnel.TCPTunnel(s, address=("127.0.0.1", port1))
     await tun.connect()
     domain = "domainnotexist.com"
     await tun.write(("GET http://%s/ HTTP/1.1\r\nHost: %s\r\n\r\n" %
                      (domain, domain)).encode())
     rsp = await tun.read()
     print(rsp)
Esempio n. 5
0
async def test_fork_tunnel():
    server = DemoTCPServer()
    port = get_random_port()
    server.listen(port)
    s = socket.socket()
    tunn = tunnel.TCPTunnel(s, address=("127.0.0.1", port))
    fork_tunn = await tunn.fork()
    data = b"Hello world\n"
    await fork_tunn.write(data)
    buffer = await fork_tunn.read()
    assert buffer == data
    server.stop()
Esempio n. 6
0
async def test_ssl_tunnel():
    current_dir = os.path.dirname(os.path.abspath(__file__))
    ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    ssl_ctx.load_cert_chain(
        os.path.join(current_dir, "test.crt"), os.path.join(current_dir, "test.key")
    )
    server = DemoTCPServer(ssl_options=ssl_ctx)
    port = get_random_port()
    server.listen(port)
    s = socket.socket()
    tunn = tunnel.TCPTunnel(s, address=("127.0.0.1", port))
    await tunn.connect()
    tunn = tunnel.SSLTunnel(tunn, utils.Url("ssl://127.0.0.1/?verify_ssl=false"))
    await tunn.connect()
    data = b"Hello world\n"
    await tunn.write(data)
    buffer = await tunn.read()
    assert buffer == data
    server.stop()
Esempio n. 7
0
    async def test_fork_tunnel(self):
        await self.ensure_start_server()
        server1 = DemoTCPServer()
        port1 = get_random_port()
        server1.listen(port1)

        s = socket.socket()
        tunn = tunnel.TCPTunnel(s, address=("127.0.0.1", self.port))
        await tunn.connect()
        url = "ssh://%[email protected]:%d/?private_key=id_rsa" % (self.username,
                                                             self.port)
        ssh_tunn = ssh.SSHTunnel(tunn,
                                 utils.Url(url),
                                 address=("127.0.0.1", port1))
        fork_ssh_tunn = await ssh_tunn.fork()
        message = b"Hello ssh!"
        await fork_ssh_tunn.write(message + b"\n")
        buffer = await fork_ssh_tunn.read()
        assert buffer.strip() == message
Esempio n. 8
0
async def test_http_proxy():
    port1 = get_random_port()
    listen_url = "http://127.0.0.1:%d" % port1
    server1 = https.HTTPSTunnelServer(listen_url, ["tcp://"])
    server1.start()

    port2 = get_random_port()
    start_demo_http_server(port2)

    s = socket.socket()
    tun = tunnel.TCPTunnel(s, address=("127.0.0.1", port1))
    await tun.connect()

    await tun.write(
        b"GET http://127.0.0.1:%d/ HTTP/1.1\r\nHost: 127.0.0.1:%d\r\n\r\n" %
        (port2, port1))
    rsp = await tun.read()
    pos = rsp.find(b"\r\n\r\n")
    assert pos > 0
    rsp = rsp[pos + 4:]
    assert rsp == b"b\r\nHello HTTP!\r\n0\r\n\r\n"
Esempio n. 9
0
async def test_http_proxy_with_unknown_domain():
    port1 = get_random_port()
    listen_url = "http://127.0.0.1:%d" % port1
    server1 = https.HTTPSTunnelServer(listen_url, ["tcp://"])
    server1.start()

    port2 = get_random_port()
    start_demo_http_server(port2)

    async def async_task():
        s = socket.socket()
        tun = tunnel.TCPTunnel(s, address=("127.0.0.1", port1))
        await tun.connect()
        domain = "domainnotexist.com"
        await tun.write(("GET http://%s/ HTTP/1.1\r\nHost: %s\r\n\r\n" %
                         (domain, domain)).encode())
        rsp = await tun.read()
        print(rsp)

    utils.safe_ensure_future(async_task())

    time0 = time.time()
    await asyncio.sleep(1)

    s = socket.socket()
    tun = tunnel.TCPTunnel(s, address=("127.0.0.1", port1))
    await tun.connect()

    await tun.write(
        b"GET http://127.0.0.1:%d/ HTTP/1.1\r\nHost: 127.0.0.1:%d\r\n\r\n" %
        (port2, port1))
    rsp = await tun.read()
    time1 = time.time()
    pos = rsp.find(b"\r\n\r\n")
    assert pos > 0
    rsp = rsp[pos + 4:]
    assert rsp == b"b\r\nHello HTTP!\r\n0\r\n\r\n"
    assert time1 - time0 < 2