Files
MoFin/venv/lib/python3.12/site-packages/curl_cffi/cli/request.py
T
知微 fa45d8aa5f fix: 小果地址统一node122(兼容LAN+EasyTier)
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
  Privoxy对node122:18003返回500,直连正常
2026-06-30 02:56:35 +08:00

127 lines
3.4 KiB
Python

from __future__ import annotations
import argparse
import json
import sys
from io import BufferedReader
from typing import Any
import curl_cffi
from curl_cffi.requests import Session
from .output import determine_print_spec, handle_download, print_output
from .parse import parse_request_items, process_url
def _execute_request(
args: argparse.Namespace,
method: str,
url: str,
headers: dict[str, str] | None = None,
params: list[tuple[str, str]] | None = None,
data: dict[str, str] | str | None = None,
json_body: dict[str, Any] | None = None,
files: dict[str, BufferedReader] | None = None,
cookies: dict[str, str] | None = None,
auth: tuple[str, str] | None = None,
session: Session | None = None,
) -> int:
"""Execute a single HTTP request and handle output.
Returns:
0 on success, 1 on error."""
request_fn = session.request if session else curl_cffi.request
try:
response = request_fn(
method=method,
url=url,
headers=headers,
params=params,
data=data,
json=json_body,
files=files,
cookies=cookies,
auth=auth,
timeout=args.timeout,
verify=args.verify,
proxy=args.proxy,
allow_redirects=args.follow,
max_redirects=args.max_redirects,
impersonate=args.impersonate,
http_version=getattr(args, "http_version", None),
)
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
return 1
finally:
if files:
for f in files.values():
f.close()
print_spec = determine_print_spec(args)
if args.download:
print_output(response, method, url, headers, None, "h")
handle_download(response, url, args.output)
else:
request_body = None
if json_body is not None:
request_body = json.dumps(json_body, indent=2, ensure_ascii=False)
elif data is not None:
request_body = str(data)
print_output(response, method, url, headers, request_body, print_spec)
if response.status_code >= 400:
return 1
return 0
def handle_request(
args: argparse.Namespace, method: str, exit_on_error: bool = True
) -> int:
"""Entrypoint for building and executing a request from parsed args.
Returns:
0 on success, 1 on error."""
url = process_url(args.url)
parsed = parse_request_items(args.items)
data = None
json_body = None
if args.form or args.multipart:
if parsed.data_fields:
data = dict(parsed.data_fields)
else:
if parsed.data_fields or parsed.json_fields:
body = dict(parsed.data_fields)
body.update(dict(parsed.json_fields))
json_body = body
files = None
if parsed.files:
files = {}
for field_name, filepath in parsed.files:
files[field_name] = open(filepath, "rb") # noqa: SIM115
auth = None
if args.auth:
parts = args.auth.split(":", 1)
auth = (parts[0], parts[1] if len(parts) > 1 else "")
rc = _execute_request(
args,
method,
url,
headers=parsed.headers,
params=parsed.query_params,
data=data,
json_body=json_body,
files=files,
cookies=parsed.cookies,
auth=auth,
)
if rc != 0 and exit_on_error:
sys.exit(1)
return rc