blob: 7304e87862a549cd16f10b6c0a745b9a74cfa2a1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
import random
from ssl import SSLSocket
from src.request import Request
API_FILE_RANDOM_MIN_SIZE_LIMIT = 1
API_FILE_RANDOM_MAX_SIZE_LIMIT = 2**30 * 2
def random_data_gen(size: int) -> bytes:
"""
Generates SIZE bytes of random data in 64kib chunks
:param size: bytes to generate
:return: random bytes
"""
data = bytearray()
int_size = size // 65536
for _ in range(int_size):
data += random.randbytes(65536)
data += random.randbytes((int_size * 65536) - size)
return data
def decode_size(size: str) -> int:
"""
Decodes size string like '128mib' and converts it to int size in bytes
:param size: size string
:return: number of bytes
"""
# split string into number and size modifier
int_string = ""
size_modifier = ""
integer = True
for char in size:
if not char.isdigit():
integer = False
if integer:
int_string += char
else:
size_modifier += char
size = int(int_string)
# multiply size by size modifier
match size_modifier:
case "b": # bytes
pass
case "kib": # kibibytes
size *= 2**10
case "mib": # mebibytes
size *= 2**20
case "gib": # gibibytes
size *= 2**30
case _:
pass
return size
async def respond(client: SSLSocket, request: Request) -> tuple[int, bytes, dict]:
"""
Respond to clients API request
"""
# decode API request
split_path = request.path.split("/")
api_level1 = split_path[2]
api_request = split_path[3]
# do something with it (oh god)
if api_level1 == "file":
if api_request == "random":
# get size
size_str = request.path_args.get("size", "16mib")
size = decode_size(size_str)
# check size
if size < API_FILE_RANDOM_MIN_SIZE_LIMIT or size > API_FILE_RANDOM_MAX_SIZE_LIMIT:
return 400, b'', {}
return 200, random_data_gen(size), {}
else:
return 400, b'', {}
else:
return 400, b'', {}
|