def test_to_bytes_and_from_bytes(self): header1 = ShadowsocksPacketHeader( port=80, addr_type=constants.SOCKS5_ADDRTYPE_HOST, addr='www.google.com') bytes1 = b'\x03\x0ewww.google.com\x00\x50' self.assertEqual(header1.to_bytes(), bytes1) header1_new = ShadowsocksPacketHeader() header1_new.from_bytes(bytes1) self.assertEqual(header1_new, header1) header2 = ShadowsocksPacketHeader( port=53, addr_type=constants.SOCKS5_ADDRTYPE_IPV4, addr='8.8.8.8') bytes2 = b'\x01\x08\x08\x08\x08\x00\x35' self.assertEqual(header2.to_bytes(), bytes2) header2_new = ShadowsocksPacketHeader() header2_new.from_bytes(bytes2) self.assertEqual(header2_new, header2) header3 = ShadowsocksPacketHeader( port=80, addr_type=constants.SOCKS5_ADDRTYPE_IPV6, addr='2404:6800:4005:805::1011') bytes3 = b'\x04$\x04h\x00@\x05\x08\x05\x00\x00\x00\x00\x00\x00\x10\x11\x00\x50' self.assertEqual(header3.to_bytes(), bytes3) header3_new = ShadowsocksPacketHeader() header3_new.from_bytes(bytes3) self.assertEqual(header3_new, header3)
def test_to_bytes_and_from_bytes(self): header1 = ShadowsocksPacketHeader(port=80, addr_type=constants.SOCKS5_ADDRTYPE_HOST, addr='www.google.com') bytes1 = b'\x03\x0ewww.google.com\x00\x50' self.assertEqual(header1.to_bytes(), bytes1) header1_new = ShadowsocksPacketHeader() header1_new.from_bytes(bytes1) self.assertEqual(header1_new, header1) header2 = ShadowsocksPacketHeader(port=53, addr_type=constants.SOCKS5_ADDRTYPE_IPV4, addr='8.8.8.8') bytes2 = b'\x01\x08\x08\x08\x08\x00\x35' self.assertEqual(header2.to_bytes(), bytes2) header2_new = ShadowsocksPacketHeader() header2_new.from_bytes(bytes2) self.assertEqual(header2_new, header2) header3 = ShadowsocksPacketHeader(port=80, addr_type=constants.SOCKS5_ADDRTYPE_IPV6, addr='2404:6800:4005:805::1011') bytes3 = b'\x04$\x04h\x00@\x05\x08\x05\x00\x00\x00\x00\x00\x00\x10\x11\x00\x50' self.assertEqual(header3.to_bytes(), bytes3) header3_new = ShadowsocksPacketHeader() header3_new.from_bytes(bytes3) self.assertEqual(header3_new, header3)
def test_client(self): # Create a pair of connected sockets lsock, rsock = socketpair() loop = asyncio.get_event_loop() _args = { constants.ARG_CIPHER_METHOD: encrypt.AES_256_CFB, constants.ARG_PASSWORD: '******' } config = Namespace(**_args) # Register the socket to wait for data connect_coro = loop.create_connection( lambda: ShadowsocksProxyServerProtocol(loop, config), sock=rsock) _, server_protocol = loop.run_until_complete(connect_coro) def data_callback(client, data): self.assertEqual(data[:4], b'HTTP') lsock.close() rsock.close() # Stop the event loop loop.stop() def conn_lost_callback(*args): pass connect_coro = loop.create_connection( lambda: ShadowsocksClientRelayProtocol(data_callback, conn_lost_callback, config), sock=lsock) _, client_protocol = loop.run_until_complete(connect_coro) header = ShadowsocksPacketHeader( addr='example.com', port=80, addr_type=constants.SOCKS5_ADDRTYPE_HOST) http_request_content = b'GET / HTTP/1.1\r\nHost: example.com\r\nUser-Agent: curl/7.43.0\r\nAccept: */*\r\n\r\n' client_protocol.send_data(header.to_bytes() + http_request_content) # Simulate the reception of data from the network # loop.call_soon(rsock.send, encoded_data) # Run the event loop loop.run_forever()
def test_client(self): # Create a pair of connected sockets lsock, rsock = socketpair() loop = asyncio.get_event_loop() _args = {constants.ARG_CIPHER_METHOD: encrypt.AES_256_CFB, constants.ARG_PASSWORD: '******'} config = Namespace(**_args) # Register the socket to wait for data connect_coro = loop.create_connection(lambda: ShadowsocksProxyServerProtocol(loop, config), sock=rsock) _, server_protocol = loop.run_until_complete(connect_coro) def data_callback(client, data): self.assertEqual(data[:4], b'HTTP') lsock.close() rsock.close() # Stop the event loop loop.stop() def conn_lost_callback(*args): pass connect_coro = loop.create_connection( lambda: ShadowsocksClientRelayProtocol(data_callback, conn_lost_callback, config), sock=lsock) _, client_protocol = loop.run_until_complete(connect_coro) header = ShadowsocksPacketHeader(addr='example.com', port=80, addr_type=constants.SOCKS5_ADDRTYPE_HOST) http_request_content = b'GET / HTTP/1.1\r\nHost: example.com\r\nUser-Agent: curl/7.43.0\r\nAccept: */*\r\n\r\n' client_protocol.send_data(header.to_bytes() + http_request_content) # Simulate the reception of data from the network # loop.call_soon(rsock.send, encoded_data) # Run the event loop loop.run_forever()