Skip to content

Instantly share code, notes, and snippets.

@ctolsen
Last active May 15, 2022 16:19
Show Gist options
  • Star 37 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save ctolsen/5679e874719de7500a0b to your computer and use it in GitHub Desktop.
Save ctolsen/5679e874719de7500a0b to your computer and use it in GitHub Desktop.
"Copy to cURL" in Chrome to Apache Bench command
#!/usr/bin/env python3
import sys
import os
def curl_to_ab(curl_cmd: list, num: int=200, cur: int=4) -> str:
"""
Translate a cURL command created by Chrome's developer tools into a
command for ``ab``, the ApacheBench HTTP benchmarking tool.
Parameters
----------
curl_cmd
The string given to you by the "Copy to cURL" context action in
Chrome's developer tools.
num : int
The number of requests ApacheBench should make in total
cur : int
The number of concurrent requests ApacheBench should make
Note
----
Not all headers play nice with ApacheBench, so ``headers_to_copy`` has
been set to a reasonable default. Tweak this if you need something
else in there.
"""
url = curl_cmd[1]
headers_to_copy = [
'Origin',
'Authorization',
'Accept'
]
headers = []
for i, part in enumerate(curl_cmd):
if part == '-H':
header = curl_cmd[i+1]
if any([h in header for h in headers_to_copy]):
headers.append("'{}'".format(header))
cmd = ['ab -n {} -c {}'.format(num, cur)]
cmd += ['-H {}'.format(part) for part in headers]
cmd.append("'{}'".format(url))
return ' '.join(cmd)
if __name__ == '__main__':
"""Usage: python curl_to_ab.py <cURL command from Chrome>
"""
os.system(curl_to_ab(sys.argv[1:]))
@bweston92
Copy link

not all heros wear capes!

@CaseyPeters
Copy link

I wasn't expecting google to find something this perfect ❤️

@etagwerker
Copy link

@ctolsen Thanks for sharing! I had to slightly tweak it so that it used my current session (I was testing an authenticated URL)

https://gist.github.com/etagwerker/eeb54fa1fdcd8ea6d5b9b168fdfa9952

@pelletencate
Copy link

I wasn't expecting google to find something this perfect ❤️

Neither did I. I guess @ctolson and @google got together earlier and figured that out?

🥇

@ahivert
Copy link

ahivert commented Apr 30, 2020

Helped me a lot so I published it online to be more easy to use.
-> https://curl2ab.ahivert.dev

@pokrovskyy
Copy link

@ahivert, that is awesome, but please update the output command to take the URL in quotes. Otherwise it blows up in the command line, especially for URLs with parameters like http://foo.bar/path?param1=value2&param2=value2

@ahivert
Copy link

ahivert commented Jun 11, 2020

Thanks @pokrovskyy I fixed it

@sogouo
Copy link

sogouo commented Nov 30, 2020

@ctolsen Thanks for sharing!

@fabiocarneiro
Copy link

@ahivert it doesnt work with POST requests.

@odony
Copy link

odony commented Mar 30, 2021

❤️ it, thanks!

Forked to add support for POST data using a temp file (Chrome uses --data-binary and --data-raw for POST): https://gist.github.com/odony/93086f5c917e777cb2f4d0c04d477545

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment