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)