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
This commit is contained in:
Grey Lee 2013-01-12 22:20:59 +08:00
parent 3a2260d6af
commit 76cd7d238f
1 changed files with 31 additions and 22 deletions

View File

@ -15,11 +15,13 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import urllib
import urllib2 import urllib2
import urlparse try:
from urlparse import parse_qs
except ImportError:
from cgi import parse_qs
import math import math
import xml.etree.ElementTree as ET from xml.dom import minidom as DOM
import time import time
import os import os
import sys import sys
@ -59,7 +61,7 @@ class FileGetter(threading.Thread):
def run(self): def run(self):
try: try:
if (time.time() - self.starttime) <= 10: if (time.time() - self.starttime) <= 10:
f = urllib.urlopen(self.url) f = urllib2.urlopen(self.url)
contents = f.read() contents = f.read()
f.close() f.close()
self.result = contents self.result = contents
@ -113,7 +115,7 @@ class FilePutter(threading.Thread):
def run(self): def run(self):
try: try:
if (time.time() - self.starttime) <= 10: if (time.time() - self.starttime) <= 10:
f = urllib.urlopen(self.url, self.data) f = urllib2.urlopen(self.url, self.data)
contents = f.read() contents = f.read()
f.close() f.close()
self.result = self.data self.result = self.data
@ -153,22 +155,29 @@ def uploadSpeed(url, sizes):
return (len(''.join(finished))/(time.time()-start)) return (len(''.join(finished))/(time.time()-start))
def getAttributesByTagName(dom, tagName):
elem = dom.getElementsByTagName(tagName)[0]
return dict(elem.attributes.items())
def getConfig(): def getConfig():
"""Download the speedtest.net configuration and return only the data """Download the speedtest.net configuration and return only the data
we are interested in 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() configxml = uh.read()
if int(uh.getcode()) != 200: if int(uh.code) != 200:
return None return None
uh.close() uh.close()
root = ET.fromstring(configxml) root = DOM.parseString(configxml)
config = { config = {
'client': root.find('client').attrib, 'client': getAttributesByTagName(root, 'client'),
'times': root.find('times').attrib, 'times': getAttributesByTagName(root, 'times'),
'download': root.find('download').attrib, 'download': getAttributesByTagName(root, 'download'),
'upload': root.find('upload').attrib} 'upload': getAttributesByTagName(root, 'upload')}
del root
return config return config
@ -177,17 +186,17 @@ def closestServers(client):
distance distance
""" """
uh = urllib.urlopen('http://speedtest.net/speedtest-servers.php') uh = urllib2.urlopen('http://speedtest.net/speedtest-servers.php')
serversxml = uh.read() serversxml = uh.read()
if int(uh.getcode()) != 200: if int(uh.code) != 200:
return None return None
uh.close() uh.close()
root = ET.fromstring(serversxml) root = DOM.parseString(serversxml)
servers = {} servers = {}
for server in root[0]: for server in root.getElementsByTagName('server'):
d = distance([float(client['lat']), float(client['lon'])], d = distance([float(client['lat']), float(client['lon'])],
[float(server.get('lat')), float(server.get('lon'))]) [float(server.getAttribute('lat')), float(server.getAttribute('lon'))])
servers[d] = server.attrib servers[d] = dict(server.attributes.items())
closest = [] closest = []
for d in sorted(servers.keys())[0:4]: for d in sorted(servers.keys())[0:4]:
@ -208,11 +217,11 @@ def getBestServer(servers):
cum = 0 cum = 0
url = os.path.dirname(server['url']) url = os.path.dirname(server['url'])
for i in xrange(0, 3): for i in xrange(0, 3):
uh = urllib.urlopen('%s/latency.txt' % url) uh = urllib2.urlopen('%s/latency.txt' % url)
start = time.time() start = time.time()
text = uh.read().strip() text = uh.read().strip()
total = time.time() - start total = time.time() - start
if int(uh.getcode()) == 200 and text == 'test=test': if int(uh.code) == 200 and text == 'test=test':
cum += total cum += total
else: else:
cum += 3600 cum += 3600
@ -280,14 +289,14 @@ def speedtest():
req.add_header('Referer', 'http://c.speedtest.net/flash/speedtest.swf') req.add_header('Referer', 'http://c.speedtest.net/flash/speedtest.swf')
f = urllib2.urlopen(req) f = urllib2.urlopen(req)
response = f.read() response = f.read()
code = f.getcode() code = f.code
f.close() f.close()
if int(code) != 200: if int(code) != 200:
print 'Could not submit results to speedtest.net' print 'Could not submit results to speedtest.net'
sys.exit(1) sys.exit(1)
qsargs = urlparse.parse_qs(response) qsargs = parse_qs(response)
resultid = qsargs.get('resultid') resultid = qsargs.get('resultid')
if not resultid or len(resultid) != 1: if not resultid or len(resultid) != 1:
print 'Could not submit results to speedtest.net' print 'Could not submit results to speedtest.net'