{"id":26063213,"url":"https://github.com/edgio/hurl","last_synced_at":"2025-04-11T11:45:45.369Z","repository":{"id":23247941,"uuid":"26605834","full_name":"Edgio/hurl","owner":"Edgio","description":"http(s)+h2 server load tester","archived":false,"fork":false,"pushed_at":"2023-08-16T19:49:35.000Z","size":6454,"stargazers_count":152,"open_issues_count":1,"forks_count":34,"subscribers_count":36,"default_branch":"master","last_synced_at":"2025-03-25T08:11:14.217Z","etag":null,"topics":["client","h2","http","https","load-testing"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Edgio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-2.0.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-11-13T20:12:15.000Z","updated_at":"2025-01-03T21:44:18.000Z","dependencies_parsed_at":"2025-03-08T16:34:06.369Z","dependency_job_id":null,"html_url":"https://github.com/Edgio/hurl","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edgio%2Fhurl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edgio%2Fhurl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edgio%2Fhurl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edgio%2Fhurl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Edgio","download_url":"https://codeload.github.com/Edgio/hurl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248387944,"owners_count":21095306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client","h2","http","https","load-testing"],"created_at":"2025-03-08T16:33:54.661Z","updated_at":"2025-04-11T11:45:45.333Z","avatar_url":"https://github.com/Edgio.png","language":"C++","readme":"# hurl\n\u003e _HTTP Server Load Test utility written in C++_\n\n## Table of Contents\n\n- [Background](#background)\n- [Install](#install)\n- [Usage](#usage)\n- [Contribute](#contribute)\n- [License](#license)\n\n## Background\n\n*hurl* is an http server load tester similar to ab/siege/weighttp/wrk with support for tls, http2, multithreading, parallelism, url ranges.  *hurl* is primarily useful for benchmarking http server applications.\n\n* **A little more about URLs Ranges**:\n*hurl* has support for range expansion in urls which is useful for testing a server's capability to serve from many files. *hurl* will expand the ranges specified in the wildcards and perform requests in user configurable orders (see the \"--mode\" option in help).\neg: \"http://127.0.0.1:8089/[1-100]/my_[1-9]_file.html\".\n\n#### An example\n```bash\n\u003ehurl \"https://google.com\" --calls=100 -p100 -f1000\nRunning 1 threads 100 parallel connections per thread with 100 requests per connection\n+-----------/-----------+-----------+-----------+--------------+-----------+-------------+-----------+\n| Completed / Requested |    IdlKil |    Errors | kBytes Recvd |   Elapsed |       Req/s |      MB/s |\n+-----------/-----------+-----------+-----------+--------------+-----------+-------------+-----------+\n|       572 /       665 |         0 |         0 |       334.43 |     1.00s |    1118.00s |     0.33s |\n|      1000 /      1000 |         0 |         0 |       257.73 |     1.50s |     668.66s |     0.25s |\n| RESULTS:             ALL\n| fetches:             1000\n| max parallel:        100\n| bytes:               3.644410e+05\n| seconds:             1.501000\n| mean bytes/conn:     364.441000\n| fetches/sec:         666.222518\n| bytes/sec:           2.427988e+05\n| HTTP response codes: \n| 200 -- 1000\n```\n\n## Install\n\n## OS requirements:\nLinux/OS X (kqueue support coming soon-ish)\n\n### Install dependencies:\nLibrary requirements:\n* libssl/libcrypto (OpenSSL)\n\n### OS X Build requirements (brew)\n```bash\nbrew install cmake\nbrew install openssl\n```\n\n### Building the tools\n```bash\n./build_simple.sh\n```\n\nAnd optionally install\n```bash\ncd ./build\nsudo make install\n```\n\n## Usage\n`hurl --help`\n\n```sh\nUsage: hurl [http[s]://]hostname[:port]/path [options]\nOptions are:\n  -h, --help           Display this help and exit.\n  -V, --version        Display the version number and exit.\n  \nRun Options:\n  -4, --ipv4           Resolve name to IPv4 address.\n  -6, --ipv6           Resolve name to IPv6 address.\n  -w, --no_wildcards   Don't wildcard the url.\n  -M, --mode           Request mode -if multipath [random(default) | sequential].\n  -d, --data           HTTP body data -supports curl style @ file specifier\n  -p, --parallel       Num parallel. Default: 100.\n  -f, --fetches        Num fetches.\n  -N, --calls          Number of requests per connection (or stream if H2)\n  -1, --h1             Force http 1.x\n  -t, --threads        Number of parallel threads. Default: 1\n  -H, --header         Request headers -can add multiple ie -H\u003c\u003e -H\u003c\u003e...\n  -X, --verb           Request command -HTTP verb to use -GET/PUT/etc. Default GET\n  -l, --seconds        Run for \u003cN\u003e seconds.\n  -s, --silent         Silent mode.\n  -A, --rate           Max Request Rate -per sec.\n  -T, --timeout        Timeout (seconds).\n  -x, --no_stats       Don't collect stats -faster.\n  -I, --addr_seq       Sequence over local address range.\n  -S, --chunk_size_kb  Chunk size in kB -max bytes to read/write per socket read/write. Default 8 kB\n  -F, --rand_xfwd      Generate a random X-Forwarded-For header per request)\n  \nTLS Settings:\n  -y, --cipher         Cipher --see \"openssl ciphers\" for list.\n  -O, --tls_options    SSL Options string.\n  \nDisplay Options:\n  -v, --verbose        Verbose logging\n  -c, --no_color       Turn off colors\n  -C, --responses      Display http(s) response codes instead of request statistics\n  -L, --responses_per  Display http(s) response codes per interval instead of request statistics\n  -U, --update         Update output every N ms. Default 500ms.\n  \nResults Options:\n  -j, --json           Display results in json\n  -o, --output         Output results to file \u003cFILE\u003e -default to stdout\n  \nDebug Options:\n  -r, --trace          Turn on tracing (error/warn/debug/verbose/all)\n  \nNote: If running long jobs consider enabling tcp_tw_reuse -eg:\necho 1 \u003e /proc/sys/net/ipv4/tcp_tw_reuse\n```\n\n## Contribute\n\n- We welcome issues, questions and pull requests.\n\n\n## License\n\nThis project is licensed under the terms of the Apache 2.0 open source license. Please refer to the `LICENSE-2.0.txt` file for the full terms.\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgio%2Fhurl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedgio%2Fhurl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgio%2Fhurl/lists"}