From: Mark Wooding Date: Mon, 25 Sep 2017 09:35:05 +0000 (+0100) Subject: hippotat: Convert an explicitly configured URL to ASCII. X-Git-Tag: hippotat/1.0.0~55^2~4 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=commitdiff_plain;h=e13eca8e1facf849a7825b815adc72ef142b7ca8 hippotat: Convert an explicitly configured URL to ASCII. The conversion is rather annoying, and not especially efficient, but it does the job. In particular, it works better than leaving the URL as `str', because that results in a `TypeError' later. Signed-off-by: Mark Wooding --- diff --git a/hippotat b/hippotat index 97d40a7..6aa3121 100755 --- a/hippotat +++ b/hippotat @@ -26,6 +26,7 @@ from hippotatlib import * import twisted.web import twisted.web.client +import urllib.parse import io @@ -245,6 +246,17 @@ class Client(): clients = [ ] +def encode_url(urlstr): + # Oh, this is a disaster. We're given a URL as a `str', but the underlying + # machinery insists on having `bytes'. Assume we've been given a sensible + # URL, with escaping in all of the necessary places, except that it may + # contain non-ASCII characters: then encode as UTF-8 and squash the top- + # bit-set bytes down to percent escapes. + # + # This conses like it's going out of fashion, but it gets the job done. + return b''.join(bytes([b]) if b < 128 else '%%%02X' % b + for b in urlstr.encode('utf-8')) + def process_cfg(_opts, putative_servers, putative_clients): global clients @@ -269,7 +281,7 @@ def process_cfg(_opts, putative_servers, putative_clients): try: c.ifname = srch(cfg_get_raw, 'ifname_client') except NoOptionError: pass - try: c.url = srch(cfg.get,'url') + try: c.url = encode_url(srch(cfg.get,'url')) except NoOptionError: cfg_process_saddrs(c, ss) c.url = c.saddrs[0].url()