def test_mock_request_unknown_ca_error(self): connection = Connection( ('127.0.0.1', self.get_http_port()), 'localhost') @asyncio.coroutine def mock_func(): raise ssl.SSLError(1, 'Uh oh! Unknown CA!') with self.assertRaises(SSLVerificationError): yield from connection.run_network_operation(mock_func())
def test_mock_connect_ssl_error(self): connection = Connection( ('127.0.0.1', self.get_http_port()), 'localhost') @asyncio.coroutine def mock_func(): raise ssl.SSLError(123, 'Mock error') with self.assertRaises(NetworkError): yield from connection.run_network_operation(mock_func())
def test_mock_request_ssl_error(self): connection = Connection( ('127.0.0.1', self.get_http_port()), 'localhost') @asyncio.coroutine def mock_func(): if sys.version_info < (3, 3): raise socket.error(123, 'Mock error') else: raise ConnectionError(123, 'Mock error') with self.assertRaises(NetworkError): yield from connection.run_network_operation(mock_func())
def test_read_timeout(self): connection = Connection(('127.0.0.1', self.get_http_port()), timeout=0.5) yield from connection.connect() yield from connection.write(b'GET /sleep_long HTTP/1.1\r\n', drain=False) yield from connection.write(b'\r\n', drain=False) data = yield from connection.readline() self.assertEqual(b'HTTP', data[:4]) while True: data = yield from connection.readline() if not data.strip(): break with self.assertRaises(NetworkTimedOut): bytes_left = 2 while bytes_left > 0: data = yield from connection.read(bytes_left) if not data: break bytes_left -= len(data)
def test_control_stream(self): def log_cb(data_type, data): _logger.debug(__('{0}={1}', data_type, data)) connection = Connection(('127.0.0.1', self.server_port())) yield from connection.connect() control_stream = ControlStream(connection) control_stream.data_event_dispatcher.add_read_listener( functools.partial(log_cb, 'read')) control_stream.data_event_dispatcher.add_write_listener( functools.partial(log_cb, 'write')) reply = yield from control_stream.read_reply() self.assertEqual(220, reply.code) yield from control_stream.write_command(Command('USER', 'smaug')) reply = yield from control_stream.read_reply() self.assertEqual(331, reply.code) yield from control_stream.write_command(Command('PASS', 'gold1')) reply = yield from control_stream.read_reply() self.assertEqual(230, reply.code) yield from control_stream.write_command(Command('PASV')) reply = yield from control_stream.read_reply() self.assertEqual(227, reply.code) address = parse_address(reply.text) data_connection = Connection(address) yield from data_connection.connect() data_stream = DataStream(data_connection) yield from control_stream.write_command(Command('RETR', 'example (copy).txt')) reply = yield from control_stream.read_reply() self.assertEqual(150, reply.code) my_file = io.BytesIO() yield from data_stream.read_file(my_file) reply = yield from control_stream.read_reply() self.assertEqual(226, reply.code) self.assertEqual( 'The real treasure is in Smaug’s heart 💗.\n', my_file.getvalue().decode('utf-8') )
def test_start_tls(self): connection = Connection(('127.0.0.1', self.get_http_port()), timeout=1) yield from connection.connect() self.assertFalse(connection.is_ssl) ssl_connection = yield from connection.start_tls() self.assertFalse(connection.is_ssl) self.assertTrue(ssl_connection.is_ssl) yield from ssl_connection.write(b'GET / HTTP/1.1\r\n\r\n') data = yield from ssl_connection.readline() self.assertEqual(b'HTTP', data[:4])
def test_sock_reuse(self): connection1 = Connection(('127.0.0.1', self.get_http_port())) yield from connection1.connect() connection2 = Connection( ('127.0.0.1', self.get_http_port()), sock=connection1.writer.get_extra_info('socket') ) yield from connection2.connect() yield from connection2.write(b'GET / HTTP/1.1\r\n\r\n') data = yield from connection2.readline() self.assertEqual(b'HTTP', data[:4])
def test_connection(self): connection = Connection( ('127.0.0.1', self.get_http_port()), 'localhost') yield from connection.connect() yield from connection.write(b'GET / HTTP/1.0\r\n\r\n') data = yield from connection.read() self.assertEqual(b'hello world!', data[-12:]) self.assertTrue(connection.closed())
def test_control_stream(self): def log_cb(data_type, data): _logger.debug(__('{0}={1}', data_type, data)) connection = Connection(('127.0.0.1', self.server_port())) yield from connection.connect() control_stream = ControlStream(connection) control_stream.data_event_dispatcher.add_read_listener( functools.partial(log_cb, 'read')) control_stream.data_event_dispatcher.add_write_listener( functools.partial(log_cb, 'write')) reply = yield from control_stream.read_reply() self.assertEqual(220, reply.code) yield from control_stream.write_command(Command('USER', 'smaug')) reply = yield from control_stream.read_reply() self.assertEqual(331, reply.code) yield from control_stream.write_command(Command('PASS', 'gold1')) reply = yield from control_stream.read_reply() self.assertEqual(230, reply.code) yield from control_stream.write_command(Command('PASV')) reply = yield from control_stream.read_reply() self.assertEqual(227, reply.code) address = parse_address(reply.text) data_connection = Connection(address) yield from data_connection.connect() data_stream = DataStream(data_connection) yield from control_stream.write_command( Command('RETR', 'example (copy).txt')) reply = yield from control_stream.read_reply() self.assertEqual(150, reply.code) my_file = io.BytesIO() yield from data_stream.read_file(my_file) reply = yield from control_stream.read_reply() self.assertEqual(226, reply.code) self.assertEqual('The real treasure is in Smaug’s heart 💗.\n', my_file.getvalue().decode('utf-8'))
def new_stream(self, host=None, port=None, ssl=None, connection_kwargs=None, **kwargs): if connection_kwargs is None: connection_kwargs = {} if ssl is None: ssl = self.get_ssl_default() if ssl: connection = SSLConnection( (host or '127.0.0.1', port or self._port), **connection_kwargs) else: connection = Connection((host or '127.0.0.1', port or self._port), **connection_kwargs) stream = Stream(connection, **kwargs) non_local_dict = {'count': 0} def debug_handler(data_type, data): if non_local_dict['count'] < 50: _logger.debug('%s %s', data_type, data[:100]) non_local_dict['count'] += 1 if non_local_dict['count'] == 50: _logger.debug('Discarding for performance.') stream.data_event_dispatcher.add_read_listener( functools.partial(debug_handler, 'read')) stream.data_event_dispatcher.add_write_listener( functools.partial(debug_handler, 'write')) return stream
def test_connect_timeout(self): connection = Connection(('10.0.0.0', 1), connect_timeout=2) with self.assertRaises(NetworkTimedOut): yield from connection.connect()