[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-5413":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":16,"starSnapshotCount":16,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},5413,"hurl","Orange-OpenSource\u002Fhurl","Orange-OpenSource","Hurl, run and test HTTP requests with plain text.","https:\u002F\u002Fhurl.dev",null,"Rust",18999,729,53,197,0,3,16,102,12,43.59,"Apache License 2.0",false,"master",true,[27,28,29,30,31,32,33,34],"api-testing","cli","curl","http","http-client","integration-testing","testing","testing-tools","2026-06-12 02:01:09","\u003Cpicture>\n    \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"\u002Fdocs\u002Fassets\u002Fimg\u002Flogo-light.svg?sanitize=true\" > \n    \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"\u002Fdocs\u002Fassets\u002Fimg\u002Flogo-dark.svg?sanitize=true\" > \n    \u003Cimg src=\"\u002Fdocs\u002Fassets\u002Fimg\u002Flogo-light.svg?sanitize=true\" width=\"264px\" alt=\"Hurl Logo\">\n\u003C\u002Fpicture>\n\n[![deploy status](https:\u002F\u002Fgithub.com\u002FOrange-OpenSource\u002Fhurl\u002Fworkflows\u002Ftest\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002FOrange-OpenSource\u002Fhurl\u002Factions)\n[![coverage](https:\u002F\u002FOrange-OpenSource.github.io\u002Fhurl\u002Fcoverage\u002Fbadges\u002Fflat.svg)](https:\u002F\u002FOrange-OpenSource.github.io\u002Fhurl\u002Fcoverage)\n[![Crates.io](https:\u002F\u002Fimg.shields.io\u002Fcrates\u002Fv\u002Fhurl.svg)](https:\u002F\u002Fcrates.io\u002Fcrates\u002Fhurl)\n[![documentation](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-documentation-ff0288)](https:\u002F\u002Fhurl.dev)\n\n# What's Hurl?\n\nHurl is a command line tool that runs \u003Cb>HTTP requests\u003C\u002Fb> defined in a simple \u003Cb>plain text format\u003C\u002Fb>.\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>fetching data\u003C\u002Fb> and \u003Cb>testing HTTP\u003C\u002Fb> sessions.\n\nHurl makes it easy to work with \u003Cb>HTML\u003C\u002Fb> content, \u003Cb>REST \u002F SOAP \u002F GraphQL\u003C\u002Fb> APIs, or any other \u003Cb>XML \u002F JSON\u003C\u002Fb> based APIs. \n\n```hurl\n# Go home and capture token\nGET https:\u002F\u002Fexample.org\nHTTP 200\n[Captures]\ncsrf_token: xpath \"string(\u002F\u002Fmeta[@name='_csrf_token']\u002F@content)\"\n\n\n# Do login!\nPOST https:\u002F\u002Fexample.org\u002Flogin\n[Form]\nuser: toto\npassword: 1234\ntoken: {{csrf_token}}\nHTTP 302\n```\n\nChaining multiple requests is easy:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fapi\u002Fhealth\nGET https:\u002F\u002Fexample.org\u002Fapi\u002Fstep1\nGET https:\u002F\u002Fexample.org\u002Fapi\u002Fstep2\nGET https:\u002F\u002Fexample.org\u002Fapi\u002Fstep3\n```\n\n# Also an HTTP Test Tool\n\nHurl can run HTTP requests but can also be used to \u003Cb>test HTTP responses\u003C\u002Fb>.\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:\u002F\u002Fhurl.dev\u002Fplayer.html?id=starwars&speed=3\">\u003Cimg src=\"\u002Fdocs\u002Fassets\u002Fimg\u002Fposter-starwars.png\" width=\"100%\" alt=\"Hurl Demo\"\u002F>\u003C\u002Fa>\n\n\nIt is well adapted for \u003Cb>REST \u002F JSON APIs\u003C\u002Fb>\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002Fapi\u002Ftests\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 \u002F\\d{4}\u002F     # Check the format of the id\n```\n\n\u003Cb>HTML content\u003C\u002Fb>\n\n```hurl\nGET https:\u002F\u002Fexample.org\nHTTP 200\n[Asserts]\nxpath \"normalize-space(\u002F\u002Fhead\u002Ftitle)\" == \"Hello world!\"\n```\n\n\u003Cb>GraphQL\u003C\u002Fb> \n\n~~~hurl\nPOST https:\u002F\u002Fexample.org\u002Fgraphql\n```graphql\n{\n  human(id: \"1000\") {\n    name\n    height(unit: FOOT)\n  }\n}\n```\nHTTP 200\n~~~\n\nand even \u003Cb>SOAP APIs\u003C\u002Fb>\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002FInStock\nContent-Type: application\u002Fsoap+xml; charset=utf-8\nSOAPAction: \"http:\u002F\u002Fwww.w3.org\u002F2003\u002F05\u002Fsoap-envelope\"\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Csoap:Envelope xmlns:soap=\"http:\u002F\u002Fwww.w3.org\u002F2003\u002F05\u002Fsoap-envelope\" xmlns:m=\"https:\u002F\u002Fexample.org\">\n  \u003Csoap:Header>\u003C\u002Fsoap:Header>\n  \u003Csoap:Body>\n    \u003Cm:GetStockPrice>\n      \u003Cm:StockName>GOOG\u003C\u002Fm:StockName>\n    \u003C\u002Fm:GetStockPrice>\n  \u003C\u002Fsoap:Body>\n\u003C\u002Fsoap:Envelope>\nHTTP 200\n```\n\nHurl can also be used to test the \u003Cb>performance\u003C\u002Fb> of HTTP endpoints\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fapi\u002Fv1\u002Fpets\nHTTP 200\n[Asserts]\nduration \u003C 1000  # Duration in ms\n```\n\nAnd check response bytes\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fdata.tar.gz\nHTTP 200\n[Asserts]\nsha256 == hex,039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81;\n```\n\nFinally, Hurl is easy to \u003Cb>integrate in CI\u002FCD\u003C\u002Fb>, with text, JUnit, TAP and HTML reports\n\n\u003Cpicture>\n    \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"\u002Fdocs\u002Fassets\u002Fimg\u002Fhome-waterfall-light.png\">\n    \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"\u002Fdocs\u002Fassets\u002Fimg\u002Fhome-waterfall-dark.png\">\n    \u003Cimg src=\"\u002Fdocs\u002Fassets\u002Fimg\u002Fhome-waterfall-light.png\" width=\"480\" alt=\"HTML report\"\u002F>\n\u003C\u002Fpicture>\n\n# Why Hurl?\n\n\u003Cul class=\"showcase-container\">\n    \u003Cli>\u003Cb>Text Format:\u003C\u002Fb> for both devops and developers\u003C\u002Fli>\n    \u003Cli>\u003Cb>Fast CLI:\u003C\u002Fb> a command line for local dev and continuous integration\u003C\u002Fli>\n    \u003Cli>\u003Cb>Single Binary:\u003C\u002Fb> easy to install, with no runtime required\u003C\u002Fli>\n\u003C\u002Ful>\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 __IPv6 \u002F HTTP\u002F3 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:\u002F\u002Fhurl.dev\u002Fapi\u002Ffeedback\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        * [Testing Redirections](#testing-redirections)\n    * [Debug Tips](#debug-tips)\n        * [Verbose Mode](#verbose-mode)\n        * [Error Format](#error-format)\n        * [Output Response Body](#output-response-body)\n        * [Export curl Commands](#export-curl-commands)\n        * [Using Proxy](#using-proxy)\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        * [IP Address](#ip-address)\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    * [Configuration](#configuration)\n    * [All Options](#all-options)\n        * [HTTP options](#http-options)\n        * [Output options](#output-options)\n        * [Run options](#run-options)\n        * [Report options](#report-options)\n        * [Other options](#other-options)\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 \u002F Ubuntu](#debian--ubuntu)\n            * [Alpine](#alpine)\n            * [Arch Linux \u002F Manjaro](#arch-linux--manjaro)\n            * [NixOS \u002F 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:\u002F\u002Fexample.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:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#options):\n\n```hurl\nGET https:\u002F\u002Fexample.ord\u002Fcats\u002F123\n[Options]\noutput: cat123.txt    # use - to output to stdout\nHTTP 200\n\nGET https:\u002F\u002Fexample.ord\u002Fdogs\u002F567\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\u002F*.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:\u002F\u002Fexample.org\n```\n\nRequests can be chained:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fa\nGET https:\u002F\u002Fexample.org\u002Fb\nHEAD https:\u002F\u002Fexample.org\u002Fc\nGET https:\u002F\u002Fexample.org\u002Fc\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#method)\n\n### HTTP Headers\n\nA simple GET with headers:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fnews\nUser-Agent: Mozilla\u002F5.0 \nAccept: *\u002F*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nConnection: keep-alive\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#headers)\n\n### Query Params\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fnews\n[Query]\norder: newest\nsearch: something to search\ncount: 100\n```\n\nOr:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fnews?order=newest&search=something%20to%20search&count=100\n```\n\n> With `[Query]` section, params don't need to be URL escaped.\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#query-parameters)\n\n### Basic Authentication\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fprotected\n[BasicAuth]\nbob: secret\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.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:\u002F\u002Fexample.org\u002Fprotected\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\u002F--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:\u002F\u002Fexample.org\u002Flogin\n[Options]\nuser: bob:secret\nHTTP 200\n\nGET https:\u002F\u002Fexample.org\u002Flogin\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:\u002F\u002Fsample.org\u002Forders\nHTTP 201\n[Captures]\norder_id: jsonpath \"$.order.id\"\n\nGET https:\u002F\u002Fsample.org\u002Forders\u002F{{order_id}}\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fcapturing-response.html)\n\n## Sending Data\n\n### Sending HTML Form Data\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002Fcontact\n[Form]\ndefault: false\ntoken: {{token}}\nemail: john.doe@rookie.org\nnumber: 33611223344\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#form-parameters)\n\n### Sending Multipart Form Data\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002Fupload\n[Multipart]\nfield1: value1\nfield2: file,example.txt;\n# One can specify the file content type:\nfield3: file,example.zip; application\u002Fzip\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#multipart-form-data)\n\nMultipart forms can also be sent with a [multiline string body]:\n\n~~~hurl\nPOST https:\u002F\u002Fexample.org\u002Fupload\nContent-Type: multipart\u002Fform-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\u002Fplain\n\nHello World!\n--boundary\nContent-Disposition: form-data; name=\"upload2\"; filename=\"data.html\"\nContent-Type: text\u002Fhtml\n\n\u003Cdiv>Hello \u003Cb>World\u003C\u002Fb>!\u003C\u002Fdiv>\n--boundary--\n```\n~~~\n\nIn that case, files have to be inlined in the Hurl file.\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#multiline-string-body)\n\n### Posting a JSON Body\n\nWith an inline JSON:\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002Fapi\u002Ftests\n{\n    \"id\": \"456\",\n    \"evaluate\": true\n}\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#json-body)\n\nWith a local file:\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002Fapi\u002Ftests\nContent-Type: application\u002Fjson\nfile,data.json;\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#file-body)\n\n### Templating a JSON Body\n\n```hurl\nPUT https:\u002F\u002Fexample.org\u002Fapi\u002Fhits\nContent-Type: application\u002Fjson\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:\u002F\u002Fhurl.dev\u002Fdocs\u002Ftemplates.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:\u002F\u002Fexample.org\u002Fecho\u002Fpost\u002Fxml\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CRequest>\n    \u003CLogin>{{login}}\u003C\u002FLogin>\n    \u003CPassword>{{password}}\u003C\u002FPassword>\n\u003C\u002FRequest>\n```\n~~~\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#multiline-string-body)\n\n### Using GraphQL Query\n\nA simple GraphQL query:\n\n~~~hurl\nPOST https:\u002F\u002Fexample.org\u002Fstarwars\u002Fgraphql\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:\u002F\u002Fexample.org\u002Fstarwars\u002Fgraphql\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:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.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:\u002F\u002Fexample.org\u002Fapi\u002Ffoo\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:\u002F\u002Fexample.org\u002Fapi\u002Ffoo\n[Query]\ndate: {{newDate}}\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Ftemplates.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:\u002F\u002Ffoo.com\n\n# A status code check:\nGET https:\u002F\u002Ffoo.com\nHTTP 200\n\n# A test on response body\nGET https:\u002F\u002Ffoo.com\nHTTP 200\n[Asserts]\njsonpath \"$.state\" == \"running\"\n```\n\n### Testing Status Code\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Forder\u002F435\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#version-status)\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Forder\u002F435\n# Testing status code is in a 200-300 range\nHTTP *\n[Asserts]\nstatus >= 200\nstatus \u003C 300\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#status-assert)\n\n### Testing Response Headers\n\nUse implicit response asserts to test header values:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Findex.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:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#headers)\n\n\nOr use explicit response asserts with [predicates]:\n\n```hurl\nGET https:\u002F\u002Fexample.org\nHTTP 302\n[Asserts]\nheader \"Location\" contains \"www.example.net\"\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#header-assert)\n\nImplicit and explicit asserts can be combined:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Findex.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:\u002F\u002Fexample.org\u002Forder\nscreencapability: low\nHTTP 200\n[Asserts]\njsonpath \"$.validated\" == true\njsonpath \"$.userInfo\" isObject\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 \u002F^order-\\d{8}$\u002F  # Alternative syntax with regex literal\njsonpath \"$.id\" matches \u002F(?i)[a-z]*\u002F        # See syntax for flags \u003Chttps:\u002F\u002Fdocs.rs\u002Fregex\u002Flatest\u002Fregex\u002F#grouping-and-flags>\njsonpath \"$.created\" isIsoDate\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#jsonpath-assert)\n\n### Testing HTML Response\n\n```hurl\nGET https:\u002F\u002Fexample.org\nHTTP 200\nContent-Type: text\u002Fhtml; charset=UTF-8\n[Asserts]\nxpath \"string(\u002Fhtml\u002Fhead\u002Ftitle)\" contains \"Example\" # Check title\nxpath \"count(\u002F\u002Fp)\" == 2  # Check the number of p\nxpath \"\u002F\u002Fp\" count == 2  # Similar assert for p\nxpath \"boolean(count(\u002F\u002Fh2))\" == false  # Check there is no h2  \nxpath \"\u002F\u002Fh2\" not exists  # Similar assert for h2\nxpath \"string(\u002F\u002Fdiv[1])\" matches \u002FHello.*\u002F\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#xpath-assert)\n\n### Testing Set-Cookie Attributes\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fhome\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:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#cookie-assert)\n\n### Testing Bytes Content\n\nCheck the SHA-256 response body hash:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fdata.tar.gz\nHTTP 200\n[Asserts]\nsha256 == hex,039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81;\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#sha-256-assert)\n\n### SSL Certificate\n\nCheck the properties of a SSL certificate:\n\n```hurl\nGET https:\u002F\u002Fexample.org\nHTTP 200\n[Asserts]\ncertificate \"Subject\" == \"CN=example.org\"\ncertificate \"Issuer\" == \"C=US, O=Let's Encrypt, CN=R3\"\ncertificate \"Expire-Date\" daysAfterNow > 15\ncertificate \"Serial-Number\" matches \u002F[\\da-f]+\u002F\ncertificate \"Subject-Alt-Name\" contains \"DNS:example.org\"\ncertificate \"Subject-Alt-Name\" split \",\" count == 2\ncertificate \"Value\" startsWith \"-----BEGIN CERTIFICATE-----\"\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-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:\u002F\u002Fexample.org\u002Fapi\u002Fcats\u002F123\nHTTP 200\n{\n  \"name\" : \"Purrsloud\",\n  \"species\" : \"Cat\",\n  \"favFoods\" : [\"wet food\", \"dry food\", \"\u003Cstrong>any\u003C\u002Fstrong> food\"],\n  \"birthYear\" : 2016,\n  \"photo\" : \"https:\u002F\u002Flearnwebcode.github.io\u002Fjson-example\u002Fimages\u002Fcat-2.jpg\"\n}\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#json-body)\n\nOr an explicit assert file:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Findex.html\nHTTP 200\n[Asserts]\nbody == file,cat.json;\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#body-assert)\n\nImplicit asserts supports XML body:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fapi\u002Fcatalog\nHTTP 200\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Ccatalog>\n   \u003Cbook id=\"bk101\">\n      \u003Cauthor>Gambardella, Matthew\u003C\u002Fauthor>\n      \u003Ctitle>XML Developer's Guide\u003C\u002Ftitle>\n      \u003Cgenre>Computer\u003C\u002Fgenre>\n      \u003Cprice>44.95\u003C\u002Fprice>\n      \u003Cpublish_date>2000-10-01\u003C\u002Fpublish_date>\n      \u003Cdescription>An in-depth look at creating applications with XML.\u003C\u002Fdescription>\n   \u003C\u002Fbook>\n\u003C\u002Fcatalog>\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#xml-body)\n\nPlain text:\n\n~~~hurl\nGET https:\u002F\u002Fexample.org\u002Fmodels\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:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#multiline-string-body)\n\n\nOne line:\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002Fhelloworld\nHTTP 200\n`Hello world!`\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#oneline-string-body)\n\nFile:\n\n```hurl\nGET https:\u002F\u002Fexample.org\nHTTP 200\nfile,data.bin;\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#file-body)\n\n### Testing Redirections\n\nBy default, Hurl doesn't follow redirection so each step of a redirect must be run manually and can be analysed:\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fstep1\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https:\u002F\u002Fexample.org\u002Fstep2\"\n\n\nGET https:\u002F\u002Fexample.org\u002Fstep2\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https:\u002F\u002Fexample.org\u002Fstep3\"\n\n\nGET https:\u002F\u002Fexample.org\u002Fstep3\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html)\n\nUsing [`--location`] and [`--location-trusted`] (either with command line option or per request), Hurl follows \nredirection and each step of the redirection can be checked.\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fstep1\n[Options]\nlocation: true\nHTTP 200\n[Asserts]\nredirects count == 2\nredirects nth 0 location == \"https:\u002F\u002Fexample.org\u002Fstep2\"\nredirects nth 1 location == \"https:\u002F\u002Fexample.org\u002Fstep3\"\n```\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fstep1\n[Options]\nlocation-trusted: true\nHTTP 200\n[Asserts]\nredirects last location == \"https:\u002F\u002Fexample.org\u002Fstep2\"\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#redirects-assert)\n\n## Debug Tips\n\n### Verbose Mode\n\nTo get more info on a given request\u002Fresponse, use [`[Options]` section](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#options):\n\n```hurl\nGET https:\u002F\u002Fexample.org\nHTTP 200\n\nGET https:\u002F\u002Fexample.org\u002Fapi\u002Fcats\u002F123\n[Options]\nvery-verbose: true\nHTTP 200\n```\n\n`--verbose` and `--very-verbose` can be also used globally as command line options.\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fmanual.html#very-verbose)\n\n### Error Format\n\n```shell\n$ hurl --test --error-format long *.hurl\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fmanual.html#error-format)\n\n### Output Response Body\n\nUse `--output` on a specific request to get the response body (`-` can be used as standard output):\n\n```hurl\nGET https:\u002F\u002Ffoo.com\u002Ffailure\n[Options]\n# use - to output on standard output, foo.bin to save on disk \noutput: -\nHTTP 200\n\nGET https:\u002F\u002Ffoo.com\u002Fsuccess\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fmanual.html#output)\n\n### Export curl Commands\n\n```shell\n$ hurl ---curl \u002Ftmp\u002Fcurl.txt *.hurl\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fmanual.html#curl)\n\n### Using Proxy\n\nUse `--proxy` on a specific request or globally as command line option:\n\n```hurl\nGET https:\u002F\u002Ffoo.com\u002Fa\nHTTP 200\n\nGET https:\u002F\u002Ffoo.com\u002Fb\n[Options]\nproxy: localhost:8888\nHTTP 200\n\nGET https:\u002F\u002Ffoo.com\u002Fc\nHTTP 200\n```\n\n## Reports\n\n### HTML Report\n\n```shell\n$ hurl --test --report-html build\u002Freport\u002F *.hurl\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frunning-tests.html#generating-report)\n\n### JSON Report\n\n```shell\n$ hurl --test --report-json build\u002Freport\u002F *.hurl\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frunning-tests.html#generating-report)\n\n### JUnit Report\n\n```shell\n$ hurl --test --report-junit build\u002Freport.xml *.hurl\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frunning-tests.html#generating-report)\n\n### TAP Report\n\n```shell\n$ hurl --test --report-tap build\u002Freport.txt *.hurl\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frunning-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\u002F1.0, HTTP\u002F1.1, HTTP\u002F2 or HTTP\u002F3) can be done using implicit asserts:\n\n```hurl\nGET https:\u002F\u002Ffoo.com\nHTTP\u002F3 200\n\nGET https:\u002F\u002Fbar.com\nHTTP\u002F2 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#version-status)\n\nOr explicit:\n\n```hurl\nGET https:\u002F\u002Ffoo.com\nHTTP 200\n[Asserts]\nversion == \"3\"\n\nGET https:\u002F\u002Fbar.com\nHTTP 200\n[Asserts]\nversion == \"2\"\nversion toFloat > 1.1\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#version-assert)\n\n### IP Address\n\nTesting the IP address of the response, as a string. This string may be IPv6 address:\n\n```hurl\nGET https:\u002F\u002Ffoo.com\nHTTP 200\n[Asserts]\nip == \"2001:0db8:85a3:0000:0000:8a2e:0370:733\"\nip startsWith \"2001\"\nip isIpv6\n```\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:\u002F\u002Fapi.example.org\u002Fjobs\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:\u002F\u002Fapi.example.org\u002Fjobs\u002F{{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:\u002F\u002Fhurl.dev\u002Fdocs\u002Fentry.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:\u002F\u002Fexample.org\u002Fturtle\n[Options]\ndelay: 5s\nHTTP 200\n\n# No delay!\nGET https:\u002F\u002Fexample.org\u002Fturtle\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fmanual.html#delay)\n\n### Skipping Requests\n\n```hurl\n# a, c, d are run, b is skipped\nGET https:\u002F\u002Fexample.org\u002Fa\n\nGET https:\u002F\u002Fexample.org\u002Fb\n[Options]\nskip: true\n\nGET https:\u002F\u002Fexample.org\u002Fc\n\nGET https:\u002F\u002Fexample.org\u002Fd\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fmanual.html#skip)\n\n### Testing Endpoint Performance\n\n```hurl\nGET https:\u002F\u002Fsample.org\u002Fhelloworld\nHTTP *\n[Asserts]\nduration \u003C 1000   # Check that response time is less than one second\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html#duration-assert)\n\n### Using SOAP APIs\n\n```hurl\nPOST https:\u002F\u002Fexample.org\u002FInStock\nContent-Type: application\u002Fsoap+xml; charset=utf-8\nSOAPAction: \"http:\u002F\u002Fwww.w3.org\u002F2003\u002F05\u002Fsoap-envelope\"\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Csoap:Envelope xmlns:soap=\"http:\u002F\u002Fwww.w3.org\u002F2003\u002F05\u002Fsoap-envelope\" xmlns:m=\"https:\u002F\u002Fexample.org\">\n  \u003Csoap:Header>\u003C\u002Fsoap:Header>\n  \u003Csoap:Body>\n    \u003Cm:GetStockPrice>\n      \u003Cm:StockName>GOOG\u003C\u002Fm:StockName>\n    \u003C\u002Fm:GetStockPrice>\n  \u003C\u002Fsoap:Body>\n\u003C\u002Fsoap:Envelope>\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#xml-body)\n\n### Capturing and Using a CSRF Token\n\n```hurl\nGET https:\u002F\u002Fexample.org\nHTTP 200\n[Captures]\ncsrf_token: xpath \"string(\u002F\u002Fmeta[@name='_csrf_token']\u002F@content)\"\n\n\nPOST https:\u002F\u002Fexample.org\u002Flogin?user=toto&password=1234\nX-CSRF-TOKEN: {{csrf_token}}\nHTTP 302\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fcapturing-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:\u002F\u002Fexample.org\nX-Token: {{token}}\n{\n  \"name\": \"Alice\",\n  \"value\": 100\n}\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Ftemplates.html#secrets)\n\nUsing `redact` for dynamic values:\n\n```hurl\n# Get an authorization token:\nGET https:\u002F\u002Fexample.org\u002Ftoken\nHTTP 200\n[Captures]\ntoken: header \"X-Token\" redact\n\n# Send an authorized request:\nPOST https:\u002F\u002Fexample.org\nX-Token: {{token}}\n{\n  \"name\": \"Alice\",\n  \"value\": 100\n}\nHTTP 200\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fcapturing-response.html#redacting-secrets)\n\n### Checking Byte Order Mark (BOM) in Response Body\n\n```hurl\nGET https:\u002F\u002Fexample.org\u002Fdata.bin\nHTTP 200\n[Asserts]\nbytes startsWith hex,efbbbf;\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-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:\u002F\u002Fsts.eu-central-1.amazonaws.com\u002F\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:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#options) section:\n\n```hurl\nPOST https:\u002F\u002Fsts.eu-central-1.amazonaws.com\u002F\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:\u002F\u002Fhurl.dev\u002Fdocs\u002Fmanual.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:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#options) to configure a specific request:\n\n```hurl\nGET http:\u002F\u002Fbar.com\nHTTP 200\n\n\nGET http:\u002F\u002Ffoo.com:8000\u002Fresolve\n[Options]\nresolve: foo.com:8000:127.0.0.1\nHTTP 200\n`Hello World!`\n```\n\n[Doc](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Frequest.html#options)\n\n\n# Manual\n\n## Name\n\nhurl - run and test HTTP requests.\n\n## Synopsis\n\n**hurl** [OPTIONS] [FILES...]\n\n**hurl** --test [OPTIONS] [FILES...]\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 \u002F SOAP \u002F GraphQL APIs, or any other XML \u002F 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:\u002F\u002Fhttpbin.org\u002Fget | hurl\n    {\n      \"args\": {},\n      \"headers\": {\n        \"Accept\": \"*\u002F*\",\n        \"Accept-Encoding\": \"gzip\",\n        \"Content-Length\": \"0\",\n        \"Host\": \"httpbin.org\",\n        \"User-Agent\": \"hurl\u002F0.99.10\",\n        \"X-Amzn-Trace-Id\": \"Root=1-5eedf4c7-520814d64e2f9249ea44e0\"\n      },\n      \"origin\": \"1.2.3.4\",\n      \"url\": \"http:\u002F\u002Fhttpbin.org\u002Fget\"\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:\u002F\u002Fhurl.dev\u002Fdocs\u002Fhurl-file.html](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fhurl-file.html)\n\nIt consists of one or several HTTP requests\n\n```hurl\nGET http:\u002F\u002Fexample.org\u002Fendpoint1\nGET http:\u002F\u002Fexample.org\u002Fendpoint2\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:\u002F\u002Fexample.org\nHTTP 200\n# Capture the CSRF token value from html body.\n[Captures]\ncsrf_token: xpath \"normalize-space(\u002F\u002Fmeta[@name='_csrf_token']\u002F@content)\"\n\n# Do the login !\nPOST https:\u002F\u002Fexample.org\u002Flogin?user=toto&password=1234\nX-CSRF-TOKEN: {{csrf_token}}\n```\n\nMore information on captures can be found here [https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fcapturing-response.html](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fcapturing-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:\u002F\u002Fexample.org\nHTTP 301\n```\n\nIt can also include asserts on the response headers\n\n```hurl\nGET http:\u002F\u002Fexample.org\nHTTP 301\nLocation: http:\u002F\u002Fwww.example.org\n```\n\nExplicit asserts can be included by combining a query and a predicate\n\n```hurl\nGET http:\u002F\u002Fexample.org\nHTTP 301\n[Asserts]\nxpath \"string(\u002F\u002Ftitle)\" == \"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:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html](https:\u002F\u002Fhurl.dev\u002Fdocs\u002Fasserting-response.html)\n\n## Configuration\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:\u002F\u002Fexample.org\nHTTP 301\n\nGET https:\u002F\u002Fexample.org\n[Options]\nlocation: true\nHTTP 200\n```\n\nwill follow a redirection only for the second entry.\n\nMost of the options can also be defined with environment variables (like `HURL_INSECURE` for [`--insecure`](#insecure)). So, in order\nto configure Hurl, there are three sources from the lowest priority (most easily overridden) to highest (overrides all others):\n\n- Environment variables (ex: `HURL_INSECURE`)\n- Command-line options (ex: `--insecure`)\n- Options section options (ex: `insecure: true` in file)\n\n## All Options\n\n### HTTP options\n\n| Option                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                   |\n|-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| \u003Ca href=\"#aws-sigv4\" id=\"aws-sigv4\">\u003Ccode>--aws-sigv4 &lt;PROVIDER1[:PROVIDER2[:REGION[:SERVICE]]]&gt;\u003C\u002Fcode>\u003C\u002Fa> | Generate an `Authorization` header with an AWS SigV4 signature.\u003Cbr>\u003Cbr>Use [`-u, --user`](#user) to specify Access Key Id (username) and Secret Key (password).\u003Cbr>\u003Cbr>To use temporary session credentials (e.g. for an AWS IAM Role), add the `X-Amz-Security-Token` header containing the session token.\u003Cbr>                                                                                                               |\n| \u003Ca href=\"#cacert\" id=\"cacert\">\u003Ccode>--cacert &lt;FILE&gt;\u003C\u002Fcode>\u003C\u002Fa>                                              | Specifies the certificate file for peer verification. The file may contain multiple CA certificates and must be in PEM format.\u003Cbr>Normally Hurl is built to use a default file for this, so this option is typically used to alter that default file.\u003Cbr>                                                                                                                                                                     |\n| \u003Ca href=\"#cert\" id=\"cert\">\u003Ccode>-E, --cert &lt;CERTIFICATE[:PASSWORD]&gt;\u003C\u002Fcode>\u003C\u002Fa>                              | Client certificate file and password.\u003Cbr>\u003Cbr>See also [`--key`](#key).\u003Cbr>                                                                                                                                                                                                                                                                                                                                                    |\n| \u003Ca href=\"#compressed\" id=\"compressed\">\u003Ccode>--compressed\u003C\u002Fcode>\u003C\u002Fa>                                               | Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.\u003Cbr>\u003Cbr>Environment variables: HURL_COMPRESSED\u003Cbr>                                                                                                                                                                                                                                                       |\n| \u003Ca href=\"#connect-timeout\" id=\"connect-timeout\">\u003Ccode>--connect-timeout &lt;SECONDS&gt;\u003C\u002Fcode>\u003C\u002Fa>                | Maximum time in seconds that you allow Hurl's connection to take.\u003Cbr>\u003Cbr>You 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>\u003Cbr>See also [`-m, --max-time`](#max-time).\u003Cbr>\u003Cbr>Environment variables: HURL_CONNECT_TIMEOUT\u003Cbr>               |\n| \u003Ca href=\"#connect-to\" id=\"connect-to\">\u003Ccode>--connect-to &lt;HOST1:PORT1:HOST2:PORT2&gt;\u003C\u002Fcode>\u003C\u002Fa>               | 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>\u003Cbr>See also [`--resolve`](#resolve).\u003Cbr>                                                                                                                                                                                                                                            |\n| \u003Ca href=\"#digest\" id=\"digest\">\u003Ccode>--digest\u003C\u002Fcode>\u003C\u002Fa>                                                           | Tell Hurl to use HTTP Digest authentication\u003Cbr>                                                                                                                                                                                                                                                                                                                                                                               |\n| \u003Ca href=\"#header\" id=\"header\">\u003Ccode>-H, --header &lt;NAME:VALUE&gt;\u003C\u002Fcode>\u003C\u002Fa>                                    | Add an extra header to include in information sent. Can be used several times in a command.\u003Cbr>\u003Cbr>Do not add newlines or carriage returns.\u003Cbr>\u003Cbr>Environment variables: HURL_HEADER='name1:value1&#124;name2:value2' (headers are separated by &#124;)\u003Cbr>                                                                                                                                                                  |\n| \u003Ca href=\"#http10\" id=\"http10\">\u003Ccode>-0, --http1.0\u003C\u002Fcode>\u003C\u002Fa>                                                      | Tells Hurl to use HTTP version 1.0 instead of using its internally preferred HTTP version.\u003Cbr>\u003Cbr>Environment variables: HURL_HTTP10\u003Cbr>                                                                                                                                                                                                                                                                                      |\n| \u003Ca href=\"#http11\" id=\"http11\">\u003Ccode>--http1.1\u003C\u002Fcode>\u003C\u002Fa>                                                          | Tells Hurl to use HTTP version 1.1.\u003Cbr>\u003Cbr>Environment variables: HURL_HTTP11\u003Cbr>                                                                                                                                                                                                                                                                                                                                             |\n| \u003Ca href=\"#http2\" id=\"http2\">\u003Ccode>--http2\u003C\u002Fcode>\u003C\u002Fa>                                                              | Tells Hurl to use HTTP version 2.\u003Cbr>For HTTPS, this means Hurl negotiates HTTP\u002F2 in the TLS handshake. Hurl does this by default.\u003Cbr>For HTTP, this means Hurl attempts to upgrade the request to HTTP\u002F2 using the Upgrade: request header.\u003Cbr>\u003Cbr>Environment variables: HURL_HTTP2\u003Cbr>                                                                                                                                     |\n| \u003Ca href=\"#http3\" id=\"http3\">\u003Ccode>--http3\u003C\u002Fcode>\u003C\u002Fa>                                                              | Tells Hurl to try HTTP version 3 to the host in the URL, but fallback to earlier HTTP versions if the HTTP\u002F3 connection establishment fails. HTTP\u002F3 is only available for HTTPS and not for HTTP URLs.\u003Cbr>\u003Cbr>Environment variables: HURL_HTTP3\u003Cbr>                                                                                                                                                                           |\n| \u003Ca href=\"#insecure\" id=\"insecure\">\u003Ccode>-k, --insecure\u003C\u002Fcode>\u003C\u002Fa>                                                 | This option explicitly allows Hurl to perform \"insecure\" SSL connections and transfers.\u003Cbr>\u003Cbr>Environment variables: HURL_INSECURE\u003Cbr>                                                                                                                                                                                                                                                                                       |\n| \u003Ca href=\"#ipv4\" id=\"ipv4\">\u003Ccode>-4, --ipv4\u003C\u002Fcode>\u003C\u002Fa>                                                             | This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6.\u003Cbr>\u003Cbr>Environment variables: HURL_IPV4\u003Cbr>                                                                                                                                                                                                                                                                        |\n| \u003Ca href=\"#ipv6\" id=\"ipv6\">\u003Ccode>-6, --ipv6\u003C\u002Fcode>\u003C\u002Fa>                                                             | This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4.\u003Cbr>\u003Cbr>Environment variables: HURL_IPV6\u003Cbr>                                                                                                                                                                                                                                                                        |\n| \u003Ca href=\"#key\" id=\"key\">\u003Ccode>--key &lt;KEY&gt;\u003C\u002Fcode>\u003C\u002Fa>                                                        | Private key file name.\u003Cbr>                                                                                                                                                                                                                                                                                                                                                                                                    |\n| \u003Ca href=\"#limit-rate\" id=\"limit-rate\">\u003Ccode>--limit-rate &lt;SPEED&gt;\u003C\u002Fcode>\u003C\u002Fa>                                 | 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>The given speed is measured in bytes\u002Fsecond.\u003Cbr>\u003Cbr>Environment variables: HURL_LIMIT_RATE\u003Cbr>                                                                  |\n| \u003Ca href=\"#location\" id=\"location\">\u003Ccode>-L, --location\u003C\u002Fcode>\u003C\u002Fa>                                                 | Follow redirect. To limit the amount of redirects to follow use the [`--max-redirs`](#max-redirs) option\u003Cbr>\u003Cbr>Environment variables: HURL_LOCATION\u003Cbr>                                                                                                                                                                                                                                                                      |\n| \u003Ca href=\"#location-trusted\" id=\"location-trusted\">\u003Ccode>--location-trusted\u003C\u002Fcode>\u003C\u002Fa>                             | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.\u003Cbr>This 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>\u003Cbr>Environment variables: HURL_LOCATION_TRUSTED\u003Cbr>                                               |\n| \u003Ca href=\"#max-filesize\" id=\"max-filesize\">\u003Ccode>--max-filesize &lt;BYTES&gt;\u003C\u002Fcode>\u003C\u002Fa>                           | 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>\u003Cbr>Environment variables: HURL_MAX_FILESIZE\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                  |\n| \u003Ca href=\"#max-redirs\" id=\"max-redirs\">\u003Ccode>--max-redirs &lt;NUM&gt;\u003C\u002Fcode>\u003C\u002Fa>                                   | Set maximum number of redirection-followings allowed\u003Cbr>\u003Cbr>By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.\u003Cbr>\u003Cbr>Environment variables: HURL_MAX_REDIRS\u003Cbr>                                                                                                                                                                                                                    |\n| \u003Ca href=\"#max-time\" id=\"max-time\">\u003Ccode>-m, --max-time &lt;SECONDS&gt;\u003C\u002Fcode>\u003C\u002Fa>                                 | Maximum time in seconds that you allow a request\u002Fresponse to take. This is the standard timeout.\u003Cbr>\u003Cbr>You 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>\u003Cbr>See also [`--connect-timeout`](#connect-timeout).\u003Cbr>\u003Cbr>Environment variables: HURL_MAX_TIME\u003Cbr> |\n| \u003Ca href=\"#negotiate\" id=\"negotiate\">\u003Ccode>--negotiate\u003C\u002Fcode>\u003C\u002Fa>                                                  | Tell Hurl to use Negotiate (SPNEGO) authentication.\u003Cbr>                                                                                                                                                                                                                                                                                                                                                                       |\n| \u003Ca href=\"#no-cookie-store\" id=\"no-cookie-store\">\u003Ccode>--no-cookie-store\u003C\u002Fcode>\u003C\u002Fa>                                | Do not use cookie storage for requests\u002Fresponses in a file. By default, requests in the same Hurl file share cookie storage, this option deactivates cookie engine.\u003Cbr>\u003Cbr>Environment variables: HURL_NO_COOKIE_STORE\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                  |\n| \u003Ca href=\"#no-proxy\" id=\"no-proxy\">\u003Ccode>--no-proxy &lt;HOST(S)&gt;\u003C\u002Fcode>\u003C\u002Fa>                                     | Comma-separated list of hosts which do not use a proxy.\u003Cbr>\u003Cbr>Environment variables: no_proxy\u003Cbr>                                                                                                                                                                                                                                                                                                                            |\n| \u003Ca href=\"#ntlm\" id=\"ntlm\">\u003Ccode>--ntlm\u003C\u002Fcode>\u003C\u002Fa>                                                                 | Tell Hurl to use NTLM authentication\u003Cbr>                                                                                                                                                                                                                                                                                                                                                                                      |\n| \u003Ca href=\"#path-as-is\" id=\"path-as-is\">\u003Ccode>--path-as-is\u003C\u002Fcode>\u003C\u002Fa>                                               | Tell Hurl to not handle sequences of \u002F..\u002F or \u002F.\u002F 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>                                                                                                                                                                                                                               |\n| \u003Ca href=\"#pinnedpubkey\" id=\"pinnedpubkey\">\u003Ccode>--pinnedpubkey &lt;HASHES&gt;\u003C\u002Fcode>\u003C\u002Fa>                          | When negotiating a TLS or SSL connection, the server sends a certificate indicating its identity. A public key is extracted from this certificate and if it does not exactly match the public key provided to this option, Hurl aborts the connection before sending or receiving any data.\u003Cbr>                                                                                                                               |\n| \u003Ca href=\"#proxy\" id=\"proxy\">\u003Ccode>-x, --proxy &lt;[PROTOCOL:\u002F\u002F]HOST[:PORT]&gt;\u003C\u002Fcode>\u003C\u002Fa>                         | Use the specified proxy.\u003Cbr>\u003Cbr>Environment variables: http_proxy https_proxy all_proxy\u003Cbr>                                                                                                                                                                                                                                                                                                                                   |\n| \u003Ca href=\"#resolve\" id=\"resolve\">\u003Ccode>--resolve &lt;HOST:PORT:ADDR&gt;\u003C\u002Fcode>\u003C\u002Fa>                                 | 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 \u002Fetc\u002Fhosts alternative provided on the command line.\u003Cbr>                                                                                                                                              |\n| \u003Ca href=\"#ssl-no-revoke\" id=\"ssl-no-revoke\">\u003Ccode>--ssl-no-revoke\u003C\u002Fcode>\u003C\u002Fa>                                      | (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>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                              |\n| \u003Ca href=\"#unix-socket\" id=\"unix-socket\">\u003Ccode>--unix-socket &lt;PATH&gt;\u003C\u002Fcode>\u003C\u002Fa>                               | (HTTP) Connect through this Unix domain socket, instead of using the network.\u003Cbr>                                                                                                                                                                                                                                                                                                                                             |\n| \u003Ca href=\"#user\" id=\"user\">\u003Ccode>-u, --user &lt;USER:PASSWORD&gt;\u003C\u002Fcode>\u003C\u002Fa>                                       | Add basic Authentication header to each request.\u003Cbr>\u003Cbr>Environment variables: HURL_USER\u003Cbr>                                                                                                                                                                                                                                                                                                                                  |\n| \u003Ca href=\"#user-agent\" id=\"user-agent\">\u003Ccode>-A, --user-agent &lt;NAME&gt;\u003C\u002Fcode>\u003C\u002Fa>                              | Specify the User-Agent string to send to the HTTP server.\u003Cbr>\u003Cbr>Environment variables: HURL_USER_AGENT\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                                 |\n\n### Output options\n\n| Option                                                                                   | Description                                                                                                                                                                                                                                                                                                                                                                                                                           |\n|------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| \u003Ca href=\"#color\" id=\"color\">\u003Ccode>--color\u003C\u002Fcode>\u003C\u002Fa>                                     | Colorize standard output and standard error.\u003Cbr>\u003Cbr>By default, Hurl outputs a prettified and colorized response. When redirected through pipes, standard streams are not colorized and color can be forced with this option.\u003Cbr>\u003Cbr>Environment variables: HURL_COLOR\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                          |\n| \u003Ca href=\"#curl\" id=\"curl\">\u003Ccode>--curl &lt;FILE&gt;\u003C\u002Fcode>\u003C\u002Fa>                           | Export each request to a list of curl commands.\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                                                                                                 |\n| \u003Ca href=\"#error-format\" id=\"error-format\">\u003Ccode>--error-format &lt;FORMAT&gt;\u003C\u002Fcode>\u003C\u002Fa> | Control the format of error message (short by default or long).  When using long, the response body is logged when there are errors.\u003Cbr>\u003Cbr>Environment variables: HURL_ERROR_FORMAT\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                            |\n| \u003Ca href=\"#include\" id=\"include\">\u003Ccode>-i, --include\u003C\u002Fcode>\u003C\u002Fa>                           | Include the HTTP headers in the output\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                                                                                                          |\n| \u003Ca href=\"#json\" id=\"json\">\u003Ccode>--json\u003C\u002Fcode>\u003C\u002Fa>                                        | Output each Hurl file result to JSON. The format is very closed to HAR format.\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                                                                  |\n| \u003Ca href=\"#no-color\" id=\"no-color\">\u003Ccode>--no-color\u003C\u002Fcode>\u003C\u002Fa>                            | Do not colorize standard output nor standard error.\u003Cbr>\u003Cbr>Environment variables: HURL_NO_COLOR NO_COLOR\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                                        |\n| \u003Ca href=\"#no-output\" id=\"no-output\">\u003Ccode>--no-output\u003C\u002Fcode>\u003C\u002Fa>                         | Suppress output. By default, Hurl outputs the body of the last response.\u003Cbr>\u003Cbr>Environment variables: HURL_NO_OUTPUT\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                           |\n| \u003Ca href=\"#no-pretty\" id=\"no-pretty\">\u003Ccode>--no-pretty\u003C\u002Fcode>\u003C\u002Fa>                         | Do not prettify response output for supported content type (JSON only for the moment). By default, output is prettified if\u003Cbr>standard output is a terminal.\u003Cbr>\u003Cbr>Environment variables: HURL_NO_PRETTY\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                       |\n| \u003Ca href=\"#output\" id=\"output\">\u003Ccode>-o, --output &lt;FILE&gt;\u003C\u002Fcode>\u003C\u002Fa>                 | Write output to FILE instead of stdout. Use '-' for stdout in [Options] sections.\u003Cbr>                                                                                                                                                                                                                                                                                                                                                 |\n| \u003Ca href=\"#pretty\" id=\"pretty\">\u003Ccode>--pretty\u003C\u002Fcode>\u003C\u002Fa>                                  | Prettify response output for supported content type (JSON only for the moment). By default, JSON response is prettified if standard output is a terminal, and colorized, see[`--no-color`](#no-color) to format without color.\u003Cbr>\u003Cbr>Environment variables: HURL_PRETTY\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                        |\n| \u003Ca href=\"#progress-bar\" id=\"progress-bar\">\u003Ccode>--progress-bar\u003C\u002Fcode>\u003C\u002Fa>                | Display a progress bar in test mode. The progress bar is displayed only in interactive TTYs. This option forces the progress bar to be displayed even in non-interactive TTYs.\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                  |\n| \u003Ca href=\"#verbose\" id=\"verbose\">\u003Ccode>-v, --verbose\u003C\u002Fcode>\u003C\u002Fa>                           | Turn on verbose output on standard error stream.\u003Cbr>Useful for debugging.\u003Cbr>\u003Cbr>A line starting with '>' means data sent by Hurl.\u003Cbr>A line staring with '\u003C' means data received by Hurl.\u003Cbr>A line starting with '*' means additional info provided by Hurl.\u003Cbr>\u003Cbr>If you only want HTTP headers in the output, [`-i, --include`](#include) might be the option you're looking for.\u003Cbr>\u003Cbr>Environment variables: HURL_VERBOSE\u003Cbr> |\n| \u003Ca href=\"#verbosity\" id=\"verbosity\">\u003Ccode>--verbosity &lt;LEVEL&gt;\u003C\u002Fcode>\u003C\u002Fa>           | Set the verbosity level for debug logs on standard error stream (brief, verbose or debug)\u003Cbr>\u003Cbr>If you only want HTTP headers in the output, [`-i, --include`](#include) might be the option you're looking for.\u003Cbr>[`-v, --verbose`](#verbose) is an alias for `--verbosity verbose`\u003Cbr>[`--very-verbose`](#very-verbose) is an alias for `--verbosity debug`\u003Cbr>\u003Cbr>Environment variables: HURL_VERBOSITY\u003Cbr>                      |\n| \u003Ca href=\"#very-verbose\" id=\"very-verbose\">\u003Ccode>--very-verbose\u003C\u002Fcode>\u003C\u002Fa>                | Turn on more verbose output on standard error stream.\u003Cbr>\u003Cbr>In 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>\u003Cbr>Environment variables: HURL_VERY_VERBOSE\u003Cbr>                                                                                                                         |\n\n### Run options\n\n| Option                                                                                               | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n|------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| \u003Ca href=\"#continue-on-error\" id=\"continue-on-error\">\u003Ccode>--continue-on-error\u003C\u002Fcode>\u003C\u002Fa>             | Continue executing requests to the end of the Hurl file even when an assert error occurs. By default, Hurl exits after an assert error in the HTTP response.\u003Cbr>\u003Cbr>Note that this option does not affect the behavior with multiple input Hurl files.\u003Cbr>\u003Cbr>All the input files are executed independently. The result of one file does not affect the execution of the other Hurl files.\u003Cbr>\u003Cbr>Environment variables: HURL_CONTINUE_ON_ERROR\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr> |\n| \u003Ca href=\"#delay\" id=\"delay\">\u003Ccode>--delay &lt;MILLISECONDS&gt;\u003C\u002Fcode>\u003C\u002Fa>                            | 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>\u003Cbr>You 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`. Supported time units: ms, s, m, h. No spaces allowed.\u003Cbr>\u003Cbr>Environment variables: HURL_DELAY\u003Cbr>  |\n| \u003Ca href=\"#from-entry\" id=\"from-entry\">\u003Ccode>--from-entry &lt;ENTRY_NUMBER&gt;\u003C\u002Fcode>\u003C\u002Fa>             | Execute Hurl file from ENTRY_NUMBER (starting at 1).\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                                                                                                                                             |\n| \u003Ca href=\"#jobs\" id=\"jobs\">\u003Ccode>--jobs &lt;NUM&gt;\u003C\u002Fcode>\u003C\u002Fa>                                        | Maximum number of parallel jobs in parallel mode. Default value corresponds (in most cases) to the current amount of CPUs. Set to 1 to disable parallel execution of files.\u003Cbr>\u003Cbr>See also [`--parallel`](#parallel).\u003Cbr>\u003Cbr>Environment variables: HURL_JOBS\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                   |\n| \u003Ca href=\"#no-assert\" id=\"no-assert\">\u003Ccode>--no-assert\u003C\u002Fcode>\u003C\u002Fa>                                     | Ignore all asserts defined in the Hurl file.\u003Cbr>\u003Cbr>Environment variables: HURL_NO_ASSERT\u003Cbr>\u003Cbr>This is a cli-only option.\u003Cbr>                                                                                                                                                                                                                                                                                                                               ","Hurl 是一个命令行工具，用于运行和测试以纯文本格式定义的HTTP请求。其核心功能包括链式请求、值捕获以及对响应头和正文执行查询。Hurl 支持多种API类型，如REST、SOAP、GraphQL及基于XML\u002FJSON的API，并且能够处理HTML内容。此外，它还提供了强大的断言机制来验证HTTP响应的状态码、头部信息以及通过XPath或JSONPath表达式检查响应体。此工具非常适合需要进行数据抓取或集成测试的场景，特别是对于那些希望使用简洁易读的配置文件来管理复杂HTTP交互流程的开发者而言。",2,"2026-06-11 03:03:11","top_language"]