diff --git a/src/gcp_storage_emulator/handlers/objects.py b/src/gcp_storage_emulator/handlers/objects.py index 3fd734b..25b899a 100644 --- a/src/gcp_storage_emulator/handlers/objects.py +++ b/src/gcp_storage_emulator/handlers/objects.py @@ -565,40 +565,16 @@ def batch(request, response, storage, *args, **kwargs): bucket_name = item.get("bucket_name") object_id = item.get("object_id") meta = item.get("meta") - if method == "PATCH": - resp_data = _patch(storage, bucket_name, object_id, meta) - if resp_data: - response.write("HTTP/1.1 200 OK\r\n") - response.write("Content-Type: application/json; charset=UTF-8\r\n") - response.write(json.dumps(resp_data)) - response.write("\r\n\r\n") - if method == "DELETE": - if object_id: - resp_data = _delete(storage, bucket_name, object_id) - else: - try: - storage.delete_bucket(bucket_name) - resp_data = True - except (Conflict, NotFound): - pass - if resp_data: - response.write("HTTP/1.1 204 No Content\r\n") - response.write("Content-Type: application/json; charset=UTF-8\r\n") - if method == "POST": # kludgy heuristics, currently only supports COPY - if object_id: - resp_data = _copy( - request.base_url, - storage, - bucket_name, - object_id, - item["dest_bucket_name"], - item["dest_object_id"], - ) - if resp_data: - response.write("HTTP/1.1 200 OK\r\n") - response.write("Content-Type: application/json; charset=UTF-8\r\n") - response.write(json.dumps(resp_data)) - response.write("\r\n\r\n") + + handler = f"_batch_{method.lower()}" + try: + handler = globals()[handler] + except KeyError: + pass + else: + resp_data = handler( + request, item, storage, bucket_name, object_id, meta, response + ) if not resp_data: msg = "No such object: {}/{}".format(bucket_name, object_id) @@ -611,3 +587,52 @@ def batch(request, response, storage, *args, **kwargs): response.write("\r\n\r\n") response.write("--{}--".format(boundary)) + + +def _batch_patch(request, item, storage, bucket_name, object_id, meta, response): + resp_data = _patch(storage, bucket_name, object_id, meta) + if not resp_data: + return None + response.write("HTTP/1.1 200 OK\r\n") + response.write("Content-Type: application/json; charset=UTF-8\r\n") + response.write(json.dumps(resp_data)) + response.write("\r\n\r\n") + return resp_data + + +def _batch_delete(request, item, storage, bucket_name, object_id, meta, response): + resp_data = None + if object_id: + resp_data = _delete(storage, bucket_name, object_id) + else: + try: + storage.delete_bucket(bucket_name) + resp_data = True + except (Conflict, NotFound): + pass + if not resp_data: + return None + response.write("HTTP/1.1 204 No Content\r\n") + response.write("Content-Type: application/json; charset=UTF-8\r\n") + return resp_data + + +# kludgy heuristics, currently only supports COPY +def _batch_post(request, item, storage, bucket_name, object_id, meta, response): + resp_data = None + if object_id: + resp_data = _copy( + request.base_url, + storage, + bucket_name, + object_id, + item["dest_bucket_name"], + item["dest_object_id"], + ) + if not resp_data: + return None + response.write("HTTP/1.1 200 OK\r\n") + response.write("Content-Type: application/json; charset=UTF-8\r\n") + response.write(json.dumps(resp_data)) + response.write("\r\n\r\n") + return resp_data