convert curl/fetch command to python requests
Project description
convert-to-requests
convert curl/fetch command to python requests
Parse curl
command (from "copy to cURL") or (w/ --fetch
) fetch
code (from
"copy to fetch") from stdin and either execute the request using
requests.request()
(exec
subcommand) or print Python code to do so (code
subcommand).
curl
Get the code:
$ convert-to-requests code --pretty <<< "curl 'https://obfusk.ch' -H 'User-Agent: Mozilla/5.0'"
requests.request('GET', 'https://obfusk.ch', headers={
'User-Agent': 'Mozilla/5.0'
})
Execute the request:
$ convert-to-requests exec -v <<< "curl 'https://obfusk.ch' -H 'User-Agent: Mozilla/5.0'" | head -2
GET https://obfusk.ch headers={'User-Agent': 'Mozilla/5.0'} data=None
<!DOCTYPE html>
<html lang="en">
POST works too:
$ convert-to-requests code <<< "curl 'https://example.com' -H 'User-Agent: Mozilla/5.0' -H 'Accept: application/json' -X POST --data-raw foo"
requests.request('POST', 'https://example.com', headers={'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json'}, data=b'foo')
fetch
$ convert-to-requests --fetch code <<-END
fetch("https://example.com", {
"headers": {
"accept": "application/json"
},
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "omit"
});
END
Warning: ignoring mode=
Warning: ignoring credentials=
requests.request('GET', 'https://example.com', headers={'accept': 'application/json'})
Python API
>>> from convert_to_requests import curl_to_requests, to_python_code
>>> req = curl_to_requests(r"curl 'https://example.com' -X POST --data-raw $'\'foo\''", parse_bash_strings=True)
>>> req
RequestData(method='POST', url='https://example.com', headers={}, data=b"'foo'", ignored=[])
>>> print(to_python_code(req.method, req.url, req.headers, req.data))
requests.request('POST', 'https://example.com', headers={}, data=b"'foo'")
>>> print(req.code()) # shorter alternative
requests.request('POST', 'https://example.com', headers={}, data=b"'foo'")
>>> import requests
>>> r = requests.request(req.method, req.url, headers=req.headers, data=req.data)
>>> r.raise_for_status()
>>> print(r.text, end="")
[...]
>>> print(req.exec().text, end="") # shorter alternative
[...]
>>> from convert_to_requests import fetch_to_requests, to_python_code
>>> req = fetch_to_requests('''fetch("https://example.com", {"headers": {}, "method": "POST", "body": "'foo'"});''')
>>> req
RequestData(method='POST', url='https://example.com', headers={}, data=b"'foo'", ignored=[])
>>> print(to_python_code(req.method, req.url, req.headers, req.data))
requests.request('POST', 'https://example.com', headers={}, data=b"'foo'")
>>> from convert_to_requests import parse_dollar_string
>>> parse_dollar_string(r"$'\'foo\''")
("'foo'", '')
CAVEATS
curl
Firefox and Chromium produce e.g. --data-raw $'\'foo\''
when the POST data
contains single quotes. Unfortunately, shlex
can't parse this kind of
bash
-style string. Use --parse-bash-strings
to (attempt to) parse these
properly. Of course, manually rewriting to e.g. --data-raw \''foo'\'
always
works.
fetch
Unfortunately, "copy as fetch" doesn't include cookies ("copy as Node.js fetch" does).
Chromium doesn't include a User-Agent
header in either.
Installing
Using pip
$ pip install convert-to-requests
NB: depending on your system you may need to use e.g. pip3 --user
instead of just pip
.
From git
NB: this installs the latest development version, not the latest release.
$ git clone https://github.com/obfusk/convert-to-requests.git
$ cd convert-to-requests
$ pip install -e .
NB: you may need to add e.g. ~/.local/bin
to your $PATH
in order
to run convert-to-requests
.
To update to the latest development version:
$ cd convert-to-requests
$ git pull --rebase
Dependencies
- Python >= 3.8 + requests.
Debian/Ubuntu
$ apt install python3-requests
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for convert-to-requests-0.1.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7aa0e14f36d2286cc44a02dd0490edf33355ef10ef64102e31cc925767aa744b |
|
MD5 | 208d0342586569f6d84630570c1953dc |
|
BLAKE2b-256 | b355a50c5d5df54426f52042cfc99adde067c24b603b765cfb679923f75d9665 |
Hashes for convert_to_requests-0.1.2-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0573ec05849d2a475d1876156e32ced6cd3715d17779a5181044e8ed740385b7 |
|
MD5 | 77595cbce9135051586eb99dd660dfea |
|
BLAKE2b-256 | 61aeca5283bacd0048b44d6dacdf908bf44a6388d543f5ba70f8c764a4909284 |