Source code for scitex_app.sdk._client
#!/usr/bin/env python3
# Timestamp: 2026-03-13
# File: scitex_app/sdk/_client.py
"""Platform API HTTP client — shared base for all platform service wrappers.
Auth resolution: SCITEX_API_TOKEN env var (JWT).
URL resolution: SCITEX_API_URL env var (default: http://127.0.0.1:8000).
"""
from __future__ import annotations
import json
import logging
import os
from typing import Optional
logger = logging.getLogger(__name__)
[docs]
class PlatformClient:
"""Low-level HTTP client for Platform REST APIs."""
[docs]
def __init__(
self,
token: Optional[str] = None,
base_url: Optional[str] = None,
):
self.token = token or os.environ.get("SCITEX_API_TOKEN", "")
self.base_url = (
base_url or os.environ.get("SCITEX_API_URL") or "http://127.0.0.1:8000"
).rstrip("/")
[docs]
def request(
self,
method: str,
endpoint: str,
data: Optional[dict] = None,
params: Optional[dict] = None,
files: Optional[dict] = None,
) -> dict:
"""Make authenticated HTTP request to Platform API."""
import requests
url = f"{self.base_url}{endpoint}"
headers = {"X-Requested-With": "XMLHttpRequest"}
if self.token:
headers["Authorization"] = f"Bearer {self.token}"
method = method.upper()
if method == "GET":
resp = requests.get(url, headers=headers, params=params, timeout=60)
elif method == "POST":
if files:
resp = requests.post(
url, headers=headers, data=data, files=files, timeout=120
)
else:
resp = requests.post(url, headers=headers, json=data, timeout=60)
elif method == "PUT":
resp = requests.put(url, headers=headers, json=data, timeout=60)
elif method == "DELETE":
resp = requests.delete(url, headers=headers, params=params, timeout=60)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
resp.raise_for_status()
try:
return resp.json()
except json.JSONDecodeError:
return {"content": resp.text}
# Module-level singleton (lazy)
_default_client: Optional[PlatformClient] = None
[docs]
def get_client() -> PlatformClient:
"""Get or create the default PlatformClient singleton."""
global _default_client
if _default_client is None:
_default_client = PlatformClient()
return _default_client
[docs]
def reset_client() -> None:
"""Reset the default client (useful after env var changes)."""
global _default_client
_default_client = None
# EOF