Skip to content

Instantly share code, notes, and snippets.

@fadenb
Created April 9, 2023 12:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fadenb/d14048805c1cb42c18faf147e74715a7 to your computer and use it in GitHub Desktop.
Save fadenb/d14048805c1cb42c18faf147e74715a7 to your computer and use it in GitHub Desktop.
A (very) naive speedtest using the cloudflare speedtest endpoint written by ChatGPT 🤷
import requests
import time
import argparse
def get_trace_info():
trace_url = "https://speed.cloudflare.com/cdn-cgi/trace"
response = requests.get(trace_url)
trace_data = {}
for line in response.text.splitlines():
key, value = line.split("=", 1)
trace_data[key] = value
return trace_data
def test_speed(url, size_label, size_bytes):
from tqdm import tqdm
start_time = time.time()
response = requests.get(url, stream=True)
total_bytes = 0
with tqdm(total=size_bytes, unit='B', unit_scale=True, desc=size_label) as pbar:
for chunk in response.iter_content(chunk_size=1024):
total_bytes += len(chunk)
pbar.update(len(chunk))
elapsed_time = time.time() - start_time
speed_mbps = (total_bytes * 8) / (elapsed_time * 1024 * 1024)
return size_label, speed_mbps
def size_to_bytes(size_str):
size_str = size_str.strip().lower()
if size_str[-1] == 'k':
multiplier = 1024
elif size_str[-1] == 'm':
multiplier = 1024 * 1024
elif size_str[-1] == 'g':
multiplier = 1024 * 1024 * 1024
else:
raise ValueError("Invalid size. Use suffixes: K, M, G (case-insensitive)")
try:
size_bytes = int(size_str[:-1]) * multiplier
except ValueError:
raise ValueError("Invalid size. Please enter a valid number followed by a suffix (K, M, G)")
return size_bytes
def main(args):
try:
from tabulate import tabulate
except ImportError:
print("tabulate is not installed. Please install it using 'pip install tabulate'")
exit(1)
trace_info = get_trace_info()
print(f"Tester IP: {trace_info['ip']}")
print(f"Cloudflare Data Center: {trace_info['colo']}\n")
base_url = "https://speed.cloudflare.com/__down?bytes="
if not args.size:
default_sizes = ["10M", "100M", "250M", "500M", "1G"]
else:
default_sizes = [args.size]
results = []
for size_str in default_sizes:
try:
size_bytes = size_to_bytes(size_str)
except ValueError as e:
print(e)
continue
size_label, speed_mbps = test_speed(base_url + str(size_bytes), size_str, size_bytes)
results.append((size_label, speed_mbps))
print("\nSummary:")
print(tabulate(results, headers=["Size", "Speed (Mbps)"], tablefmt="grid"))
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Test connection speed to Cloudflare's servers.")
parser.add_argument("-s", "--size", help="File size to test. Use suffixes: K, M, G (case-insensitive); if not provided, the default set of sizes will be tested")
args = parser.parse_args()
try:
from tqdm import tqdm
except ImportError:
print("tqdm is not installed. Please install it using 'pip install tqdm'")
exit(1)
main(args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment