Generate code from cURL commands
curlconverter
transpiles curl
commands into programs in other programming languages.
$ curlconverter --data-raw "hello=world" example.com
import requests
data = {
'hello': 'world',
}
response = requests.post('http://example.com', data=data)
You can choose the output language by passing --language <language>
. The options are python
(the default), javascript
/node
, node-axios
, php
, go
, java
, r
, rust
, elixir
, dart
, matlab
and a few more.
Install the command line tool with
$ npm install --global curlconverter
Install the JavaScript library for use in your own projects with
$ npm install --save curlconverter
curlconverter requires Node 12+.
The JavaScript API is a bunch of functions that can take either a string of Bash code or an array
import * as curlconverter from 'curlconverter';
curlconverter.toPython("curl 'http://en.wikipedia.org/' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://www.wikipedia.org/' -H 'Cookie: GeoIP=US:Albuquerque:35.1241:-106.7675:v4; uls-previous-languages=%5B%22en%22%5D; mediaWiki.user.sessionId=VaHaeVW3m0ymvx9kacwshZIDkv8zgF9y; centralnotice_buckets_by_campaign=%7B%22C14_enUS_dsk_lw_FR%22%3A%7B%22val%22%3A%220%22%2C%22start%22%3A1412172000%2C%22end%22%3A1422576000%7D%2C%22C14_en5C_dec_dsk_FR%22%3A%7B%22val%22%3A3%2C%22start%22%3A1417514400%2C%22end%22%3A1425290400%7D%2C%22C14_en5C_bkup_dsk_FR%22%3A%7B%22val%22%3A1%2C%22start%22%3A1417428000%2C%22end%22%3A1425290400%7D%7D; centralnotice_bannercount_fr12=22; centralnotice_bannercount_fr12-wait=14' -H 'Connection: keep-alive' --compressed");
curlconverter.toPython(['curl', 'http://en.wikipedia.org/', '-H', 'Accept-Encoding: gzip, deflate, sdch', '-H', 'Accept-Language: en-US,en;q=0.8', '-H', 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', '-H', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', '-H', 'Referer: http://www.wikipedia.org/', '-H', 'Cookie: GeoIP=US:Albuquerque:35.1241:-106.7675:v4; uls-previous-languages=%5B%22en%22%5D; mediaWiki.user.sessionId=VaHaeVW3m0ymvx9kacwshZIDkv8zgF9y; centralnotice_buckets_by_campaign=%7B%22C14_enUS_dsk_lw_FR%22%3A%7B%22val%22%3A%220%22%2C%22start%22%3A1412172000%2C%22end%22%3A1422576000%7D%2C%22C14_en5C_dec_dsk_FR%22%3A%7B%22val%22%3A3%2C%22start%22%3A1417514400%2C%22end%22%3A1425290400%7D%2C%22C14_en5C_bkup_dsk_FR%22%3A%7B%22val%22%3A1%2C%22start%22%3A1417428000%2C%22end%22%3A1425290400%7D%7D; centralnotice_bannercount_fr12=22; centralnotice_bannercount_fr12-wait=14', '-H', 'Connection: keep-alive', '--compressed'])
and return a string of code like:
import requests
cookies = {
'GeoIP': 'US:Albuquerque:35.1241:-106.7675:v4',
'uls-previous-languages': '%5B%22en%22%5D',
'mediaWiki.user.sessionId': 'VaHaeVW3m0ymvx9kacwshZIDkv8zgF9y',
'centralnotice_buckets_by_campaign': '%7B%22C14_enUS_dsk_lw_FR%22%3A%7B%22val%22%3A%220%22%2C%22start%22%3A1412172000%2C%22end%22%3A1422576000%7D%2C%22C14_en5C_dec_dsk_FR%22%3A%7B%22val%22%3A3%2C%22start%22%3A1417514400%2C%22end%22%3A1425290400%7D%2C%22C14_en5C_bkup_dsk_FR%22%3A%7B%22val%22%3A1%2C%22start%22%3A1417428000%2C%22end%22%3A1425290400%7D%7D',
'centralnotice_bannercount_fr12': '22',
'centralnotice_bannercount_fr12-wait': '14',
}
headers = {
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'en-US,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Referer': 'http://www.wikipedia.org/',
'Connection': 'keep-alive',
}
response = requests.get('http://en.wikipedia.org/', headers=headers, cookies=cookies)
Note: you have to add "type": "module"
to your package.json for the above example to work.
I'd rather write programs to write programs than write programs.
— Dick Sites, Digital Equipment Corporation, 1985
Make sure you're running Node 12 or greater. The test suite will fail on older versions of Node.js.
If you add a new generator, make sure to update the list of supported languages in src/cli.ts or else it won't be accessible from the command line. Further, you'll want to update test.js and index.js for your new generator to make it part of the testing.
If you want to add new functionality, start with a test.
test/fixtures/curl_commands
with a descriptive filename like post_with_headers.sh
test/fixtures/python/
with a matching filename (but different extension) like post_with_headers.py
npm test
.util.ts
or the generators in src/generators/
The parser generates a generic data structure consumed by code generator functions.
You can run a specific test with:
npm test -- test_name
where test_name
is a file (without the .sh
extension) in test/fixtures/curl_commands/
You can run only the tests for a specific language generator with:
npm test -- --language=python
Before submitting a PR, please check that your JS code conforms to our code style with
npm run lint
Use the following to fix your code if it doesn't:
npm run fix
If you get stuck, please reach out via email. I am always willing to hop on a Google Hangout and pair program.
MIT © Nick Carneiro