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)
Example #2
0
    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)
Example #3
0
    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()
Example #4
0
    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()