From 290358784340912bcd6e2f0a906e9db3bfebfdea Mon Sep 17 00:00:00 2001 From: Steven Cheng-Han Huang <125765450+stevenpi140@users.noreply.github.com> Date: Sun, 10 May 2026 17:02:25 +0800 Subject: [PATCH] fix(zotero_http): set default Content-Type for raw data, raise connector timeouts - request(): when caller passes raw `data`, default Content-Type to `text/plain; charset=utf-8` so Zotero's connector accepts BibTeX/RIS bodies. Previously the missing header caused HTTP 400 from /connector/import. - connector_import_text: 20s -> 300s. Real BibTeX import via /connector/import takes ~13-21s per entry on a warm Zotero, so 20s timed out on multi-entry .bib files even though the import succeeded server-side. - connector_save_items: 20s -> 120s. - connector_update_session: 15s -> 60s. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../agent-harness/cli_anything/zotero/utils/zotero_http.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/zotero/agent-harness/cli_anything/zotero/utils/zotero_http.py b/zotero/agent-harness/cli_anything/zotero/utils/zotero_http.py index 6db01347e..523f8a984 100644 --- a/zotero/agent-harness/cli_anything/zotero/utils/zotero_http.py +++ b/zotero/agent-harness/cli_anything/zotero/utils/zotero_http.py @@ -63,6 +63,7 @@ def request( body_data = json.dumps(payload).encode("utf-8") elif data is not None: body_data = data.encode("utf-8") if isinstance(data, str) else data + request_headers.setdefault("Content-Type", "text/plain; charset=utf-8") req = urllib.request.Request( _build_url(port, path, params=params), data=body_data, @@ -101,7 +102,7 @@ def get_selected_collection(port: int, timeout: int = 5) -> dict[str, Any]: return response.json() -def connector_import_text(port: int, content: str, *, session_id: str | None = None, timeout: int = 20) -> list[dict[str, Any]]: +def connector_import_text(port: int, content: str, *, session_id: str | None = None, timeout: int = 300) -> list[dict[str, Any]]: params = {"session": session_id} if session_id else None response = request(port, "/connector/import", method="POST", params=params, data=content, timeout=timeout) if response.status != 201: @@ -110,7 +111,7 @@ def connector_import_text(port: int, content: str, *, session_id: str | None = N return parsed if isinstance(parsed, list) else [parsed] -def connector_save_items(port: int, items: list[dict[str, Any]], *, session_id: str, timeout: int = 20) -> None: +def connector_save_items(port: int, items: list[dict[str, Any]], *, session_id: str, timeout: int = 120) -> None: response = request( port, "/connector/saveItems", @@ -161,7 +162,7 @@ def connector_update_session( session_id: str, target: str, tags: list[str] | tuple[str, ...] | None = None, - timeout: int = 15, + timeout: int = 60, ) -> dict[str, Any]: response = request( port,