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
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()
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
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)
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()
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()
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
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"
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