aboutsummaryrefslogtreecommitdiff
path: root/dash_server.py
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2020-03-05 11:36:44 +0100
committerAnton Khirnov <anton@khirnov.net>2020-03-05 11:36:44 +0100
commitb87b3ca2937fa4b24f8fc1627bdacad6194dcd59 (patch)
treea92f0c0bb075c5ba19a484554c0fd61985f21446 /dash_server.py
parentb388fe2ffe7d786eac61dc68ed4fbafc57450276 (diff)
dash_server: handle DELETE requests
Diffstat (limited to 'dash_server.py')
-rwxr-xr-xdash_server.py37
1 files changed, 35 insertions, 2 deletions
diff --git a/dash_server.py b/dash_server.py
index 9e79c68..17a4ec8 100755
--- a/dash_server.py
+++ b/dash_server.py
@@ -159,14 +159,17 @@ class StreamCache:
def __getitem__(self, key):
self._logger.debug('reading from cache: %s', key)
with self._lock:
- return self._streams[key]
+ ret = self._streams[key]
+ if ret is None:
+ raise KeyError(key)
+ return ret
@contextlib.contextmanager
def add_entry(self, key, val):
self._logger.debug('cache add: %s', key)
with self._lock:
if key in self._streams:
- raise ValueError('Duplicate cache entry: %s' % key)
+ raise FileExistsError('Duplicate cache entry: %s' % key)
self._streams[key] = val
try:
yield val
@@ -295,6 +298,36 @@ class DashRequestHandler(hs.BaseHTTPRequestHandler):
def do_PUT(self):
return self.do_POST()
+ def do_DELETE(self):
+ self._log_request()
+
+ local_path = self._process_path(self.path)
+
+ # add a temporary None cache entry to make sure
+ # - it is not being uploaded right now
+ # - nobody starts uploading it until we are done with the deletion
+ with contextlib.ExitStack() as stack:
+ try:
+ stack.enter_context(self.server._streams.add_entry(local_path, None))
+ except FileExistsError:
+ self._logger.error('DELETE request for open stream: %s' %
+ local_path.decode('utf-8', errors = 'backslashreplace'))
+ self.send_error(HTTPStatus.CONFLICT)
+ return
+
+ targetpath = b'/'.join((self.server.serve_dir, local_path))
+ try:
+ os.remove(targetpath)
+ except FileNotFoundError:
+ self._logger.error('DELETE request for non-existing file: %s' %
+ local_path.decode('utf-8', errors = 'backslashreplace'))
+ self.send_error(HTTPStatus.NOT_FOUND)
+ return
+
+ self.send_response(HTTPStatus.NO_CONTENT)
+ self.send_header('Content-Length', '0')
+ self.end_headers()
+
class DashServer(hs.ThreadingHTTPServer):
serve_dir = None