From 65c85a9b15c14f1c8adc172a2e371b927722f08f Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Wed, 20 Aug 2014 13:11:30 -0500 Subject: [PATCH 1/4] Add timeout argument --- README.rst | 1 + speedtest_cli.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 6da05fe..a25f2b2 100644 --- a/README.rst +++ b/README.rst @@ -89,6 +89,7 @@ Usage --server SERVER Specify a server ID to test against --mini MINI URL of the Speedtest Mini server --source SOURCE Source IP address to bind to + --timeout TIMEOUT HTTP timeout in seconds. Default 10 --version Show the version number and exit Inconsistency diff --git a/speedtest_cli.py b/speedtest_cli.py index 105c390..b790b56 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -484,6 +484,8 @@ def speedtest(): parser.add_argument('--server', help='Specify a server ID to test against') parser.add_argument('--mini', help='URL of the Speedtest Mini server') parser.add_argument('--source', help='Source IP address to bind to') + parser.add_argument('--timeout', default=10, type=int, + help='HTTP timeout in seconds. Default 10') parser.add_argument('--version', action='store_true', help='Show the version number and exit') @@ -498,6 +500,8 @@ def speedtest(): if args.version: version() + socket.setdefaulttimeout(args.timeout) + # If specified bind to a specific IP address if args.source: source = args.source From 60c3ec2a5e43daa07d03510a187d8536c68f2b4d Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Wed, 20 Aug 2014 13:12:30 -0500 Subject: [PATCH 2/4] Send custom User-Agent with all http requests. See #86 --- speedtest_cli.py | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/speedtest_cli.py b/speedtest_cli.py index b790b56..452c3fa 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -18,6 +18,7 @@ __version__ = '0.3.1' # Some global variables we use +user_agent = 'speedtest-cli/%s' % __version__ source = None shutdown_event = None @@ -165,6 +166,17 @@ def distance(origin, destination): return d +def build_request(url, data=None, headers={}): + """Build a urllib2 request object + + This function automatically adds a User-Agent header to all requests + + """ + + headers['User-Agent'] = user_agent + return Request(url, data=data, headers=headers) + + class FileGetter(threading.Thread): """Thread class for retrieving a URL""" @@ -178,7 +190,8 @@ class FileGetter(threading.Thread): self.result = [0] try: if (timeit.default_timer() - self.starttime) <= 10: - f = urlopen(self.url) + request = build_request(self.url) + f = urlopen(request) while 1 and not shutdown_event.isSet(): self.result.append(len(f.read(10240))) if self.result[-1] == 0: @@ -242,7 +255,8 @@ class FilePutter(threading.Thread): try: if ((timeit.default_timer() - self.starttime) <= 10 and not shutdown_event.isSet()): - f = urlopen(self.url, self.data) + request = build_request(self.url, data=self.data) + f = urlopen(request) f.read(11) f.close() self.result = len(self.data) @@ -305,7 +319,8 @@ def getConfig(): we are interested in """ - uh = urlopen('http://www.speedtest.net/speedtest-config.php') + request = build_request('http://www.speedtest.net/speedtest-config.php') + uh = urlopen(request) configxml = [] while 1: configxml.append(uh.read(10240)) @@ -342,7 +357,9 @@ def closestServers(client, all=False): distance """ - uh = urlopen('http://www.speedtest.net/speedtest-servers-static.php') + url = 'http://www.speedtest.net/speedtest-servers-static.php' + request = build_request(url) + uh = urlopen(request) serversxml = [] while 1: serversxml.append(uh.read(10240)) @@ -408,8 +425,9 @@ def getBestServer(servers): h = HTTPSConnection(urlparts[1]) else: h = HTTPConnection(urlparts[1]) + headers = {'User-Agent': user_agent} start = timeit.default_timer() - h.request("GET", urlparts[2]) + h.request("GET", urlparts[2], headers=headers) r = h.getresponse() total = (timeit.default_timer() - start) except (HTTPError, URLError, socket.error): @@ -557,7 +575,8 @@ def speedtest(): url = args.mini urlparts = urlparse(url) try: - f = urlopen(args.mini) + request = build_request(args.mini) + f = urlopen(request) except: print_('Invalid Speedtest Mini URL') sys.exit(1) @@ -568,7 +587,9 @@ def speedtest(): if not extension: for ext in ['php', 'asp', 'aspx', 'jsp']: try: - f = urlopen('%s/speedtest/upload.%s' % (args.mini, ext)) + request = build_request('%s/speedtest/upload.%s' % + (args.mini, ext)) + f = urlopen(request) except: pass else: @@ -663,10 +684,11 @@ def speedtest(): (ping, ulspeedk, dlspeedk, '297aae72')) .encode()).hexdigest()] - req = Request('http://www.speedtest.net/api/api.php', - data='&'.join(apiData).encode()) - req.add_header('Referer', 'http://c.speedtest.net/flash/speedtest.swf') - f = urlopen(req) + headers = {'Referer': 'http://c.speedtest.net/flash/speedtest.swf'} + request = build_request('http://www.speedtest.net/api/api.php', + data='&'.join(apiData).encode(), + headers=headers) + f = urlopen(request) response = f.read() code = f.code f.close() From b0e1e58a0b5d480836d4b4e450fc045ed08201c5 Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Tue, 2 Sep 2014 15:06:14 -0500 Subject: [PATCH 3/4] s/bytes/byte/ and s/bits/bit/. Fixes #89 --- speedtest_cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/speedtest_cli.py b/speedtest_cli.py index 452c3fa..10e0889 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -487,7 +487,7 @@ def speedtest(): except AttributeError: pass parser.add_argument('--bytes', dest='units', action='store_const', - const=('bytes', 1), default=('bits', 8), + const=('byte', 1), default=('bit', 8), help='Display values in bytes instead of bits. Does ' 'not affect the image generated by --share') parser.add_argument('--share', action='store_true', From f6303ba5f7a8c4b06dbab36b774799525011168e Mon Sep 17 00:00:00 2001 From: Mathias Bynens Date: Wed, 17 Dec 2014 16:28:39 +0100 Subject: [PATCH 4/4] Use HTTPS for speedtest.net URLs --- speedtest_cli.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/speedtest_cli.py b/speedtest_cli.py index 10e0889..ce9f8dc 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -319,7 +319,7 @@ def getConfig(): we are interested in """ - request = build_request('http://www.speedtest.net/speedtest-config.php') + request = build_request('https://www.speedtest.net/speedtest-config.php') uh = urlopen(request) configxml = [] while 1: @@ -357,7 +357,7 @@ def closestServers(client, all=False): distance """ - url = 'http://www.speedtest.net/speedtest-servers-static.php' + url = 'https://www.speedtest.net/speedtest-servers-static.php' request = build_request(url) uh = urlopen(request) serversxml = [] @@ -684,8 +684,8 @@ def speedtest(): (ping, ulspeedk, dlspeedk, '297aae72')) .encode()).hexdigest()] - headers = {'Referer': 'http://c.speedtest.net/flash/speedtest.swf'} - request = build_request('http://www.speedtest.net/api/api.php', + headers = {'Referer': 'https://c.speedtest.net/flash/speedtest.swf'} + request = build_request('https://www.speedtest.net/api/api.php', data='&'.join(apiData).encode(), headers=headers) f = urlopen(request) @@ -703,7 +703,7 @@ def speedtest(): print_('Could not submit results to speedtest.net') sys.exit(1) - print_('Share results: http://www.speedtest.net/result/%s.png' % + print_('Share results: https://www.speedtest.net/result/%s.png' % resultid[0])