From 76cd7d238f3ebf7bdeaa8b768ab174435ee6e462 Mon Sep 17 00:00:00 2001 From: Grey Lee Date: Sat, 12 Jan 2013 22:20:59 +0800 Subject: [PATCH 1/3] Support for Python 2.5: - Use minidom to replace ElementTree, which is not available in Python 2.5 - Use urllib2.urlopen to replace urllib.urlopen, so we can get HTTP code - Use cgi.parse_qs when ulrparse.parse_qs is not available --- speedtest-cli | 53 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/speedtest-cli b/speedtest-cli index 96ec88f..3e502f6 100755 --- a/speedtest-cli +++ b/speedtest-cli @@ -15,11 +15,13 @@ # License for the specific language governing permissions and limitations # under the License. -import urllib import urllib2 -import urlparse +try: + from urlparse import parse_qs +except ImportError: + from cgi import parse_qs import math -import xml.etree.ElementTree as ET +from xml.dom import minidom as DOM import time import os import sys @@ -59,7 +61,7 @@ class FileGetter(threading.Thread): def run(self): try: if (time.time() - self.starttime) <= 10: - f = urllib.urlopen(self.url) + f = urllib2.urlopen(self.url) contents = f.read() f.close() self.result = contents @@ -113,7 +115,7 @@ class FilePutter(threading.Thread): def run(self): try: if (time.time() - self.starttime) <= 10: - f = urllib.urlopen(self.url, self.data) + f = urllib2.urlopen(self.url, self.data) contents = f.read() f.close() self.result = self.data @@ -153,22 +155,29 @@ def uploadSpeed(url, sizes): return (len(''.join(finished))/(time.time()-start)) +def getAttributesByTagName(dom, tagName): + elem = dom.getElementsByTagName(tagName)[0] + return dict(elem.attributes.items()) + + def getConfig(): """Download the speedtest.net configuration and return only the data we are interested in """ - uh = urllib.urlopen('http://www.speedtest.net/speedtest-config.php') + uh = urllib2.urlopen('http://www.speedtest.net/speedtest-config.php') configxml = uh.read() - if int(uh.getcode()) != 200: + if int(uh.code) != 200: return None uh.close() - root = ET.fromstring(configxml) + root = DOM.parseString(configxml) config = { - 'client': root.find('client').attrib, - 'times': root.find('times').attrib, - 'download': root.find('download').attrib, - 'upload': root.find('upload').attrib} + 'client': getAttributesByTagName(root, 'client'), + 'times': getAttributesByTagName(root, 'times'), + 'download': getAttributesByTagName(root, 'download'), + 'upload': getAttributesByTagName(root, 'upload')} + + del root return config @@ -177,17 +186,17 @@ def closestServers(client): distance """ - uh = urllib.urlopen('http://speedtest.net/speedtest-servers.php') + uh = urllib2.urlopen('http://speedtest.net/speedtest-servers.php') serversxml = uh.read() - if int(uh.getcode()) != 200: + if int(uh.code) != 200: return None uh.close() - root = ET.fromstring(serversxml) + root = DOM.parseString(serversxml) servers = {} - for server in root[0]: + for server in root.getElementsByTagName('server'): d = distance([float(client['lat']), float(client['lon'])], - [float(server.get('lat')), float(server.get('lon'))]) - servers[d] = server.attrib + [float(server.getAttribute('lat')), float(server.getAttribute('lon'))]) + servers[d] = dict(server.attributes.items()) closest = [] for d in sorted(servers.keys())[0:4]: @@ -208,11 +217,11 @@ def getBestServer(servers): cum = 0 url = os.path.dirname(server['url']) for i in xrange(0, 3): - uh = urllib.urlopen('%s/latency.txt' % url) + uh = urllib2.urlopen('%s/latency.txt' % url) start = time.time() text = uh.read().strip() total = time.time() - start - if int(uh.getcode()) == 200 and text == 'test=test': + if int(uh.code) == 200 and text == 'test=test': cum += total else: cum += 3600 @@ -280,14 +289,14 @@ def speedtest(): req.add_header('Referer', 'http://c.speedtest.net/flash/speedtest.swf') f = urllib2.urlopen(req) response = f.read() - code = f.getcode() + code = f.code f.close() if int(code) != 200: print 'Could not submit results to speedtest.net' sys.exit(1) - qsargs = urlparse.parse_qs(response) + qsargs = parse_qs(response) resultid = qsargs.get('resultid') if not resultid or len(resultid) != 1: print 'Could not submit results to speedtest.net' From f3bdb7257c9ee23c8d27ccfc6699b82beccc1dfc Mon Sep 17 00:00:00 2001 From: Grey Lee Date: Sat, 12 Jan 2013 22:22:11 +0800 Subject: [PATCH 2/3] Support for Python 2.4: - Use md5.md5 when hashlib.md5 is not available --- speedtest-cli | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/speedtest-cli b/speedtest-cli index 3e502f6..02241b2 100755 --- a/speedtest-cli +++ b/speedtest-cli @@ -25,7 +25,10 @@ from xml.dom import minidom as DOM import time import os import sys -import hashlib +try: + from hashlib import md5 +except: + from md5 import md5 import threading from Queue import Queue @@ -280,9 +283,9 @@ def speedtest(): 'recommendedserverid=%s' % best['id'], 'accuracy=%s' % 1, 'serverid=%s' % best['id'], - 'hash=%s' % hashlib.md5('%s-%s-%s-%s' % - (ping, ulspeedk, dlspeedk, '297aae72') - ).hexdigest()] + 'hash=%s' % md5('%s-%s-%s-%s' % + (ping, ulspeedk, dlspeedk, '297aae72') + ).hexdigest()] req = urllib2.Request('http://www.speedtest.net/api/api.php', data='&'.join(apiData)) From 5ed261b33d965b3ef6ed90d8902c883895fecc24 Mon Sep 17 00:00:00 2001 From: Grey Lee Date: Sat, 12 Jan 2013 22:29:52 +0800 Subject: [PATCH 3/3] Shorten a line to pass pep8 --- speedtest-cli | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/speedtest-cli b/speedtest-cli index 02241b2..b9de6a4 100755 --- a/speedtest-cli +++ b/speedtest-cli @@ -197,9 +197,10 @@ def closestServers(client): root = DOM.parseString(serversxml) servers = {} for server in root.getElementsByTagName('server'): + attrib = dict(server.attributes.items()) d = distance([float(client['lat']), float(client['lon'])], - [float(server.getAttribute('lat')), float(server.getAttribute('lon'))]) - servers[d] = dict(server.attributes.items()) + [float(attrib.get('lat')), float(attrib.get('lon'))]) + servers[d] = attrib closest = [] for d in sorted(servers.keys())[0:4]: