diff --git a/examples/server/main.py b/examples/server/main.py index 9b041ae..e686c95 100644 --- a/examples/server/main.py +++ b/examples/server/main.py @@ -17,11 +17,21 @@ def handler(client: socket.socket, address: str): return req_arr = req_raw.split(b"\r\n") req_http_raw = req_arr[0] + req_header_str = req_raw.split(b"\r\n\r\n")[0] + req_body_str = req_raw.split(b"\r\n\r\n")[1] req_http_arr = req_http_raw.split(b" ") req_method = req_http_arr[0] req_uri = req_http_arr[1] req_http_version = req_http_arr[2] - status, headers, content, manually = response(client, req_uri.decode()) + req_header = {} + for header in req_header_str.split(b"\r\n"): + try: + key, value = header.split(b": ") + except ValueError: + continue + else: + req_header[key.decode().lower()] = value.decode() + status, headers, content, manually = response(client, req_uri.decode(), req_header, req_body_str) if not manually: client.send(req_http_version + b" " + status.encode() + b"\r\n") client.send(b"Access-Control-Allow-Origin: *\r\n") @@ -62,21 +72,30 @@ def main(): threading.Thread(target=handler, args=sock.accept()).start() -def response(client: socket.socket, uri: str) -> tuple[str, list, bytes, bool]: +def response(client: socket.socket, uri: str, header: dict, body: bytes) -> tuple[str, list, bytes, bool]: if re.search(r"^/audio/track/([0-9a-zA-Z]{22})$", uri) is not None: track_id_search = re.search(r"^/audio/track/(?P[0-9a-zA-Z]{22})$", uri) track_id_str = track_id_search.group("TrackID") track_id = TrackId.from_base62(track_id_str) stream = session.content_feeder() \ .load(track_id, VorbisOnlyAudioQuality(AudioQuality.VERY_HIGH), False, None) + start = 0 + end = stream.input_stream.stream().size() + if header.get("range") is not None: + range_search = re.search("^bytes=(?P[0-9]+?)-(?P[0-9]+?)$", header.get("range")) + if range_search is not None: + start = int(range_search.group("start")) + end = int(range_search.group("end")) if int(range_search.group("end")) <= stream.input_stream.stream().size() else stream.input_stream.stream().size() + stream.input_stream.stream().skip(start) client.send(b"HTTP/1.0 200 OK\r\n") client.send(b"Access-Control-Allow-Origin: *\r\n") + client.send(b"Content-Length: " + (str(stream.input_stream.stream().size()).encode() if stream.input_stream.stream().size() == end else "{}-{}/{}".format(start, end, stream.input_stream.stream().size()).encode()) + b"\r\n") client.send(b"Content-Type: audio/ogg\r\n") client.send(b"\r\n") while True: - byte = stream.input_stream.stream().read() - if byte == -1: + if stream.input_stream.stream().pos() >= stream.input_stream.stream().size(): break + byte = stream.input_stream.stream().read() client.send(bytes([byte])) return "", [], b"", True else: