From d39acd4acb7ab9061ea481588432462818b78ae7 Mon Sep 17 00:00:00 2001 From: Sean Li <22557931+sean0407@users.noreply.github.com> Date: Fri, 16 Oct 2026 03:56:04 +0800 Subject: [PATCH] fix: report invalid HAR archives cleanly --- python/extract_har.py | 7 ++++++- python/test_extract_har.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 python/test_extract_har.py diff --git a/python/extract_har.py b/python/extract_har.py index f8052c24..529d62de 100644 --- a/python/extract_har.py +++ b/python/extract_har.py @@ -70,7 +70,12 @@ def extract_har(harzip, mimetypes, output, paths, pretty_json): output_dir = Path(output) output_dir.mkdir(parents=True, exist_ok=True) - with zipfile.ZipFile(harzip) as zf: + try: + archive = zipfile.ZipFile(harzip) + except zipfile.BadZipFile as exc: + raise click.ClickException(f"Invalid ZIP archive: {harzip}") from exc + + with archive as zf: # Read the HAR JSON file try: har_content = json.loads(zf.read("har.har")) diff --git a/python/test_extract_har.py b/python/test_extract_har.py new file mode 100644 index 00000000..516e1dc3 --- /dev/null +++ b/python/test_extract_har.py @@ -0,0 +1,33 @@ +import importlib.util +import tempfile +import unittest +from pathlib import Path + +from click.testing import CliRunner + + +SCRIPT = Path(__file__).with_name("extract_har.py") +SPEC = importlib.util.spec_from_file_location("extract_har", SCRIPT) +MODULE = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(MODULE) + + +class ExtractHarBadZipTests(unittest.TestCase): + def test_non_zip_input_returns_a_click_error_without_traceback(self): + runner = CliRunner() + with tempfile.TemporaryDirectory() as directory: + input_path = Path(directory) / "invalid.txt" + input_path.write_text("not a zip file", encoding="utf-8") + + result = runner.invoke( + MODULE.extract_har, + [str(input_path), "text/plain", "--output", str(Path(directory) / "out")], + ) + + self.assertEqual(result.exit_code, 1) + self.assertIn("Invalid ZIP archive", result.output) + self.assertNotIn("Traceback", result.output) + + +if __name__ == "__main__": + unittest.main()