Switch to httplib/http.client to allow for better timing of latency, results may be slightly higher than previous, but more reliable
This commit is contained in:
		
							parent
							
								
									b14e104ad1
								
							
						
					
					
						commit
						c1b9a0db0a
					
				|  | @ -48,6 +48,11 @@ try: | |||
| except ImportError: | ||||
|     from urllib.request import urlopen, Request, HTTPError, URLError | ||||
| 
 | ||||
| try: | ||||
|     from httplib import HTTPConnection, HTTPSConnection | ||||
| except ImportError: | ||||
|     from http.client import HTTPConnection, HTTPSConnection | ||||
| 
 | ||||
| try: | ||||
|     from Queue import Queue | ||||
| except ImportError: | ||||
|  | @ -380,31 +385,36 @@ def closestServers(client, all=False): | |||
| 
 | ||||
| 
 | ||||
| def getBestServer(servers): | ||||
|     """Perform a speedtest.net "ping" to determine which speedtest.net | ||||
|     server has the lowest latency | ||||
|     """Perform a speedtest.net latency request to determine which | ||||
|     speedtest.net server has the lowest latency | ||||
|     """ | ||||
| 
 | ||||
|     results = {} | ||||
|     for server in servers: | ||||
|         cum = [] | ||||
|         url = os.path.dirname(server['url']) | ||||
|         url = '%s/latency.txt' % os.path.dirname(server['url']) | ||||
|         urlparts = urlparse(url) | ||||
|         for i in range(0, 3): | ||||
|             try: | ||||
|                 uh = urlopen('%s/latency.txt' % url) | ||||
|                 if urlparts[0] == 'https': | ||||
|                     h = HTTPSConnection(urlparts[1]) | ||||
|                 else: | ||||
|                     h = HTTPConnection(urlparts[1]) | ||||
|                 start = time.time() | ||||
|                 h.request("GET", urlparts[2]) | ||||
|                 r = h.getresponse() | ||||
|                 total = (time.time() - start) | ||||
|             except (HTTPError, URLError): | ||||
|                 cum.append(3600) | ||||
|                 continue | ||||
|             start = time.time() | ||||
|             text = uh.read(9) | ||||
|             total = time.time() - start | ||||
|             if int(uh.code) == 200 and text == 'test=test'.encode(): | ||||
|             text = r.read(9) | ||||
|             if int(r.status) == 200 and text == 'test=test'.encode(): | ||||
|                 cum.append(total) | ||||
|             else: | ||||
|                 cum.append(3600) | ||||
|             uh.close() | ||||
|         avg = round((sum(cum) / 3) * 1000000, 3) | ||||
|             h.close() | ||||
|         avg = round((sum(cum) / 6) * 1000, 3) | ||||
|         results[avg] = server | ||||
| 
 | ||||
|     fastest = sorted(results.keys())[0] | ||||
|     best = results[fastest] | ||||
|     best['latency'] = fastest | ||||
|  | @ -573,7 +583,7 @@ def speedtest(): | |||
|             best = servers[0] | ||||
|     else: | ||||
|         if not args.simple: | ||||
|             print_('Selecting best server based on ping...') | ||||
|             print_('Selecting best server based on latency...') | ||||
|         best = getBestServer(servers) | ||||
| 
 | ||||
|     if not args.simple: | ||||
|  | @ -588,7 +598,7 @@ def speedtest(): | |||
|             print_('Hosted by %(sponsor)s (%(name)s) [%(d)0.2f km]: ' | ||||
|                    '%(latency)s ms' % best) | ||||
|     else: | ||||
|         print_('Ping: %(latency)s ms' % best) | ||||
|         print_('Latency: %(latency)s ms' % best) | ||||
| 
 | ||||
|     sizes = [350, 500, 750, 1000, 1500, 2000, 2500, 3000, 3500, 4000] | ||||
|     urls = [] | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue