From 70c37b001c9f69889ac56c6fe6cf4a4a34ca111e Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Thu, 26 Dec 2024 10:27:36 +0100
Subject: [PATCH] Simplify _ReqMap code.

---
 src/ytplom/http.py | 23 +++++++----------------
 1 file changed, 7 insertions(+), 16 deletions(-)

diff --git a/src/ytplom/http.py b/src/ytplom/http.py
index 0a6fa85..ad2cc85 100644
--- a/src/ytplom/http.py
+++ b/src/ytplom/http.py
@@ -5,7 +5,7 @@ from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
 from json import dumps as json_dumps, loads as json_loads
 from pathlib import Path
 from time import sleep, time
-from typing import Any, Generator, Optional
+from typing import Any, Optional
 from urllib.parse import parse_qs, urlparse
 from urllib.request import urlretrieve
 from urllib.error import HTTPError
@@ -79,15 +79,8 @@ class Server(ThreadingHTTPServer):
 class _ReqMap:
     """Wrapper over dictionary-like HTTP postings."""
 
-    def __init__(self, map_as_str: str, is_json: bool = False) -> None:
-        self.is_json = is_json
-        self.as_str = map_as_str
-
-    @property
-    def _as_dict(self) -> dict[str, list[str]]:
-        if self.is_json:
-            return json_loads(self.as_str)
-        return parse_qs(self.as_str)
+    def __init__(self, as_str: str, is_json: bool = False) -> None:
+        self._as_dict = json_loads(as_str) if is_json else parse_qs(as_str)
 
     def has_key(self, key: str) -> bool:
         """Return if key exists at all."""
@@ -101,11 +94,9 @@ class _ReqMap:
         """Return all values mapped to key."""
         return self._as_dict.get(key, [])
 
-    def key_starting_with(self, start: str) -> Generator:
-        """From .as_dict yield key starting with start."""
-        for k in self._as_dict:
-            if k.startswith(start):
-                yield k
+    def keys_starting_with(self, prefix: str) -> tuple[str, ...]:
+        """Return all keys present starting with prefix."""
+        return tuple(k for k in self._as_dict if k.startswith(prefix))
 
 
 class _TaskHandler(BaseHTTPRequestHandler):
@@ -165,7 +156,7 @@ class _TaskHandler(BaseHTTPRequestHandler):
         self._redirect(Path(postvars.first_for('redir_target')))
 
     def _receive_files_command(self, postvars: _ReqMap) -> None:
-        for k in postvars.key_starting_with('play_'):
+        for k in postvars.keys_starting_with('play_'):
             with DbConn() as conn:
                 file = VideoFile.get_one(
                         conn, Hash.from_b64(k.split('_', 1)[1]))
-- 
2.30.2