def test_parse_addr_ipv6_custom_port_multiple(self): res = tuple(parse_addrs('[::1]:8888,[::2]:9999,[::3]', 8888)) self.assertEqual(res, ({ 'host': '::1', 'port': 8888 }, { 'host': '::2', 'port': 9999 }, { 'host': '::3', 'port': 8888 }))
def test_parse_addr_ipv6_def_port_multiple(self): res = tuple(parse_addrs('[::1],[::2]', 8888)) self.assertEqual(res, ( { 'host': '::1', 'port': 8888 }, { 'host': '::2', 'port': 8888 }, ))
def __init__(self, callback, conf_root, listen_ipv4=None, listen_ipv6=None, default_port=None, listen_ipv4_ssl=None, listen_ipv6_ssl=None, default_port_ssl=None, pemfile=None, cacert=None): '''Initializes the server and listens on the specified addresses. param callback : callable The callable that is called as callabale(msg, addr) whenever a message is received. param conf_root : unicode Path to the root of the configuration tree param listen_ipv4 : comma separated basestring of addresses Addresses to listen on for TCP and UDP connections param listen_ipv6 : comma separated basestring of addresses Addresses to listen on for TCP and UDP connections param default_port : short Port to use for listen_ipv4 and listen_ipv6 if they don't specify a custom port param listen_ipv4_ssl : comma separated basestring of addresses Addresses to listen on for SSL/TLS connections param listen_ipv6_ssl : comma separated basestring of addresses Addresses to listen on for SSL/TLS connections param default_port_ssl : short Port to use for listen_ipv4_ssl and listen_ipv6_ssl if they don't specify a custom port param pemfile : unicode File path to the pem file containing private and public keys for SSL/TLS param cacert : unicode File path to the cacert file with which the public key in pemfile is signed ''' self.log = logging.getLogger('server') # internal logger self.callback = callback self.closed = False self.stream_socks = set() self.ssl_socks = set() self.dgram_socks = set() self.client_stream_socks = set() self.stream_buffers = {} self.client_socket_addrs = {} self.select_timeout = None # Set on shutdown to prevent infinite wait self.pemfile = normalize_path( pemfile if pemfile is not None else options.server.pemfile, conf_root) self.cacert = normalize_path( cacert if cacert is not None else options.server.cacert, conf_root) # Initialize server sockets listen_ipv4 = listen_ipv4 if listen_ipv4 is not None else options.server.listen_ipv4 listen_ipv6 = listen_ipv6 if listen_ipv6 is not None else options.server.listen_ipv6 default_port = default_port if default_port is not None else options.server.default_port ipv4_addrs = parse_addrs(listen_ipv4, default_port) ipv6_addrs = parse_addrs(listen_ipv6, default_port) for addr in ipv4_addrs: self.stream_socks.add( self.connect(addr, socket.AF_INET, socket.SOCK_STREAM)) self.dgram_socks.add( self.connect(addr, socket.AF_INET, socket.SOCK_DGRAM)) for addr in ipv6_addrs: self.stream_socks.add( self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM)) self.dgram_socks.add( self.connect(addr, socket.AF_INET6, socket.SOCK_DGRAM)) # Same thing for SSL addresses, except not datagram sockets listen_ipv4_ssl = listen_ipv4_ssl if listen_ipv4_ssl is not None else options.server.listen_ipv4_ssl listen_ipv6_ssl = listen_ipv6_ssl if listen_ipv6_ssl is not None else options.server.listen_ipv6_ssl default_port_ssl = default_port_ssl if default_port_ssl is not None else options.server.default_port_ssl self.validate_ssl_config(listen_ipv4_ssl, listen_ipv6_ssl) ipv4_addrs_ssl = parse_addrs(listen_ipv4_ssl, default_port_ssl) ipv6_addrs_ssl = parse_addrs(listen_ipv6_ssl, default_port_ssl) for addr in ipv4_addrs_ssl: s = self.connect(addr, socket.AF_INET, socket.SOCK_STREAM, True) self.stream_socks.add(s) self.ssl_socks.add(s) for addr in ipv6_addrs_ssl: s = self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM, True) self.stream_socks.add(s) self.ssl_socks.add(s) self.all_socks = set(self.stream_socks | self.dgram_socks)
def test_parse_addr_ipv4_def_port(self): res = tuple(parse_addrs('127.0.0.1', 8888)) self.assertEqual(res, ({'host': '127.0.0.1', 'port': 8888},))
def test_parse_addr_ipv6_custom_port_multiple(self): res = tuple(parse_addrs('[::1]:8888,[::2]:9999,[::3]', 8888)) self.assertEqual(res, ({'host': '::1', 'port': 8888}, {'host': '::2', 'port': 9999}, {'host': '::3', 'port': 8888}))
def test_parse_addr_ipv6_def_port_multiple(self): res = tuple(parse_addrs('[::1],[::2]', 8888)) self.assertEqual(res, ({'host': '::1', 'port': 8888}, {'host': '::2', 'port': 8888},))
def test_parse_addr_ipv6_custom_port(self): res = tuple(parse_addrs('[::1]:8888', 8888)) self.assertEqual(res, ({'host': '::1', 'port': 8888},))
def test_parse_addr_ipv4_custom_port(self): res = tuple(parse_addrs('127.0.0.1:8888', 8888)) self.assertEqual(res, ({'host': '127.0.0.1', 'port': 8888}, ))
def test_parse_addr_ipv6_custom_port(self): res = tuple(parse_addrs('[::1]:8888', 8888)) self.assertEqual(res, ({'host': '::1', 'port': 8888}, ))
def __init__(self, callback, conf_root, listen_ipv4=None, listen_ipv6=None, default_port=None, listen_ipv4_ssl=None, listen_ipv6_ssl=None, default_port_ssl=None, pemfile=None, cacert=None): '''Initializes the server and listens on the specified addresses. param callback : callable The callable that is called as callabale(msg, addr) whenever a message is received. param conf_root : unicode Path to the root of the configuration tree param listen_ipv4 : comma separated basestring of addresses Addresses to listen on for TCP and UDP connections param listen_ipv6 : comma separated basestring of addresses Addresses to listen on for TCP and UDP connections param default_port : short Port to use for listen_ipv4 and listen_ipv6 if they don't specify a custom port param listen_ipv4_ssl : comma separated basestring of addresses Addresses to listen on for SSL/TLS connections param listen_ipv6_ssl : comma separated basestring of addresses Addresses to listen on for SSL/TLS connections param default_port_ssl : short Port to use for listen_ipv4_ssl and listen_ipv6_ssl if they don't specify a custom port param pemfile : unicode File path to the pem file containing private and public keys for SSL/TLS param cacert : unicode File path to the cacert file with which the public key in pemfile is signed ''' self.log = logging.getLogger('server') # internal logger self.callback = callback self.closed = False self.stream_socks = set() self.ssl_socks = set() self.dgram_socks = set() self.client_stream_socks = set() self.stream_buffers = {} self.client_socket_addrs = {} self.select_timeout = None # Set on shutdown to prevent infinite wait self.pemfile = normalize_path(pemfile if pemfile is not None else options.server.pemfile, conf_root) self.cacert = normalize_path(cacert if cacert is not None else options.server.cacert, conf_root) # Initialize server sockets listen_ipv4 = listen_ipv4 if listen_ipv4 is not None else options.server.listen_ipv4 listen_ipv6 = listen_ipv6 if listen_ipv6 is not None else options.server.listen_ipv6 default_port = default_port if default_port is not None else options.server.default_port ipv4_addrs = parse_addrs(listen_ipv4, default_port) ipv6_addrs = parse_addrs(listen_ipv6, default_port) for addr in ipv4_addrs: self.stream_socks.add(self.connect(addr, socket.AF_INET, socket.SOCK_STREAM)) self.dgram_socks.add(self.connect(addr, socket.AF_INET, socket.SOCK_DGRAM)) for addr in ipv6_addrs: self.stream_socks.add(self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM)) self.dgram_socks.add(self.connect(addr, socket.AF_INET6, socket.SOCK_DGRAM)) # Same thing for SSL addresses, except not datagram sockets listen_ipv4_ssl = listen_ipv4_ssl if listen_ipv4_ssl is not None else options.server.listen_ipv4_ssl listen_ipv6_ssl = listen_ipv6_ssl if listen_ipv6_ssl is not None else options.server.listen_ipv6_ssl default_port_ssl = default_port_ssl if default_port_ssl is not None else options.server.default_port_ssl self.validate_ssl_config(listen_ipv4_ssl, listen_ipv6_ssl) ipv4_addrs_ssl = parse_addrs(listen_ipv4_ssl, default_port_ssl) ipv6_addrs_ssl = parse_addrs(listen_ipv6_ssl, default_port_ssl) for addr in ipv4_addrs_ssl: s = self.connect(addr, socket.AF_INET, socket.SOCK_STREAM, True) self.stream_socks.add(s) self.ssl_socks.add(s) for addr in ipv6_addrs_ssl: s = self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM, True) self.stream_socks.add(s) self.ssl_socks.add(s) self.all_socks = set(self.stream_socks | self.dgram_socks)