{"id":13405807,"url":"https://github.com/Orange-OpenSource/hurl","last_synced_at":"2025-03-14T10:31:45.916Z","repository":{"id":36999402,"uuid":"290243101","full_name":"Orange-OpenSource/hurl","owner":"Orange-OpenSource","description":"Hurl, run and test HTTP requests with plain text.","archived":false,"fork":false,"pushed_at":"2024-10-29T08:11:23.000Z","size":239011,"stargazers_count":13002,"open_issues_count":150,"forks_count":486,"subscribers_count":53,"default_branch":"master","last_synced_at":"2024-10-29T10:30:38.980Z","etag":null,"topics":["api-testing","cli","curl","http","http-client","integration-testing","testing","testing-tools"],"latest_commit_sha":null,"homepage":"https://hurl.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Orange-OpenSource.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-25T14:50:56.000Z","updated_at":"2024-10-29T06:33:35.000Z","dependencies_parsed_at":"2023-09-29T13:24:24.341Z","dependency_job_id":"e21057f8-f5fb-4e3e-b327-e7645d9cb263","html_url":"https://github.com/Orange-OpenSource/hurl","commit_stats":{"total_commits":2656,"total_committers":68,"mean_commits":39.05882352941177,"dds":0.6317771084337349,"last_synced_commit":"07512a9cbfbba17cd16df3706f3a0c5c98b67d3d"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Orange-OpenSource%2Fhurl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Orange-OpenSource%2Fhurl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Orange-OpenSource%2Fhurl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Orange-OpenSource%2Fhurl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Orange-OpenSource","download_url":"https://codeload.github.com/Orange-OpenSource/hurl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242933903,"owners_count":20208912,"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":["api-testing","cli","curl","http","http-client","integration-testing","testing","testing-tools"],"created_at":"2024-07-30T19:02:12.365Z","updated_at":"2025-03-14T10:31:45.894Z","avatar_url":"https://github.com/Orange-OpenSource.png","language":"Rust","readme":"\u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"/docs/assets/img/logo-light.svg?sanitize=true\" \u003e \n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"/docs/assets/img/logo-dark.svg?sanitize=true\" \u003e \n    \u003cimg src=\"/docs/assets/img/logo-light.svg?sanitize=true\" width=\"264px\" alt=\"Hurl Logo\"\u003e\n\u003c/picture\u003e\n\n[![deploy status](https://github.com/Orange-OpenSource/hurl/workflows/test/badge.svg)](https://github.com/Orange-OpenSource/hurl/actions)\n[![coverage](https://Orange-OpenSource.github.io/hurl/coverage/badges/flat.svg)](https://Orange-OpenSource.github.io/hurl/coverage)\n[![Crates.io](https://img.shields.io/crates/v/hurl.svg)](https://crates.io/crates/hurl)\n[![documentation](https://img.shields.io/badge/-documentation-ff0288)](https://hurl.dev)\n\n# What's Hurl?\n\nHurl is a command line tool that runs \u003cb\u003eHTTP requests\u003c/b\u003e defined in a simple \u003cb\u003eplain text format\u003c/b\u003e.\n\nIt can chain requests, capture values and evaluate queries on headers and body response. Hurl is very\nversatile: it can be used for both \u003cb\u003efetching data\u003c/b\u003e and \u003cb\u003etesting HTTP\u003c/b\u003e sessions.\n\nHurl makes it easy to work with \u003cb\u003eHTML\u003c/b\u003e content, \u003cb\u003eREST / SOAP / GraphQL\u003c/b\u003e APIs, or any other \u003cb\u003eXML / JSON\u003c/b\u003e based APIs. \n\n```hurl\n# Get home:\nGET https://example.org\nHTTP 200\n[Captures]\ncsrf_token: xpath \"string(//meta[@name='_csrf_token']/@content)\"\n\n\n# Do login!\nPOST https://example.org/login?user=toto\u0026password=1234\nX-CSRF-TOKEN: {{csrf_token}}\nHTTP 302\n```\n\nChaining multiple requests is easy:\n\n```hurl\nGET https://example.org/api/health\nGET https://example.org/api/step1\nGET https://example.org/api/step2\nGET https://example.org/api/step3\n```\n\n# Also an HTTP Test Tool\n\nHurl can run HTTP requests but can also be used to \u003cb\u003etest HTTP responses\u003c/b\u003e.\nDifferent types of queries and predicates are supported, from [XPath] and [JSONPath] on body response,\nto assert on status code and response headers.\n\n\u003ca href=\"https://hurl.dev/player.html?id=starwars\u0026speed=3\"\u003e\u003cimg src=\"/docs/assets/img/poster-starwars.png\" width=\"100%\" alt=\"Hurl Demo\"/\u003e\u003c/a\u003e\n\n\nIt is well adapted for \u003cb\u003eREST / JSON APIs\u003c/b\u003e\n\n```hurl\nPOST https://example.org/api/tests\n{\n    \"id\": \"4568\",\n    \"evaluate\": true\n}\nHTTP 200\n[Asserts]\nheader \"X-Frame-Options\" == \"SAMEORIGIN\"\njsonpath \"$.status\" == \"RUNNING\"    # Check the status code\njsonpath \"$.tests\" count == 25      # Check the number of items\njsonpath \"$.id\" matches /\\d{4}/     # Check the format of the id\n```\n\n\u003cb\u003eHTML content\u003c/b\u003e\n\n```hurl\nGET https://example.org\nHTTP 200\n[Asserts]\nxpath \"normalize-space(//head/title)\" == \"Hello world!\"\n```\n\n\u003cb\u003eGraphQL\u003c/b\u003e \n\n~~~hurl\nPOST https://example.org/graphql\n```graphql\n{\n  human(id: \"1000\") {\n    name\n    height(unit: FOOT)\n  }\n}\n```\nHTTP 200\n~~~\n\nand even \u003cb\u003eSOAP APIs\u003c/b\u003e\n\n```hurl\nPOST https://example.org/InStock\nContent-Type: application/soap+xml; charset=utf-8\nSOAPAction: \"http://www.w3.org/2003/05/soap-envelope\"\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003csoap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\"\u003e\n  \u003csoap:Header\u003e\u003c/soap:Header\u003e\n  \u003csoap:Body\u003e\n    \u003cm:GetStockPrice\u003e\n      \u003cm:StockName\u003eGOOG\u003c/m:StockName\u003e\n    \u003c/m:GetStockPrice\u003e\n  \u003c/soap:Body\u003e\n\u003c/soap:Envelope\u003e\nHTTP 200\n```\n\nHurl can also be used to test the \u003cb\u003eperformance\u003c/b\u003e of HTTP endpoints\n\n```hurl\nGET https://example.org/api/v1/pets\nHTTP 200\n[Asserts]\nduration \u003c 1000  # Duration in ms\n```\n\nAnd check response bytes\n\n```hurl\nGET https://example.org/data.tar.gz\nHTTP 200\n[Asserts]\nsha256 == hex,039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81;\n```\n\nFinally, Hurl is easy to \u003cb\u003eintegrate in CI/CD\u003c/b\u003e, with text, JUnit, TAP and HTML reports\n\n\u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"/docs/assets/img/home-waterfall-light.png\"\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"/docs/assets/img/home-waterfall-dark.png\"\u003e\n    \u003cimg src=\"/docs/assets/img/home-waterfall-light.png\" width=\"480\" alt=\"HTML report\"/\u003e\n\u003c/picture\u003e\n\n# Why Hurl?\n\n\u003cul class=\"showcase-container\"\u003e\n    \u003cli\u003e\u003cb\u003eText Format:\u003c/b\u003e for both devops and developers\u003c/li\u003e\n    \u003cli\u003e\u003cb\u003eFast CLI:\u003c/b\u003e a command line for local dev and continuous integration\u003c/li\u003e\n    \u003cli\u003e\u003cb\u003eSingle Binary:\u003c/b\u003e easy to install, with no runtime required\u003c/li\u003e\n\u003c/ul\u003e\n\n# Powered by curl\n\nHurl is a lightweight binary written in [Rust]. Under the hood, Hurl HTTP engine is\npowered by [libcurl], one of the most powerful and reliable file transfer libraries.\nWith its text file format, Hurl adds syntactic sugar to run and test HTTP requests,\nbut it's still the [curl] that we love: __fast__, __efficient__ and __HTTP/3 ready__.\n\n# Feedbacks\n\nTo support its development, [star Hurl on GitHub]!\n\n[Feedback, suggestion, bugs or improvements] are welcome.\n\n```hurl\nPOST https://hurl.dev/api/feedback\n{\n  \"name\": \"John Doe\",\n  \"feedback\": \"Hurl is awesome!\"\n}\nHTTP 200\n```\n\n# Resources\n\n[License]\n\n[Blog]\n\n[Tutorial]\n\n[Documentation] (download [HTML], [PDF], [Markdown]) \n\n[GitHub]\n\n# Table of Contents\n\n* [Samples](#samples)\n    * [Getting Data](#getting-data)\n        * [HTTP Headers](#http-headers)\n        * [Query Params](#query-params)\n        * [Basic Authentication](#basic-authentication)\n        * [Passing Data between Requests ](#passing-data-between-requests)\n    * [Sending Data](#sending-data)\n        * [Sending HTML Form Data](#sending-html-form-data)\n        * [Sending Multipart Form Data](#sending-multipart-form-data)\n        * [Posting a JSON Body](#posting-a-json-body)\n        * [Templating a JSON Body](#templating-a-json-body)\n        * [Templating a XML Body](#templating-a-xml-body)\n        * [Using GraphQL Query](#using-graphql-query)\n        * [Using Dynamic Datas](#using-dynamic-datas)\n    * [Testing Response](#testing-response)\n        * [Testing Status Code](#testing-status-code)\n        * [Testing Response Headers](#testing-response-headers)\n        * [Testing REST APIs](#testing-rest-apis)\n        * [Testing HTML Response](#testing-html-response)\n        * [Testing Set-Cookie Attributes](#testing-set-cookie-attributes)\n        * [Testing Bytes Content](#testing-bytes-content)\n        * [SSL Certificate](#ssl-certificate)\n        * [Checking Full Body](#checking-full-body)\n    * [Reports](#reports)\n        * [HTML Report](#html-report)\n        * [JSON Report](#json-report)\n        * [JUnit Report](#junit-report)\n        * [TAP Report](#tap-report)\n        * [JSON Output](#json-output)\n    * [Others](#others)\n        * [HTTP Version](#http-version)\n        * [Polling and Retry](#polling-and-retry)\n        * [Delaying Requests](#delaying-requests)\n        * [Skipping Requests](#skipping-requests)\n        * [Testing Endpoint Performance](#testing-endpoint-performance)\n        * [Using SOAP APIs](#using-soap-apis)\n        * [Capturing and Using a CSRF Token](#capturing-and-using-a-csrf-token)\n        * [Redacting Secrets](#redacting-secrets)\n        * [Checking Byte Order Mark (BOM) in Response Body](#checking-byte-order-mark-bom-in-response-body)\n        * [AWS Signature Version 4 Requests](#aws-signature-version-4-requests)\n        * [Using curl Options](#using-curl-options)\n* [Manual](#manual)\n    * [Name](#name)\n    * [Synopsis](#synopsis)\n    * [Description](#description)\n    * [Hurl File Format](#hurl-file-format)\n        * [Capturing values](#capturing-values)\n        * [Asserts](#asserts)\n    * [Options](#options)\n    * [Environment](#environment)\n    * [Exit Codes](#exit-codes)\n    * [WWW](#www)\n    * [See Also](#see-also)\n* [Installation](#installation)\n    * [Binaries Installation](#binaries-installation)\n        * [Linux](#linux)\n            * [Debian / Ubuntu](#debian--ubuntu)\n            * [Alpine](#alpine)\n            * [Arch Linux / Manjaro](#arch-linux--manjaro)\n            * [NixOS / Nix](#nixos--nix)\n        * [macOS](#macos)\n            * [Homebrew](#homebrew)\n            * [MacPorts](#macports)\n        * [FreeBSD](#freebsd)\n        * [Windows](#windows)\n            * [Zip File](#zip-file)\n            * [Installer](#installer)\n            * [Chocolatey](#chocolatey)\n            * [Scoop](#scoop)\n            * [Windows Package Manager](#windows-package-manager)\n        * [Cargo](#cargo)\n        * [conda-forge](#conda-forge)\n        * [Docker](#docker)\n        * [npm](#npm)\n    * [Building From Sources](#building-from-sources)\n        * [Build on Linux](#build-on-linux)\n            * [Debian based distributions](#debian-based-distributions)\n            * [Fedora based distributions](#fedora-based-distributions)\n            * [Red Hat based distributions](#red-hat-based-distributions)\n            * [Arch based distributions](#arch-based-distributions)\n            * [Alpine based distributions](#alpine-based-distributions)\n        * [Build on macOS](#build-on-macos)\n        * [Build on Windows](#build-on-windows)\n\n# Samples\n\nTo run a sample, edit a file with the sample content, and run Hurl:\n\n```shell\n$ vi sample.hurl\n\nGET https://example.org\n\n$ hurl sample.hurl\n```\n\nBy default, Hurl behaves like [curl] and outputs the last HTTP response's [entry]. To have a test\noriented output, you can use [`--test` option]:\n\n```shell\n$ hurl --test sample.hurl\n```\n\nA particular response can be saved with [`[Options] section`](https://hurl.dev/docs/request.html#options):\n\n```hurl\nGET https://example.ord/cats/123\n[Options]\noutput: cat123.txt    # use - to output to stdout\nHTTP 200\n\nGET https://example.ord/dogs/567\nHTTP 200\n```\n\nFinally, Hurl can take files as input, or directories. In the latter case, Hurl will search files with `.hurl` extension recursively.\n\n```shell\n$ hurl --test integration/*.hurl\n$ hurl --test .\n```\n\nYou can check [Hurl tests suite] for more samples.\n\n## Getting Data\n\nA simple GET:\n\n```hurl\nGET https://example.org\n```\n\nRequests can be chained:\n\n```hurl\nGET https://example.org/a\nGET https://example.org/b\nHEAD https://example.org/c\nGET https://example.org/c\n```\n\n[Doc](https://hurl.dev/docs/request.html#method)\n\n### HTTP Headers\n\nA simple GET with headers:\n\n```hurl\nGET https://example.org/news\nUser-Agent: Mozilla/5.0 \nAccept: */*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nConnection: keep-alive\n```\n\n[Doc](https://hurl.dev/docs/request.html#headers)\n\n### Query Params\n\n```hurl\nGET https://example.org/news\n[Query]\norder: newest\nsearch: something to search\ncount: 100\n```\n\nOr:\n\n```hurl\nGET https://example.org/news?order=newest\u0026search=something%20to%20search\u0026count=100\n```\n\n\u003e With `[Query]` section, params don't need to be URL escaped.\n\n[Doc](https://hurl.dev/docs/request.html#query-parameters)\n\n### Basic Authentication\n\n```hurl\nGET https://example.org/protected\n[BasicAuth]\nbob: secret\n```\n\n[Doc](https://hurl.dev/docs/request.html#basic-authentication)\n\nThis is equivalent to construct the request with a [Authorization] header:\n\n```hurl\n# Authorization header value can be computed with `echo -n 'bob:secret' | base64`\nGET https://example.org/protected\nAuthorization: Basic Ym9iOnNlY3JldA== \n```\n\nBasic authentication section allows per request authentication. If you want to add basic authentication to all the\nrequests of a Hurl file you could use [`-u/--user` option]:\n\n```shell\n$ hurl --user bob:secret login.hurl\n```\n\n[`--user`] option can also be set per request:\n\n```hurl\nGET https://example.org/login\n[Options]\nuser: bob:secret\nHTTP 200\n\nGET https://example.org/login\n[Options]\nuser: alice:secret\nHTTP 200\n```\n\n### Passing Data between Requests \n\n[Captures] can be used to pass data from one request to another:\n\n```hurl\nPOST https://sample.org/orders\nHTTP 201\n[Captures]\norder_id: jsonpath \"$.order.id\"\n\nGET https://sample.org/orders/{{order_id}}\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/capturing-response.html)\n\n## Sending Data\n\n### Sending HTML Form Data\n\n```hurl\nPOST https://example.org/contact\n[Form]\ndefault: false\ntoken: {{token}}\nemail: john.doe@rookie.org\nnumber: 33611223344\n```\n\n[Doc](https://hurl.dev/docs/request.html#form-parameters)\n\n### Sending Multipart Form Data\n\n```hurl\nPOST https://example.org/upload\n[Multipart]\nfield1: value1\nfield2: file,example.txt;\n# One can specify the file content type:\nfield3: file,example.zip; application/zip\n```\n\n[Doc](https://hurl.dev/docs/request.html#multipart-form-data)\n\nMultipart forms can also be sent with a [multiline string body]:\n\n~~~hurl\nPOST https://example.org/upload\nContent-Type: multipart/form-data; boundary=\"boundary\"\n```\n--boundary\nContent-Disposition: form-data; name=\"key1\"\n\nvalue1\n--boundary\nContent-Disposition: form-data; name=\"upload1\"; filename=\"data.txt\"\nContent-Type: text/plain\n\nHello World!\n--boundary\nContent-Disposition: form-data; name=\"upload2\"; filename=\"data.html\"\nContent-Type: text/html\n\n\u003cdiv\u003eHello \u003cb\u003eWorld\u003c/b\u003e!\u003c/div\u003e\n--boundary--\n```\n~~~\n\nIn that case, files have to be inlined in the Hurl file.\n\n[Doc](https://hurl.dev/docs/request.html#multiline-string-body)\n\n\n\n### Posting a JSON Body\n\nWith an inline JSON:\n\n```hurl\nPOST https://example.org/api/tests\n{\n    \"id\": \"456\",\n    \"evaluate\": true\n}\n```\n\n[Doc](https://hurl.dev/docs/request.html#json-body)\n\nWith a local file:\n\n```hurl\nPOST https://example.org/api/tests\nContent-Type: application/json\nfile,data.json;\n```\n\n[Doc](https://hurl.dev/docs/request.html#file-body)\n\n### Templating a JSON Body\n\n```hurl\nPUT https://example.org/api/hits\nContent-Type: application/json\n{\n    \"key0\": \"{{a_string}}\",\n    \"key1\": {{a_bool}},\n    \"key2\": {{a_null}},\n    \"key3\": {{a_number}}\n}\n```\n\nVariables can be initialized via command line:\n\n```shell\n$ hurl --variable a_string=apple \\\n       --variable a_bool=true \\\n       --variable a_null=null \\\n       --variable a_number=42 \\\n       test.hurl\n```\n\nResulting in a PUT request with the following JSON body:\n\n```\n{\n    \"key0\": \"apple\",\n    \"key1\": true,\n    \"key2\": null,\n    \"key3\": 42\n}\n```\n\n[Doc](https://hurl.dev/docs/templates.html)\n\n### Templating a XML Body\n\nUsing templates with [XML body] is not currently supported in Hurl. You can use templates in\n[XML multiline string body] with variables to send a variable XML body:\n\n~~~hurl\nPOST https://example.org/echo/post/xml\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cRequest\u003e\n    \u003cLogin\u003e{{login}}\u003c/Login\u003e\n    \u003cPassword\u003e{{password}}\u003c/Password\u003e\n\u003c/Request\u003e\n```\n~~~\n\n[Doc](https://hurl.dev/docs/request.html#multiline-string-body)\n\n### Using GraphQL Query\n\nA simple GraphQL query:\n\n~~~hurl\nPOST https://example.org/starwars/graphql\n```graphql\n{\n  human(id: \"1000\") {\n    name\n    height(unit: FOOT)\n  }\n}\n```\n~~~\n\nA GraphQL query with variables:\n\n~~~hurl\nPOST https://example.org/starwars/graphql\n```graphql\nquery Hero($episode: Episode, $withFriends: Boolean!) {\n  hero(episode: $episode) {\n    name\n    friends @include(if: $withFriends) {\n      name\n    }\n  }\n}\n\nvariables {\n  \"episode\": \"JEDI\",\n  \"withFriends\": false\n}\n```\n~~~\n\nGraphQL queries can also use [Hurl templates].\n\n[Doc](https://hurl.dev/docs/request.html#graphql-body)\n\n### Using Dynamic Datas\n\n[Functions] like `newUuid` and `newDate` can be used in templates to create dynamic datas:\n\n\nA file that creates a dynamic email (i.e `0531f78f-7f87-44be-a7f2-969a1c4e6d97@test.com`):\n\n```hurl\nPOST https://example.org/api/foo\n{\n  \"name\": \"foo\",\n  \"email\": \"{{newUuid}}@test.com\"\n}\n```\n\nA file that creates a dynamic query parameter (i.e `2024-12-02T10:35:44.461731Z`):\n\n```hurl\nGET https://example.org/api/foo\n[Query]\ndate: {{newDate}}\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/templates.html#functions)\n\n## Testing Response\n\nResponses are optional, everything after `HTTP` is part of the response asserts.\n\n```hurl\n# A request with (almost) no check:\nGET https://foo.com\n\n# A status code check:\nGET https://foo.com\nHTTP 200\n\n# A test on response body\nGET https://foo.com\nHTTP 200\n[Asserts]\njsonpath \"$.state\" == \"running\"\n```\n\n### Testing Status Code\n\n```hurl\nGET https://example.org/order/435\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#version-status)\n\n```hurl\nGET https://example.org/order/435\n# Testing status code is in a 200-300 range\nHTTP *\n[Asserts]\nstatus \u003e= 200\nstatus \u003c 300\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#status-assert)\n\n\n### Testing Response Headers\n\nUse implicit response asserts to test header values:\n\n```hurl\nGET https://example.org/index.html\nHTTP 200\nSet-Cookie: theme=light\nSet-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#headers)\n\n\nOr use explicit response asserts with [predicates]:\n\n```hurl\nGET https://example.org\nHTTP 302\n[Asserts]\nheader \"Location\" contains \"www.example.net\"\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#header-assert)\n\nImplicit and explicit asserts can be combined:\n\n```hurl\nGET https://example.org/index.html\nHTTP 200\nSet-Cookie: theme=light\nSet-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT\n[Asserts]\nheader \"Location\" contains \"www.example.net\"\n```\n\n### Testing REST APIs\n\nAsserting JSON body response (node values, collection count etc...) with [JSONPath]:\n\n```hurl\nGET https://example.org/order\nscreencapability: low\nHTTP 200\n[Asserts]\njsonpath \"$.validated\" == true\njsonpath \"$.userInfo.firstName\" == \"Franck\"\njsonpath \"$.userInfo.lastName\" == \"Herbert\"\njsonpath \"$.hasDevice\" == false\njsonpath \"$.links\" count == 12\njsonpath \"$.state\" != null\njsonpath \"$.order\" matches \"^order-\\\\d{8}$\"\njsonpath \"$.order\" matches /^order-\\d{8}$/     # Alternative syntax with regex literal\njsonpath \"$.created\" isIsoDate\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#jsonpath-assert)\n\n\n### Testing HTML Response\n\n```hurl\nGET https://example.org\nHTTP 200\nContent-Type: text/html; charset=UTF-8\n[Asserts]\nxpath \"string(/html/head/title)\" contains \"Example\" # Check title\nxpath \"count(//p)\" == 2  # Check the number of p\nxpath \"//p\" count == 2  # Similar assert for p\nxpath \"boolean(count(//h2))\" == false  # Check there is no h2  \nxpath \"//h2\" not exists  # Similar assert for h2\nxpath \"string(//div[1])\" matches /Hello.*/\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#xpath-assert)\n\n### Testing Set-Cookie Attributes\n\n```hurl\nGET https://example.org/home\nHTTP 200\n[Asserts]\ncookie \"JSESSIONID\" == \"8400BAFE2F66443613DC38AE3D9D6239\"\ncookie \"JSESSIONID[Value]\" == \"8400BAFE2F66443613DC38AE3D9D6239\"\ncookie \"JSESSIONID[Expires]\" contains \"Wed, 13 Jan 2021\"\ncookie \"JSESSIONID[Secure]\" exists\ncookie \"JSESSIONID[HttpOnly]\" exists\ncookie \"JSESSIONID[SameSite]\" == \"Lax\"\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#cookie-assert)\n\n### Testing Bytes Content\n\nCheck the SHA-256 response body hash:\n\n```hurl\nGET https://example.org/data.tar.gz\nHTTP 200\n[Asserts]\nsha256 == hex,039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81;\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#sha-256-assert)\n\n### SSL Certificate\n\nCheck the properties of a SSL certificate:\n\n```hurl\nGET https://example.org\nHTTP 200\n[Asserts]\ncertificate \"Subject\" == \"CN=example.org\"\ncertificate \"Issuer\" == \"C=US, O=Let's Encrypt, CN=R3\"\ncertificate \"Expire-Date\" daysAfterNow \u003e 15\ncertificate \"Serial-Number\" matches /[\\da-f]+/\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#ssl-certificate-assert)\n\n### Checking Full Body\n\nUse implicit body to test an exact JSON body match:\n\n```hurl\nGET https://example.org/api/cats/123\nHTTP 200\n{\n  \"name\" : \"Purrsloud\",\n  \"species\" : \"Cat\",\n  \"favFoods\" : [\"wet food\", \"dry food\", \"\u003cstrong\u003eany\u003c/strong\u003e food\"],\n  \"birthYear\" : 2016,\n  \"photo\" : \"https://learnwebcode.github.io/json-example/images/cat-2.jpg\"\n}\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#json-body)\n\nOr an explicit assert file:\n\n```hurl\nGET https://example.org/index.html\nHTTP 200\n[Asserts]\nbody == file,cat.json;\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#body-assert)\n\nImplicit asserts supports XML body:\n\n```hurl\nGET https://example.org/api/catalog\nHTTP 200\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003ccatalog\u003e\n   \u003cbook id=\"bk101\"\u003e\n      \u003cauthor\u003eGambardella, Matthew\u003c/author\u003e\n      \u003ctitle\u003eXML Developer's Guide\u003c/title\u003e\n      \u003cgenre\u003eComputer\u003c/genre\u003e\n      \u003cprice\u003e44.95\u003c/price\u003e\n      \u003cpublish_date\u003e2000-10-01\u003c/publish_date\u003e\n      \u003cdescription\u003eAn in-depth look at creating applications with XML.\u003c/description\u003e\n   \u003c/book\u003e\n\u003c/catalog\u003e\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#xml-body)\n\nPlain text:\n\n~~~hurl\nGET https://example.org/models\nHTTP 200\n```\nYear,Make,Model,Description,Price\n1997,Ford,E350,\"ac, abs, moon\",3000.00\n1999,Chevy,\"Venture \"\"Extended Edition\"\"\",\"\",4900.00\n1999,Chevy,\"Venture \"\"Extended Edition, Very Large\"\"\",,5000.00\n1996,Jeep,Grand Cherokee,\"MUST SELL! air, moon roof, loaded\",4799.00\n```\n~~~\n\n[Doc](https://hurl.dev/docs/asserting-response.html#multiline-string-body)\n\n\nOne line:\n\n```hurl\nPOST https://example.org/helloworld\nHTTP 200\n`Hello world!`\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#oneline-string-body)\n\nFile:\n\n```hurl\nGET https://example.org\nHTTP 200\nfile,data.bin;\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#file-body)\n\n## Reports\n\n### HTML Report\n\n```shell\n$ hurl --test --report-html build/report/ *.hurl\n```\n\n[Doc](https://hurl.dev/docs/running-tests.html#generating-report)\n\n### JSON Report\n\n```shell\n$ hurl --test --report-json build/report/ *.hurl\n```\n\n[Doc](https://hurl.dev/docs/running-tests.html#generating-report)\n\n\n### JUnit Report\n\n```shell\n$ hurl --test --report-junit build/report.xml *.hurl\n```\n\n[Doc](https://hurl.dev/docs/running-tests.html#generating-report)\n\n### TAP Report\n\n```shell\n$ hurl --test --report-tap build/report.txt *.hurl\n```\n\n[Doc](https://hurl.dev/docs/running-tests.html#generating-report)\n\n### JSON Output\n\nA structured output of running Hurl files can be obtained with [`--json` option]. Each file will produce a JSON export of the run.\n\n\n```shell\n$ hurl --json *.hurl\n```\n\n## Others\n\n### HTTP Version\n\nTesting HTTP version (HTTP/1.0, HTTP/1.1, HTTP/2 or HTTP/3):\n\n```hurl\nGET https://foo.com\nHTTP/3 200\n\nGET https://bar.com\nHTTP/2 200\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#version-status)\n\n### Polling and Retry\n\nRetry request on any errors (asserts, captures, status code, runtime etc...):\n\n```hurl\n# Create a new job\nPOST https://api.example.org/jobs\nHTTP 201\n[Captures]\njob_id: jsonpath \"$.id\"\n[Asserts]\njsonpath \"$.state\" == \"RUNNING\"\n\n\n# Pull job status until it is completed\nGET https://api.example.org/jobs/{{job_id}}\n[Options]\nretry: 10   # maximum number of retry, -1 for unlimited\nretry-interval: 500ms\nHTTP 200\n[Asserts]\njsonpath \"$.state\" == \"COMPLETED\"\n```\n\n[Doc](https://hurl.dev/docs/entry.html#retry)\n\n### Delaying Requests\n\nAdd delay for every request, or a particular request:\n\n```hurl\n# Delaying this request by 5 seconds (aka sleep)\nGET https://example.org/turtle\n[Options]\ndelay: 5s\nHTTP 200\n\n# No delay!\nGET https://example.org/turtle\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/manual.html#delay)\n\n### Skipping Requests\n\n```hurl\n# a, c, d are run, b is skipped\nGET https://example.org/a\n\nGET https://example.org/b\n[Options]\nskip: true\n\nGET https://example.org/c\n\nGET https://example.org/d\n```\n\n[Doc](https://hurl.dev/docs/manual.html#skip)\n\n### Testing Endpoint Performance\n\n```hurl\nGET https://sample.org/helloworld\nHTTP *\n[Asserts]\nduration \u003c 1000   # Check that response time is less than one second\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#duration-assert)\n\n### Using SOAP APIs\n\n```hurl\nPOST https://example.org/InStock\nContent-Type: application/soap+xml; charset=utf-8\nSOAPAction: \"http://www.w3.org/2003/05/soap-envelope\"\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003csoap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\"\u003e\n  \u003csoap:Header\u003e\u003c/soap:Header\u003e\n  \u003csoap:Body\u003e\n    \u003cm:GetStockPrice\u003e\n      \u003cm:StockName\u003eGOOG\u003c/m:StockName\u003e\n    \u003c/m:GetStockPrice\u003e\n  \u003c/soap:Body\u003e\n\u003c/soap:Envelope\u003e\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/request.html#xml-body)\n\n### Capturing and Using a CSRF Token\n\n```hurl\nGET https://example.org\nHTTP 200\n[Captures]\ncsrf_token: xpath \"string(//meta[@name='_csrf_token']/@content)\"\n\n\nPOST https://example.org/login?user=toto\u0026password=1234\nX-CSRF-TOKEN: {{csrf_token}}\nHTTP 302\n```\n\n[Doc](https://hurl.dev/docs/capturing-response.html#xpath-capture)\n\n### Redacting Secrets\n\nUsing command-line for known values:\n\n```shell\n$ hurl --secret token=1234 file.hurl\n```\n\n```hurl\nPOST https://example.org\nX-Token: {{token}}\n{\n  \"name\": \"Alice\",\n  \"value: 100\n}\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/templates.html#secrets)\n\nUsing `redact` for dynamic values:\n\n```hurl\n# Get an authorization token:\nGET https://example.org/token\nHTTP 200\n[Captures]\ntoken: header \"X-Token\" redact\n\n# Send an authorized request:\nPOST https://example.org\nX-Token: {{token}}\n{\n  \"name\": \"Alice\",\n  \"value: 100\n}\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/capturing-response.html#redacting-secrets)\n\n### Checking Byte Order Mark (BOM) in Response Body\n\n```hurl\nGET https://example.org/data.bin\nHTTP 200\n[Asserts]\nbytes startsWith hex,efbbbf;\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#bytes-assert)\n\n### AWS Signature Version 4 Requests\n\nGenerate signed API requests with [AWS Signature Version 4], as used by several cloud providers.\n\n```hurl\nPOST https://sts.eu-central-1.amazonaws.com/\n[Options]\naws-sigv4: aws:amz:eu-central-1:sts\n[Form]\nAction: GetCallerIdentity\nVersion: 2011-06-15\n```\n\nThe Access Key is given per [`--user`], either with command line option or within the [`[Options]`](https://hurl.dev/docs/request.html#options) section:\n\n```hurl\nPOST https://sts.eu-central-1.amazonaws.com/\n[Options]\naws-sigv4: aws:amz:eu-central-1:sts\nuser: bob=secret\n[Form]\nAction: GetCallerIdentity\nVersion: 2011-06-15\n```\n\n[Doc](https://hurl.dev/docs/manual.html#aws-sigv4)\n\n### Using curl Options\n\ncurl options (for instance [`--resolve`] or [`--connect-to`]) can be used as CLI argument. In this case, they're applicable\nto each request of an Hurl file.\n\n```shell\n$ hurl --resolve foo.com:8000:127.0.0.1 foo.hurl\n```\n\nUse  [`[Options]` section](https://hurl.dev/docs/request.html#options) to configure a specific request:\n\n```hurl\nGET http://bar.com\nHTTP 200\n\n\nGET http://foo.com:8000/resolve\n[Options]\nresolve: foo.com:8000:127.0.0.1\nHTTP 200\n`Hello World!`\n```\n\n[Doc](https://hurl.dev/docs/request.html#options)\n\n\n# Manual\n\n## Name\n\nhurl - run and test HTTP requests.\n\n\n## Synopsis\n\n**hurl** [options] [FILE...]\n\n\n## Description\n\n**Hurl** is a command line tool that runs HTTP requests defined in a simple plain text format.\n\nIt can chain requests, capture values and evaluate queries on headers and body response. Hurl is very versatile, it can be used for fetching data and testing HTTP sessions: HTML content, REST / SOAP / GraphQL APIs, or any other XML / JSON based APIs.\n\n```shell\n$ hurl session.hurl\n```\n\nIf no input files are specified, input is read from stdin.\n\n```shell\n$ echo GET http://httpbin.org/get | hurl\n    {\n      \"args\": {},\n      \"headers\": {\n        \"Accept\": \"*/*\",\n        \"Accept-Encoding\": \"gzip\",\n        \"Content-Length\": \"0\",\n        \"Host\": \"httpbin.org\",\n        \"User-Agent\": \"hurl/0.99.10\",\n        \"X-Amzn-Trace-Id\": \"Root=1-5eedf4c7-520814d64e2f9249ea44e0\"\n      },\n      \"origin\": \"1.2.3.4\",\n      \"url\": \"http://httpbin.org/get\"\n    }\n```\n\nHurl can take files as input, or directories. In the latter case, Hurl will search files with `.hurl` extension recursively.\n\nOutput goes to stdout by default. To have output go to a file, use the [`-o, --output`](#output) option:\n\n```shell\n$ hurl -o output input.hurl\n```\n\nBy default, Hurl executes all HTTP requests and outputs the response body of the last HTTP call.\n\nTo have a test oriented output, you can use [`--test`](#test) option:\n\n```shell\n$ hurl --test *.hurl\n```\n\n\n## Hurl File Format\n\nThe Hurl file format is fully documented in [https://hurl.dev/docs/hurl-file.html](https://hurl.dev/docs/hurl-file.html)\n\nIt consists of one or several HTTP requests\n\n```hurl\nGET http://example.org/endpoint1\nGET http://example.org/endpoint2\n```\n\n\n### Capturing values\n\nA value from an HTTP response can be-reused for successive HTTP requests.\n\nA typical example occurs with CSRF tokens.\n\n```hurl\nGET https://example.org\nHTTP 200\n# Capture the CSRF token value from html body.\n[Captures]\ncsrf_token: xpath \"normalize-space(//meta[@name='_csrf_token']/@content)\"\n\n# Do the login !\nPOST https://example.org/login?user=toto\u0026password=1234\nX-CSRF-TOKEN: {{csrf_token}}\n```\n\nMore information on captures can be found here [https://hurl.dev/docs/capturing-response.html](https://hurl.dev/docs/capturing-response.html)\n\n### Asserts\n\nThe HTTP response defined in the Hurl file are used to make asserts. Responses are optional.\n\nAt the minimum, response includes assert on the HTTP status code.\n\n```hurl\nGET http://example.org\nHTTP 301\n```\n\nIt can also include asserts on the response headers\n\n```hurl\nGET http://example.org\nHTTP 301\nLocation: http://www.example.org\n```\n\nExplicit asserts can be included by combining a query and a predicate\n\n```hurl\nGET http://example.org\nHTTP 301\n[Asserts]\nxpath \"string(//title)\" == \"301 Moved\"\n```\n\nWith the addition of asserts, Hurl can be used as a testing tool to run scenarios.\n\nMore information on asserts can be found here [https://hurl.dev/docs/asserting-response.html](https://hurl.dev/docs/asserting-response.html)\n\n## Options\n\nOptions that exist in curl have exactly the same semantics.\n\nOptions specified on the command line are defined for every Hurl file's entry,\nexcept if they are tagged as cli-only (can not be defined in the Hurl request [Options] entry)\n\nFor instance:\n\n```shell\n$ hurl --location foo.hurl\n```\n\nwill follow redirection for each entry in `foo.hurl`. You can also define an option only for a particular entry with an `[Options]` section. For instance, this Hurl file:\n\n```hurl\nGET https://example.org\nHTTP 301\n\nGET https://example.org\n[Options]\nlocation: true\nHTTP 200\n```\n\nwill follow a redirection only for the second entry.\n\n| Option                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                          |\n|-------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| \u003ca href=\"#aws-sigv4\" id=\"aws-sigv4\"\u003e\u003ccode\u003e--aws-sigv4 \u0026lt;PROVIDER1[:PROVIDER2[:REGION[:SERVICE]]]\u0026gt;\u003c/code\u003e\u003c/a\u003e | Generate an `Authorization` header with an AWS SigV4 signature.\u003cbr\u003e\u003cbr\u003eUse [`-u, --user`](#user) to specify Access Key Id (username) and Secret Key (password).\u003cbr\u003e\u003cbr\u003eTo use temporary session credentials (e.g. for an AWS IAM Role), add the `X-Amz-Security-Token` header containing the session token.\u003cbr\u003e                                                                                                                      |\n| \u003ca href=\"#cacert\" id=\"cacert\"\u003e\u003ccode\u003e--cacert \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                              | Specifies the certificate file for peer verification. The file may contain multiple CA certificates and must be in PEM format.\u003cbr\u003eNormally Hurl is built to use a default file for this, so this option is typically used to alter that default file.\u003cbr\u003e                                                                                                                                                                            |\n| \u003ca href=\"#cert\" id=\"cert\"\u003e\u003ccode\u003e-E, --cert \u0026lt;CERTIFICATE[:PASSWORD]\u0026gt;\u003c/code\u003e\u003c/a\u003e                              | Client certificate file and password.\u003cbr\u003e\u003cbr\u003eSee also [`--key`](#key).\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                           |\n| \u003ca href=\"#color\" id=\"color\"\u003e\u003ccode\u003e--color\u003c/code\u003e\u003c/a\u003e                                                              | Colorize debug output (the HTTP response output is not colorized).\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                             |\n| \u003ca href=\"#compressed\" id=\"compressed\"\u003e\u003ccode\u003e--compressed\u003c/code\u003e\u003c/a\u003e                                               | Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.\u003cbr\u003e                                                                                                                                                                                                                                                                                                            |\n| \u003ca href=\"#connect-timeout\" id=\"connect-timeout\"\u003e\u003ccode\u003e--connect-timeout \u0026lt;SECONDS\u0026gt;\u003c/code\u003e\u003c/a\u003e                | Maximum time in seconds that you allow Hurl's connection to take.\u003cbr\u003e\u003cbr\u003eYou can specify time units in the connect timeout expression. Set Hurl to use a connect timeout of 20 seconds with `--connect-timeout 20s` or set it to 35,000 milliseconds with `--connect-timeout 35000ms`. No spaces allowed.\u003cbr\u003e\u003cbr\u003eSee also [`-m, --max-time`](#max-time).\u003cbr\u003e                                                                         |\n| \u003ca href=\"#connect-to\" id=\"connect-to\"\u003e\u003ccode\u003e--connect-to \u0026lt;HOST1:PORT1:HOST2:PORT2\u0026gt;\u003c/code\u003e\u003c/a\u003e               | For a request to the given HOST1:PORT1 pair, connect to HOST2:PORT2 instead. This option can be used several times in a command line.\u003cbr\u003e\u003cbr\u003eSee also [`--resolve`](#resolve).\u003cbr\u003e                                                                                                                                                                                                                                                   |\n| \u003ca href=\"#continue-on-error\" id=\"continue-on-error\"\u003e\u003ccode\u003e--continue-on-error\u003c/code\u003e\u003c/a\u003e                          | Continue executing requests to the end of the Hurl file even when an assert error occurs.\u003cbr\u003eBy default, Hurl exits after an assert error in the HTTP response.\u003cbr\u003e\u003cbr\u003eNote that this option does not affect the behavior with multiple input Hurl files.\u003cbr\u003e\u003cbr\u003eAll the input files are executed independently. The result of one file does not affect the execution of the other Hurl files.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e |\n| \u003ca href=\"#cookie\" id=\"cookie\"\u003e\u003ccode\u003e-b, --cookie \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                          | Read cookies from FILE (using the Netscape cookie file format).\u003cbr\u003e\u003cbr\u003eCombined with [`-c, --cookie-jar`](#cookie-jar), you can simulate a cookie storage between successive Hurl runs.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                        |\n| \u003ca href=\"#cookie-jar\" id=\"cookie-jar\"\u003e\u003ccode\u003e-c, --cookie-jar \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                              | Write cookies to FILE after running the session.\u003cbr\u003eThe file will be written using the Netscape cookie file format.\u003cbr\u003e\u003cbr\u003eCombined with [`-b, --cookie`](#cookie), you can simulate a cookie storage between successive Hurl runs.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                            |\n| \u003ca href=\"#curl\" id=\"curl\"\u003e\u003ccode\u003e--curl \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                                    | Export each request to a list of curl commands.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                |\n| \u003ca href=\"#delay\" id=\"delay\"\u003e\u003ccode\u003e--delay \u0026lt;MILLISECONDS\u0026gt;\u003c/code\u003e\u003c/a\u003e                                         | Sets delay before each request (aka sleep). The delay is not applied to requests that have been retried because of [`--retry`](#retry). See [`--retry-interval`](#retry-interval) to space retried requests.\u003cbr\u003e\u003cbr\u003eYou can specify time units in the delay expression. Set Hurl to use a delay of 2 seconds with `--delay 2s` or set it to 500 milliseconds with `--delay 500ms`. No spaces allowed.\u003cbr\u003e                            |\n| \u003ca href=\"#error-format\" id=\"error-format\"\u003e\u003ccode\u003e--error-format \u0026lt;FORMAT\u0026gt;\u003c/code\u003e\u003c/a\u003e                          | Control the format of error message (short by default or long)\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                 |\n| \u003ca href=\"#file-root\" id=\"file-root\"\u003e\u003ccode\u003e--file-root \u0026lt;DIR\u0026gt;\u003c/code\u003e\u003c/a\u003e                                      | Set root directory to import files in Hurl. This is used for files in multipart form data, request body and response output.\u003cbr\u003eWhen it is not explicitly defined, files are relative to the Hurl file's directory.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                            |\n| \u003ca href=\"#from-entry\" id=\"from-entry\"\u003e\u003ccode\u003e--from-entry \u0026lt;ENTRY_NUMBER\u0026gt;\u003c/code\u003e\u003c/a\u003e                          | Execute Hurl file from ENTRY_NUMBER (starting at 1).\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                           |\n| \u003ca href=\"#glob\" id=\"glob\"\u003e\u003ccode\u003e--glob \u0026lt;GLOB\u0026gt;\u003c/code\u003e\u003c/a\u003e                                                    | Specify input files that match the given glob pattern.\u003cbr\u003e\u003cbr\u003eMultiple glob flags may be used. This flag supports common Unix glob patterns like *, ? and [].\u003cbr\u003eHowever, to avoid your shell accidentally expanding glob patterns before Hurl handles them, you must use single quotes or double quotes around each pattern.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                  |\n| \u003ca href=\"#header\" id=\"header\"\u003e\u003ccode\u003e-H, --header \u0026lt;HEADER\u0026gt;\u003c/code\u003e\u003c/a\u003e                                        | Add an extra header to include in information sent. Can be used several times in a command\u003cbr\u003e\u003cbr\u003eDo not add newlines or carriage returns\u003cbr\u003e                                                                                                                                                                                                                                                                                        |\n| \u003ca href=\"#http10\" id=\"http10\"\u003e\u003ccode\u003e-0, --http1.0\u003c/code\u003e\u003c/a\u003e                                                      | Tells Hurl to use HTTP version 1.0 instead of using its internally preferred HTTP version.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                       |\n| \u003ca href=\"#http11\" id=\"http11\"\u003e\u003ccode\u003e--http1.1\u003c/code\u003e\u003c/a\u003e                                                          | Tells Hurl to use HTTP version 1.1.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                                              |\n| \u003ca href=\"#http2\" id=\"http2\"\u003e\u003ccode\u003e--http2\u003c/code\u003e\u003c/a\u003e                                                              | Tells Hurl to use HTTP version 2.\u003cbr\u003eFor HTTPS, this means Hurl negotiates HTTP/2 in the TLS handshake. Hurl does this by default.\u003cbr\u003eFor HTTP, this means Hurl attempts to upgrade the request to HTTP/2 using the Upgrade: request header.\u003cbr\u003e                                                                                                                                                                                     |\n| \u003ca href=\"#http3\" id=\"http3\"\u003e\u003ccode\u003e--http3\u003c/code\u003e\u003c/a\u003e                                                              | Tells Hurl to try HTTP/3 to the host in the URL, but fallback to earlier HTTP versions if the HTTP/3 connection establishment fails. HTTP/3 is only available for HTTPS and not for HTTP URLs.\u003cbr\u003e                                                                                                                                                                                                                                   |\n| \u003ca href=\"#ignore-asserts\" id=\"ignore-asserts\"\u003e\u003ccode\u003e--ignore-asserts\u003c/code\u003e\u003c/a\u003e                                   | Ignore all asserts defined in the Hurl file.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                   |\n| \u003ca href=\"#include\" id=\"include\"\u003e\u003ccode\u003e-i, --include\u003c/code\u003e\u003c/a\u003e                                                    | Include the HTTP headers in the output\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                         |\n| \u003ca href=\"#insecure\" id=\"insecure\"\u003e\u003ccode\u003e-k, --insecure\u003c/code\u003e\u003c/a\u003e                                                 | This option explicitly allows Hurl to perform \"insecure\" SSL connections and transfers.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                          |\n| \u003ca href=\"#interactive\" id=\"interactive\"\u003e\u003ccode\u003e--interactive\u003c/code\u003e\u003c/a\u003e                                            | Stop between requests.\u003cbr\u003e\u003cbr\u003eThis is similar to a break point, You can then continue (Press C) or quit (Press Q).\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                             |\n| \u003ca href=\"#ipv4\" id=\"ipv4\"\u003e\u003ccode\u003e-4, --ipv4\u003c/code\u003e\u003c/a\u003e                                                             | This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                       |\n| \u003ca href=\"#ipv6\" id=\"ipv6\"\u003e\u003ccode\u003e-6, --ipv6\u003c/code\u003e\u003c/a\u003e                                                             | This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                       |\n| \u003ca href=\"#jobs\" id=\"jobs\"\u003e\u003ccode\u003e--jobs \u0026lt;NUM\u0026gt;\u003c/code\u003e\u003c/a\u003e                                                     | Maximum number of parallel jobs in parallel mode. Default value corresponds (in most cases) to the\u003cbr\u003ecurrent amount of CPUs.\u003cbr\u003e\u003cbr\u003eSee also [`--parallel`](#parallel).\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                       |\n| \u003ca href=\"#json\" id=\"json\"\u003e\u003ccode\u003e--json\u003c/code\u003e\u003c/a\u003e                                                                 | Output each Hurl file result to JSON. The format is very closed to HAR format.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                 |\n| \u003ca href=\"#key\" id=\"key\"\u003e\u003ccode\u003e--key \u0026lt;KEY\u0026gt;\u003c/code\u003e\u003c/a\u003e                                                        | Private key file name.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                                                           |\n| \u003ca href=\"#limit-rate\" id=\"limit-rate\"\u003e\u003ccode\u003e--limit-rate \u0026lt;SPEED\u0026gt;\u003c/code\u003e\u003c/a\u003e                                 | Specify the maximum transfer rate you want Hurl to use, for both downloads and uploads. This feature is useful if you have a limited pipe and you would like your transfer not to use your entire bandwidth. To make it slower than it otherwise would be.\u003cbr\u003eThe given speed is measured in bytes/second.\u003cbr\u003e                                                                                                                       |\n| \u003ca href=\"#location\" id=\"location\"\u003e\u003ccode\u003e-L, --location\u003c/code\u003e\u003c/a\u003e                                                 | Follow redirect. To limit the amount of redirects to follow use the [`--max-redirs`](#max-redirs) option\u003cbr\u003e                                                                                                                                                                                                                                                                                                                         |\n| \u003ca href=\"#location-trusted\" id=\"location-trusted\"\u003e\u003ccode\u003e--location-trusted\u003c/code\u003e\u003c/a\u003e                             | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.\u003cbr\u003eThis may or may not introduce a security breach if the site redirects you to a site to which you send your authentication info (which is plaintext in the case of HTTP Basic authentication).\u003cbr\u003e                                                                                                          |\n| \u003ca href=\"#max-filesize\" id=\"max-filesize\"\u003e\u003ccode\u003e--max-filesize \u0026lt;BYTES\u0026gt;\u003c/code\u003e\u003c/a\u003e                           | Specify the maximum size in bytes of a file to download. If the file requested is larger than this value, the transfer does not start.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                         |\n| \u003ca href=\"#max-redirs\" id=\"max-redirs\"\u003e\u003ccode\u003e--max-redirs \u0026lt;NUM\u0026gt;\u003c/code\u003e\u003c/a\u003e                                   | Set maximum number of redirection-followings allowed\u003cbr\u003e\u003cbr\u003eBy default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.\u003cbr\u003e                                                                                                                                                                                                                                                                         |\n| \u003ca href=\"#max-time\" id=\"max-time\"\u003e\u003ccode\u003e-m, --max-time \u0026lt;SECONDS\u0026gt;\u003c/code\u003e\u003c/a\u003e                                 | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.\u003cbr\u003e\u003cbr\u003eYou can specify time units in the maximum time expression. Set Hurl to use a maximum time of 20 seconds with `--max-time 20s` or set it to 35,000 milliseconds with `--max-time 35000ms`. No spaces allowed.\u003cbr\u003e\u003cbr\u003eSee also [`--connect-timeout`](#connect-timeout).\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                  |\n| \u003ca href=\"#netrc\" id=\"netrc\"\u003e\u003ccode\u003e-n, --netrc\u003c/code\u003e\u003c/a\u003e                                                          | Scan the .netrc file in the user's home directory for the username and password.\u003cbr\u003e\u003cbr\u003eSee also [`--netrc-file`](#netrc-file) and [`--netrc-optional`](#netrc-optional).\u003cbr\u003e                                                                                                                                                                                                                                                        |\n| \u003ca href=\"#netrc-file\" id=\"netrc-file\"\u003e\u003ccode\u003e--netrc-file \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                  | Like [`--netrc`](#netrc), but provide the path to the netrc file.\u003cbr\u003e\u003cbr\u003eSee also [`--netrc-optional`](#netrc-optional).\u003cbr\u003e                                                                                                                                                                                                                                                                                                         |\n| \u003ca href=\"#netrc-optional\" id=\"netrc-optional\"\u003e\u003ccode\u003e--netrc-optional\u003c/code\u003e\u003c/a\u003e                                   | Similar to [`--netrc`](#netrc), but make the .netrc usage optional.\u003cbr\u003e\u003cbr\u003eSee also [`--netrc-file`](#netrc-file).\u003cbr\u003e                                                                                                                                                                                                                                                                                                               |\n| \u003ca href=\"#no-color\" id=\"no-color\"\u003e\u003ccode\u003e--no-color\u003c/code\u003e\u003c/a\u003e                                                     | Do not colorize output.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                        |\n| \u003ca href=\"#no-output\" id=\"no-output\"\u003e\u003ccode\u003e--no-output\u003c/code\u003e\u003c/a\u003e                                                  | Suppress output. By default, Hurl outputs the body of the last response.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                       |\n| \u003ca href=\"#noproxy\" id=\"noproxy\"\u003e\u003ccode\u003e--noproxy \u0026lt;HOST(S)\u0026gt;\u003c/code\u003e\u003c/a\u003e                                        | Comma-separated list of hosts which do not use a proxy.\u003cbr\u003e\u003cbr\u003eOverride value from Environment variable no_proxy.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                |\n| \u003ca href=\"#output\" id=\"output\"\u003e\u003ccode\u003e-o, --output \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                          | Write output to FILE instead of stdout.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                                          |\n| \u003ca href=\"#parallel\" id=\"parallel\"\u003e\u003ccode\u003e--parallel\u003c/code\u003e\u003c/a\u003e                                                     | Run files in parallel.\u003cbr\u003e\u003cbr\u003eEach Hurl file is executed in its own worker thread, without sharing anything with the other workers. The default run mode is sequential. Parallel execution is by default in [`--test`](#test) mode.\u003cbr\u003e\u003cbr\u003eSee also [`--jobs`](#jobs).\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                         |\n| \u003ca href=\"#path-as-is\" id=\"path-as-is\"\u003e\u003ccode\u003e--path-as-is\u003c/code\u003e\u003c/a\u003e                                               | Tell Hurl to not handle sequences of /../ or /./ in the given URL path. Normally Hurl will squash or merge them according to standards but with this option set you tell it not to do that.\u003cbr\u003e                                                                                                                                                                                                                                      |\n| \u003ca href=\"#proxy\" id=\"proxy\"\u003e\u003ccode\u003e-x, --proxy \u0026lt;[PROTOCOL://]HOST[:PORT]\u0026gt;\u003c/code\u003e\u003c/a\u003e                         | Use the specified proxy.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                                                         |\n| \u003ca href=\"#repeat\" id=\"repeat\"\u003e\u003ccode\u003e--repeat \u0026lt;NUM\u0026gt;\u003c/code\u003e\u003c/a\u003e                                               | Repeat the input files sequence NUM times, -1 for infinite loop. Given a.hurl, b.hurl, c.hurl as input, repeat two\u003cbr\u003etimes will run a.hurl, b.hurl, c.hurl, a.hurl, b.hurl, c.hurl.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                           |\n| \u003ca href=\"#report-html\" id=\"report-html\"\u003e\u003ccode\u003e--report-html \u0026lt;DIR\u0026gt;\u003c/code\u003e\u003c/a\u003e                                | Generate HTML report in DIR.\u003cbr\u003e\u003cbr\u003eIf the HTML report already exists, it will be updated with the new test results.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                           |\n| \u003ca href=\"#report-json\" id=\"report-json\"\u003e\u003ccode\u003e--report-json \u0026lt;DIR\u0026gt;\u003c/code\u003e\u003c/a\u003e                                | Generate JSON report in DIR.\u003cbr\u003e\u003cbr\u003eIf the JSON report already exists, it will be updated with the new test results.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                           |\n| \u003ca href=\"#report-junit\" id=\"report-junit\"\u003e\u003ccode\u003e--report-junit \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                            | Generate JUnit File.\u003cbr\u003e\u003cbr\u003eIf the FILE report already exists, it will be updated with the new test results.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                   |\n| \u003ca href=\"#report-tap\" id=\"report-tap\"\u003e\u003ccode\u003e--report-tap \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                  | Generate TAP report.\u003cbr\u003e\u003cbr\u003eIf the FILE report already exists, it will be updated with the new test results.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                   |\n| \u003ca href=\"#resolve\" id=\"resolve\"\u003e\u003ccode\u003e--resolve \u0026lt;HOST:PORT:ADDR\u0026gt;\u003c/code\u003e\u003c/a\u003e                                 | Provide a custom address for a specific host and port pair. Using this, you can make the Hurl requests(s) use a specified address and prevent the otherwise normally resolved address to be used. Consider it a sort of /etc/hosts alternative provided on the command line.\u003cbr\u003e                                                                                                                                                     |\n| \u003ca href=\"#retry\" id=\"retry\"\u003e\u003ccode\u003e--retry \u0026lt;NUM\u0026gt;\u003c/code\u003e\u003c/a\u003e                                                  | Maximum number of retries, 0 for no retries, -1 for unlimited retries. Retry happens if any error occurs (asserts, captures, runtimes etc...).\u003cbr\u003e                                                                                                                                                                                                                                                                                   |\n| \u003ca href=\"#retry-interval\" id=\"retry-interval\"\u003e\u003ccode\u003e--retry-interval \u0026lt;MILLISECONDS\u0026gt;\u003c/code\u003e\u003c/a\u003e              | Duration in milliseconds between each retry. Default is 1000 ms.\u003cbr\u003e\u003cbr\u003eYou can specify time units in the retry interval expression. Set Hurl to use a retry interval of 2 seconds with `--retry-interval 2s` or set it to 500 milliseconds with `--retry-interval 500ms`. No spaces allowed.\u003cbr\u003e                                                                                                                                    |\n| \u003ca href=\"#secret\" id=\"secret\"\u003e\u003ccode\u003e--secret \u0026lt;NAME=VALUE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                        | Define secret value to be redacted from logs and report. When defined, secrets can be used as variable everywhere variables are used.\u003cbr\u003e                                                                                                                                                                                                                                                                                            |\n| \u003ca href=\"#ssl-no-revoke\" id=\"ssl-no-revoke\"\u003e\u003ccode\u003e--ssl-no-revoke\u003c/code\u003e\u003c/a\u003e                                      | (Windows) This option tells Hurl to disable certificate revocation checks. WARNING: this option loosens the SSL security, and by using this flag you ask for exactly that.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                     |\n| \u003ca href=\"#test\" id=\"test\"\u003e\u003ccode\u003e--test\u003c/code\u003e\u003c/a\u003e                                                                 | Activate test mode: with this, the HTTP response is not outputted anymore, progress is reported for each Hurl file tested, and a text summary is displayed when all files have been run.\u003cbr\u003e\u003cbr\u003eIn test mode, files are executed in parallel. To run test in a sequential way use `--job 1`.\u003cbr\u003e\u003cbr\u003eSee also [`--jobs`](#jobs).\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                |\n| \u003ca href=\"#to-entry\" id=\"to-entry\"\u003e\u003ccode\u003e--to-entry \u0026lt;ENTRY_NUMBER\u0026gt;\u003c/code\u003e\u003c/a\u003e                                | Execute Hurl file to ENTRY_NUMBER (starting at 1).\u003cbr\u003eIgnore the remaining of the file. It is useful for debugging a session.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                  |\n| \u003ca href=\"#unix-socket\" id=\"unix-socket\"\u003e\u003ccode\u003e--unix-socket \u0026lt;PATH\u0026gt;\u003c/code\u003e\u003c/a\u003e                               | (HTTP) Connect through this Unix domain socket, instead of using the network.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                    |\n| \u003ca href=\"#user\" id=\"user\"\u003e\u003ccode\u003e-u, --user \u0026lt;USER:PASSWORD\u0026gt;\u003c/code\u003e\u003c/a\u003e                                       | Add basic Authentication header to each request.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                                 |\n| \u003ca href=\"#user-agent\" id=\"user-agent\"\u003e\u003ccode\u003e-A, --user-agent \u0026lt;NAME\u0026gt;\u003c/code\u003e\u003c/a\u003e                              | Specify the User-Agent string to send to the HTTP server.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                      |\n| \u003ca href=\"#variable\" id=\"variable\"\u003e\u003ccode\u003e--variable \u0026lt;NAME=VALUE\u0026gt;\u003c/code\u003e\u003c/a\u003e                                  | Define variable (name/value) to be used in Hurl templates.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                       |\n| \u003ca href=\"#variables-file\" id=\"variables-file\"\u003e\u003ccode\u003e--variables-file \u0026lt;FILE\u0026gt;\u003c/code\u003e\u003c/a\u003e                      | Set properties file in which your define your variables.\u003cbr\u003e\u003cbr\u003eEach variable is defined as name=value exactly as with [`--variable`](#variable) option.\u003cbr\u003e\u003cbr\u003eNote that defining a variable twice produces an error.\u003cbr\u003e\u003cbr\u003eThis is a cli-only option.\u003cbr\u003e                                                                                                                                                                         |\n| \u003ca href=\"#verbose\" id=\"verbose\"\u003e\u003ccode\u003e-v, --verbose\u003c/code\u003e\u003c/a\u003e                                                    | Turn on verbose output on standard error stream.\u003cbr\u003eUseful for debugging.\u003cbr\u003e\u003cbr\u003eA line starting with '\u003e' means data sent by Hurl.\u003cbr\u003eA line staring with '\u003c' means data received by Hurl.\u003cbr\u003eA line starting with '*' means additional info provided by Hurl.\u003cbr\u003e\u003cbr\u003eIf you only want HTTP headers in the output, [`-i, --include`](#include) might be the option you're looking for.\u003cbr\u003e                                           |\n| \u003ca href=\"#very-verbose\" id=\"very-verbose\"\u003e\u003ccode\u003e--very-verbose\u003c/code\u003e\u003c/a\u003e                                         | Turn on more verbose output on standard error stream.\u003cbr\u003e\u003cbr\u003eIn contrast to  [`--verbose`](#verbose) option, this option outputs the full HTTP body request and response on standard error. In addition, lines starting with '**' are libcurl debug logs.\u003cbr\u003e                                                                                                                                                                        |\n| \u003ca href=\"#help\" id=\"help\"\u003e\u003ccode\u003e-h, --help\u003c/code\u003e\u003c/a\u003e                                                             | Usage help. This lists all current command line options with a short description.\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                |\n| \u003ca href=\"#version\" id=\"version\"\u003e\u003ccode\u003e-V, --version\u003c/code\u003e\u003c/a\u003e                                                    | Prints version information\u003cbr\u003e                                                                                                                                                                                                                                                                                                                                                                                                       |\n\n## Environment\n\nEnvironment variables can only be specified in lowercase.\n\nUsing an environment variable to set the proxy has the same effect as using the [`-x, --proxy`](#proxy) option.\n\n| Variable                                   | Description                                                                                                                                                      |\n|--------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `http_proxy [PROTOCOL://]\u003cHOST\u003e[:PORT]`    | Sets the proxy server to use for HTTP.\u003cbr\u003e                                                                                                                       |\n| `https_proxy [PROTOCOL://]\u003cHOST\u003e[:PORT]`   | Sets the proxy server to use for HTTPS.\u003cbr\u003e                                                                                                                      |\n| `all_proxy [PROTOCOL://]\u003cHOST\u003e[:PORT]`     | Sets the proxy server to use if no protocol-specific proxy is set.\u003cbr\u003e                                                                                           |\n| `no_proxy \u003ccomma-separated list of hosts\u003e` | List of host names that shouldn't go through any proxy.\u003cbr\u003e                                                                                                      |\n| `HURL_name value`                          | Define variable (name/value) to be used in Hurl templates. This is similar than [`--variable`](#variable) and [`--variables-file`](#variables-file) options.\u003cbr\u003e |\n| `NO_COLOR`                                 | When set to a non-empty string, do not colorize output (see [`--no-color`](#no-color) option).\u003cbr\u003e                                                               |\n\n## Exit Codes\n\n| Value | Description                                             |\n|-------|---------------------------------------------------------|\n| `0`   | Success.\u003cbr\u003e                                            |\n| `1`   | Failed to parse command-line options.\u003cbr\u003e               |\n| `2`   | Input File Parsing Error.\u003cbr\u003e                           |\n| `3`   | Runtime error (such as failure to connect to host).\u003cbr\u003e |\n| `4`   | Assert Error.\u003cbr\u003e                                       |\n\n## WWW\n\n[https://hurl.dev](https://hurl.dev)\n\n\n## See Also\n\ncurl(1)  hurlfmt(1)\n\n# Installation\n\n## Binaries Installation\n\n### Linux\n\nPrecompiled binary is available at [Hurl latest GitHub release]:\n\n```shell\n$ INSTALL_DIR=/tmp\n$ VERSION=6.0.0\n$ curl --silent --location https://github.com/Orange-OpenSource/hurl/releases/download/$VERSION/hurl-$VERSION-x86_64-unknown-linux-gnu.tar.gz | tar xvz -C $INSTALL_DIR\n$ export PATH=$INSTALL_DIR/hurl-$VERSION-x86_64-unknown-linux-gnu/bin:$PATH\n```\n\n#### Debian / Ubuntu\n\nFor Debian / Ubuntu, Hurl can be installed using a binary .deb file provided in each Hurl release.\n\n```shell\n$ VERSION=6.0.0\n$ curl --location --remote-name https://github.com/Orange-OpenSource/hurl/releases/download/$VERSION/hurl_${VERSION}_amd64.deb\n$ sudo apt update \u0026\u0026 sudo apt install ./hurl_${VERSION}_amd64.deb\n```\n\nFor Ubuntu (bionic, focal, jammy, noble), Hurl can be installed from `ppa:lepapareil/hurl`\n\n```shell\n$ VERSION=6.0.0\n$ sudo apt-add-repository -y ppa:lepapareil/hurl\n$ sudo apt install hurl=\"${VERSION}\"*\n```\n\n#### Alpine\n\nHurl is available on `testing` channel.\n\n```shell\n$ apk add --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing hurl\n```\n\n#### Arch Linux / Manjaro\n\nHurl is available on [extra] channel.\n\n```shell\n$ pacman -Sy hurl\n```\n\n#### NixOS / Nix\n\n[NixOS / Nix package] is available on stable channel.\n\n### macOS\n\nPrecompiled binaries for Intel and ARM CPUs are available at [Hurl latest GitHub release].\n\n#### Homebrew\n\n```shell\n$ brew install hurl\n```\n\n#### MacPorts\n\n```shell\n$ sudo port install hurl\n```\n\n### FreeBSD\n\n```shell\n$ sudo pkg install hurl\n```\n\n### Windows\n\nWindows requires the [Visual C++ Redistributable Package] to be installed manually, as this is not included in the installer.\n\n#### Zip File\n\nHurl can be installed from a standalone zip file at [Hurl latest GitHub release]. You will need to update your `PATH` variable.\n\n#### Installer\n\nAn executable installer is also available at [Hurl latest GitHub release].\n\n#### Chocolatey\n\n```shell\n$ choco install hurl\n```\n\n#### Scoop\n\n```shell\n$ scoop install hurl\n```\n\n#### Windows Package Manager\n\n```shell\n$ winget install hurl\n```\n\n### Cargo\n\nIf you're a Rust programmer, Hurl can be installed with cargo.\n\n```shell\n$ cargo install hurl\n```\n\n### conda-forge\n\n```shell\n$ conda install -c conda-forge hurl\n```\n\nHurl can also be installed with [`conda-forge`] powered package manager like [`pixi`].\n\n### Docker\n\n```shell\n$ docker pull ghcr.io/orange-opensource/hurl:latest\n```\n\n### npm\n\n```shell\n$ npm install --save-dev @orangeopensource/hurl\n```\n\n## Building From Sources\n\nHurl sources are available in [GitHub].\n\n### Build on Linux\n\nHurl depends on libssl, libcurl and libxml2 native libraries. You will need their development files in your platform.\n\n#### Debian based distributions\n\n```shell\n$ apt install -y build-essential pkg-config libssl-dev libcurl4-openssl-dev libxml2-dev\n```\n\n#### Fedora based distributions\n\n```shell\n$ dnf install -y pkgconf-pkg-config gcc openssl-devel libxml2-devel\n```\n\n#### Red Hat based distributions\n\n```shell\n$ yum install -y pkg-config gcc openssl-devel libxml2-devel\n```\n\n#### Arch based distributions\n\n```shell\n$ pacman -S --noconfirm pkgconf gcc glibc openssl libxml2\n```\n\n#### Alpine based distributions\n\n```shell\n$ apk add curl-dev gcc libxml2-dev musl-dev openssl-dev\n```\n\n### Build on macOS\n\n```shell\n$ xcode-select --install\n$ brew install pkg-config\n```\n\nHurl is written in [Rust]. You should [install] the latest stable release.\n\n```shell\n$ curl https://sh.rustup.rs -sSf | sh -s -- -y\n$ source $HOME/.cargo/env\n$ rustc --version\n$ cargo --version\n```\n\nThen build hurl:\n\n```shell\n$ git clone https://github.com/Orange-OpenSource/hurl\n$ cd hurl\n$ cargo build --release\n$ ./target/release/hurl --version\n```\n\n### Build on Windows\n\nPlease follow the [contrib on Windows section].\n\n[XPath]: https://en.wikipedia.org/wiki/XPath\n[JSONPath]: https://goessner.net/articles/JsonPath/\n[Rust]: https://www.rust-lang.org\n[curl]: https://curl.se\n[the installation section]: https://hurl.dev/docs/installation.html\n[Feedback, suggestion, bugs or improvements]: https://github.com/Orange-OpenSource/hurl/issues\n[License]: https://hurl.dev/docs/license.html\n[Tutorial]: https://hurl.dev/docs/tutorial/your-first-hurl-file.html\n[Documentation]: https://hurl.dev/docs/installation.html\n[Blog]: https://hurl.dev/blog/\n[GitHub]: https://github.com/Orange-OpenSource/hurl\n[libcurl]: https://curl.se/libcurl/\n[star Hurl on GitHub]: https://github.com/Orange-OpenSource/hurl/stargazers\n[HTML]: /docs/standalone/hurl-6.0.0.html\n[PDF]: /docs/standalone/hurl-6.0.0.pdf\n[Markdown]: /docs/standalone/hurl-6.0.0.md\n[JSON body]: https://hurl.dev/docs/request.html#json-body\n[XML body]: https://hurl.dev/docs/request.html#xml-body\n[XML multiline string body]: https://hurl.dev/docs/request.html#multiline-string-body\n[multiline string body]: https://hurl.dev/docs/request.html#multiline-string-body\n[predicates]: https://hurl.dev/docs/asserting-response.html#predicates\n[JSONPath]: https://goessner.net/articles/JsonPath/\n[Basic authentication]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#basic_authentication_scheme\n[`Authorization` header]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization\n[Hurl tests suite]: https://github.com/Orange-OpenSource/hurl/tree/master/integration/hurl/tests_ok\n[Authorization]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization\n[`-u/--user` option]: https://hurl.dev/docs/manual.html#user\n[curl]: https://curl.se\n[entry]: https://hurl.dev/docs/entry.html\n[`--test` option]: https://hurl.dev/docs/manual.html#test\n[`--user`]: https://hurl.dev/docs/manual.html#user\n[Hurl templates]: https://hurl.dev/docs/templates.html\n[AWS Signature Version 4]: https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html\n[Captures]: https://hurl.dev/docs/capturing-response.html\n[`--json` option]: https://hurl.dev/docs/manual.html#json\n[`--resolve`]: https://hurl.dev/docs/manual.html#resolve\n[`--connect-to`]: https://hurl.dev/docs/manual.html#connect-to\n[Functions]: https://hurl.dev/docs/templates.html#functions\n[GitHub]: https://github.com/Orange-OpenSource/hurl\n[Hurl latest GitHub release]: https://github.com/Orange-OpenSource/hurl/releases/latest\n[Visual C++ Redistributable Package]: https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-microsoft-visual-c-redistributable-version\n[install]: https://www.rust-lang.org/tools/install\n[Rust]: https://www.rust-lang.org\n[contrib on Windows section]: https://github.com/Orange-OpenSource/hurl/blob/master/contrib/windows/README.md\n[NixOS / Nix package]: https://search.nixos.org/packages?from=0\u0026size=1\u0026sort=relevance\u0026type=packages\u0026query=hurl\n[`conda-forge`]: https://conda-forge.org\n[`pixi`]: https://prefix.dev\n[extra]: https://archlinux.org/packages/extra/x86_64/hurl/\n\n","funding_links":[],"categories":["Rust","Libraries","cli","库 Libraries","\u003ca name=\"http\"\u003e\u003c/a\u003ehttp","Projects","Weapons","HarmonyOS","testing","Automated API Testing \u0026 Load Testing Tools","命令行工具","Don't forget to give a :star: to make the project popular","Dev-Utilities","API Clients","Programming","\u003ca name=\"Rust\"\u003e\u003c/a\u003eRust"],"sub_categories":["Network programming","网络编程 Network programming","Tools","Windows Manager","41. [Hurl](https://hurl.dev/)","Open Source","Test Helpers","API Testing"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOrange-OpenSource%2Fhurl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOrange-OpenSource%2Fhurl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOrange-OpenSource%2Fhurl/lists"}