Source code for woob.tools.request
# flake8: compatible
from __future__ import annotations
import shlex
import requests
from woob.tools.json import json
__all__ = ["to_curl"]
[docs]def to_curl(request: requests.PreparedRequest | dict) -> str:
"""Return a generated functional curl command based on a request.
:param request: The prepared request, or property dictionary, to
transform into a curl command.
:return: The curl command, with UNIX newlines.
"""
if isinstance(request, requests.PreparedRequest):
method: str = request.method
url: str = request.url
headers: dict[str, str] = request.headers
body: bytes | None = request.body
else:
method = request["method"]
url = request["url"]
headers = json.loads(str(request["headers"]).replace("'", '"'))
body = request.get("body")
parts = [
"curl",
"--compressed", # Decompress encoded data before stdout
]
if method not in ("GET", "POST"):
parts += ("-X", method)
for header, value in headers.items():
parts += ["-H", f"{header}:{value}"]
if body:
if isinstance(body, bytes):
parts += ["-d", f'{body.decode("utf-8")}']
else:
parts += ["-d", f"{body}"]
parts += [f"{url}"]
return shlex.join(parts)