@ -18,14 +18,22 @@
from __future__ import print_function
import argparse
from urlparse import urlparse , urlunparse
import nacl . signing
import json
import base64
import requests
import sys
from requests . adapters import HTTPAdapter
import srvlookup
import yaml
# uncomment the following to enable debug logging of http requests
#from httplib import HTTPConnection
#HTTPConnection.debuglevel = 1
def encode_base64 ( input_bytes ) :
""" Encode bytes as a base64 string without any padding. """
@ -113,17 +121,6 @@ def read_signing_keys(stream):
return keys
def lookup ( destination , path ) :
if " : " in destination :
return " https:// %s %s " % ( destination , path )
else :
try :
srv = srvlookup . lookup ( " matrix " , " tcp " , destination ) [ 0 ]
return " https:// %s : %d %s " % ( srv . host , srv . port , path )
except :
return " https:// %s : %d %s " % ( destination , 8448 , path )
def request_json ( method , origin_name , origin_key , destination , path , content ) :
if method is None :
if content is None :
@ -152,13 +149,19 @@ def request_json(method, origin_name, origin_key, destination, path, content):
authorization_headers . append ( bytes ( header ) )
print ( " Authorization: %s " % header , file = sys . stderr )
dest = lookup ( destination , path )
dest = " matrix:// %s %s " % ( destination , path )
print ( " Requesting %s " % dest , file = sys . stderr )
result = requests . request (
s = requests . Session ( )
s . mount ( " matrix:// " , MatrixConnectionAdapter ( ) )
result = s . request (
method = method ,
url = dest ,
headers = { " Authorization " : authorization_headers [ 0 ] } ,
headers = {
" Host " : destination ,
" Authorization " : authorization_headers [ 0 ]
} ,
verify = False ,
data = content ,
)
@ -242,5 +245,39 @@ def read_args_from_config(args):
args . signing_key_path = config [ ' signing_key_path ' ]
class MatrixConnectionAdapter ( HTTPAdapter ) :
@staticmethod
def lookup ( s ) :
if s [ - 1 ] == ' ] ' :
# ipv6 literal (with no port)
return s , 8448
if " : " in s :
out = s . rsplit ( " : " , 1 )
try :
port = int ( out [ 1 ] )
except ValueError :
raise ValueError ( " Invalid host:port ' %s ' " % s )
return out [ 0 ] , port
try :
srv = srvlookup . lookup ( " matrix " , " tcp " , s ) [ 0 ]
return srv . host , srv . port
except :
return s , 8448
def get_connection ( self , url , proxies = None ) :
parsed = urlparse ( url )
( host , port ) = self . lookup ( parsed . netloc )
netloc = " %s : %d " % ( host , port )
print ( " Connecting to %s " % ( netloc , ) , file = sys . stderr )
url = urlunparse ( (
" https " , netloc , parsed . path , parsed . params , parsed . query ,
parsed . fragment ,
) )
return super ( MatrixConnectionAdapter , self ) . get_connection ( url , proxies )
if __name__ == " __main__ " :
main ( )