@ -209,6 +209,95 @@ class MatrixFederationAgentTests(TestCase):
self . reactor . pump ( ( 0.1 , ) )
self . successResultOf ( test_d )
def test_get_ipv6_address ( self ) :
"""
Test the behaviour when the server name contains an explicit IPv6 address
( with no port )
"""
# the SRV lookup will return an empty list (XXX: why do we even do an SRV lookup?)
self . mock_resolver . resolve_service . side_effect = lambda _ : [ ]
# then there will be a getaddrinfo on the IP
self . reactor . lookups [ " ::1 " ] = " ::1 "
test_d = self . _make_get_request ( b " matrix://[::1]/foo/bar " )
# Nothing happened yet
self . assertNoResult ( test_d )
self . mock_resolver . resolve_service . assert_called_once_with (
b " _matrix._tcp.::1 " ,
)
# Make sure treq is trying to connect
clients = self . reactor . tcpClients
self . assertEqual ( len ( clients ) , 1 )
( host , port , client_factory , _timeout , _bindAddress ) = clients [ 0 ]
self . assertEqual ( host , ' ::1 ' )
self . assertEqual ( port , 8448 )
# make a test server, and wire up the client
http_server = self . _make_connection (
client_factory ,
expected_sni = None ,
)
self . assertEqual ( len ( http_server . requests ) , 1 )
request = http_server . requests [ 0 ]
self . assertEqual ( request . method , b ' GET ' )
self . assertEqual ( request . path , b ' /foo/bar ' )
self . assertEqual (
request . requestHeaders . getRawHeaders ( b ' host ' ) ,
[ b ' [::1] ' ] ,
)
# finish the request
request . finish ( )
self . reactor . pump ( ( 0.1 , ) )
self . successResultOf ( test_d )
def test_get_ipv6_address_with_port ( self ) :
"""
Test the behaviour when the server name contains an explicit IPv6 address
( with explicit port )
"""
# there will be a getaddrinfo on the IP
self . reactor . lookups [ " ::1 " ] = " ::1 "
test_d = self . _make_get_request ( b " matrix://[::1]:80/foo/bar " )
# Nothing happened yet
self . assertNoResult ( test_d )
# Make sure treq is trying to connect
clients = self . reactor . tcpClients
self . assertEqual ( len ( clients ) , 1 )
( host , port , client_factory , _timeout , _bindAddress ) = clients [ 0 ]
self . assertEqual ( host , ' ::1 ' )
self . assertEqual ( port , 80 )
# make a test server, and wire up the client
http_server = self . _make_connection (
client_factory ,
expected_sni = None ,
)
self . assertEqual ( len ( http_server . requests ) , 1 )
request = http_server . requests [ 0 ]
self . assertEqual ( request . method , b ' GET ' )
self . assertEqual ( request . path , b ' /foo/bar ' )
self . assertEqual (
request . requestHeaders . getRawHeaders ( b ' host ' ) ,
[ b ' [::1]:80 ' ] ,
)
# finish the request
request . finish ( )
self . reactor . pump ( ( 0.1 , ) )
self . successResultOf ( test_d )
def test_get_hostname_no_srv ( self ) :
"""
Test the behaviour when the server name has no port , and no SRV record
@ -258,7 +347,7 @@ class MatrixFederationAgentTests(TestCase):
Test the behaviour when there is a single SRV record
"""
self . mock_resolver . resolve_service . side_effect = lambda _ : [
Server ( host = " srvtarget " , port = 8443 )
Server ( host = b " srvtarget " , port = 8443 )
]
self . reactor . lookups [ " srvtarget " ] = " 1.2.3.4 "
@ -298,6 +387,96 @@ class MatrixFederationAgentTests(TestCase):
self . reactor . pump ( ( 0.1 , ) )
self . successResultOf ( test_d )
def test_idna_servername ( self ) :
""" test the behaviour when the server name has idna chars in """
self . mock_resolver . resolve_service . side_effect = lambda _ : [ ]
# hostnameendpoint does the lookup on the unicode value (getaddrinfo encodes
# it back to idna)
self . reactor . lookups [ u " bücher.com " ] = " 1.2.3.4 "
# this is idna for bücher.com
test_d = self . _make_get_request ( b " matrix://xn--bcher-kva.com/foo/bar " )
# Nothing happened yet
self . assertNoResult ( test_d )
self . mock_resolver . resolve_service . assert_called_once_with (
b " _matrix._tcp.xn--bcher-kva.com " ,
)
# Make sure treq is trying to connect
clients = self . reactor . tcpClients
self . assertEqual ( len ( clients ) , 1 )
( host , port , client_factory , _timeout , _bindAddress ) = clients [ 0 ]
self . assertEqual ( host , ' 1.2.3.4 ' )
self . assertEqual ( port , 8448 )
# make a test server, and wire up the client
http_server = self . _make_connection (
client_factory ,
expected_sni = b ' xn--bcher-kva.com ' ,
)
self . assertEqual ( len ( http_server . requests ) , 1 )
request = http_server . requests [ 0 ]
self . assertEqual ( request . method , b ' GET ' )
self . assertEqual ( request . path , b ' /foo/bar ' )
self . assertEqual (
request . requestHeaders . getRawHeaders ( b ' host ' ) ,
[ b ' xn--bcher-kva.com ' ] ,
)
# finish the request
request . finish ( )
self . reactor . pump ( ( 0.1 , ) )
self . successResultOf ( test_d )
def test_idna_srv_target ( self ) :
""" test the behaviour when the target of a SRV record has idna chars """
self . mock_resolver . resolve_service . side_effect = lambda _ : [
Server ( host = b " xn--trget-3qa.com " , port = 8443 ) # târget.com
]
self . reactor . lookups [ u " târget.com " ] = " 1.2.3.4 "
test_d = self . _make_get_request ( b " matrix://xn--bcher-kva.com/foo/bar " )
# Nothing happened yet
self . assertNoResult ( test_d )
self . mock_resolver . resolve_service . assert_called_once_with (
b " _matrix._tcp.xn--bcher-kva.com " ,
)
# Make sure treq is trying to connect
clients = self . reactor . tcpClients
self . assertEqual ( len ( clients ) , 1 )
( host , port , client_factory , _timeout , _bindAddress ) = clients [ 0 ]
self . assertEqual ( host , ' 1.2.3.4 ' )
self . assertEqual ( port , 8443 )
# make a test server, and wire up the client
http_server = self . _make_connection (
client_factory ,
expected_sni = b ' xn--bcher-kva.com ' ,
)
self . assertEqual ( len ( http_server . requests ) , 1 )
request = http_server . requests [ 0 ]
self . assertEqual ( request . method , b ' GET ' )
self . assertEqual ( request . path , b ' /foo/bar ' )
self . assertEqual (
request . requestHeaders . getRawHeaders ( b ' host ' ) ,
[ b ' xn--bcher-kva.com ' ] ,
)
# finish the request
request . finish ( )
self . reactor . pump ( ( 0.1 , ) )
self . successResultOf ( test_d )
def _check_logcontext ( context ) :
current = LoggingContext . current_context ( )