From e13eca8e1facf849a7825b815adc72ef142b7ca8 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 25 Sep 2017 10:35:05 +0100 Subject: [PATCH] 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 --- hippotat | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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() -- 2.30.2