{"owner":"Orange-OpenSource","repo":"hurl","hasSkills":true,"totalSkillsCount":11,"totalTokensCount":26768,"categories":["anthropic-skill","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":["packages/hurl_core/tests/json/asterisk.json","packages/hurl_core/tests/json/elasticsearch.json","packages/hurlfmt/README.md","packages/hurl_core/README.md","packages/hurl/README.md","packages/hurl_core/tests/json/variable.json","packages/hurl/tests/bookstore.json","packages/hurl_core/tests/json/g_clef.json","packages/hurl_core/tests/json/person.json","packages/hurl_core/tests/json/hello.json","packages/hurl/src/jsonpath/tests/cts.json"],"skills":{"packages/hurl_core/tests/json/asterisk.json":"{ \"*\": {} }","packages/hurl_core/tests/json/elasticsearch.json":"{\n  \"from\": 0,\n  \"size\": 2000,\n  \"sort\": [\n    {\n      \"@timestamp\": \"desc\"\n    }\n  ],\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"match\": {\n            \"tag.env\": \"prod\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.r_code\": \"500\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.q_client-dns\": \"m.shop.sosh.fr\"\n          }\n        },\n        {\n          \"match\": {\n            \"@timestamp\": {\n              \"query\": \"{{date}}\"\n            }\n          }\n        }\n      ]\n    }\n  }\n}","packages/hurlfmt/README.md":"hurlfmt\n=====================================\n\nThe hurlfmt crate provides the `hurlfmt` binary.\nIt can format hurl files and to export them to JSON/HTML.\n","packages/hurl_core/README.md":"hurl_core\n===============\n\nThe hurl_core crate provides the common functionalities used by both hurl and hurlfmt.\n\n","packages/hurl/README.md":"<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/logo-light.svg\" > \n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/logo-dark.svg\" > \n    <img src=\"https://hurl.dev/assets/img/logo-light.svg\" width=\"264px\" alt=\"Hurl Logo\">\n</picture>\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 <b>HTTP requests</b> defined in a simple <b>plain text format</b>.\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 <b>fetching data</b> and <b>testing HTTP</b> sessions.\n\nHurl makes it easy to work with <b>HTML</b> content, <b>REST / SOAP / GraphQL</b> APIs, or any other <b>XML / JSON</b> based APIs. \n\n```hurl\n# Go home and capture token\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\n[Form]\nuser: toto\npassword: 1234\ntoken: {{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 <b>test HTTP responses</b>.\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<a href=\"https://hurl.dev/player.html?id=starwars&speed=3\"><img src=\"https://hurl.dev/assets/img/poster-starwars.png\" width=\"100%\" alt=\"Hurl Demo\"/></a>\n\n\nIt is well adapted for <b>REST / JSON APIs</b>\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<b>HTML content</b>\n\n```hurl\nGET https://example.org\nHTTP 200\n[Asserts]\nxpath \"normalize-space(//head/title)\" == \"Hello world!\"\n```\n\n<b>GraphQL</b> \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 <b>SOAP APIs</b>\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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\nHTTP 200\n```\n\nHurl can also be used to test the <b>performance</b> of HTTP endpoints\n\n```hurl\nGET https://example.org/api/v1/pets\nHTTP 200\n[Asserts]\nduration < 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 <b>integrate in CI/CD</b>, with text, JUnit, TAP and HTML reports\n\n<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-light.png\">\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-dark.png\">\n    <img src=\"https://hurl.dev/assets/img/home-waterfall-light.png\" width=\"480\" alt=\"HTML report\"/>\n</picture>\n\n# Why Hurl?\n\n<ul class=\"showcase-container\">\n    <li><b>Text Format:</b> for both devops and developers</li>\n    <li><b>Fast CLI:</b> a command line for local dev and continuous integration</li>\n    <li><b>Single Binary:</b> easy to install, with no runtime required</li>\n</ul>\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 / 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        * [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 / Ubuntu](#debian--ubuntu)\n            * [Alpine](#alpine)\n            * [Arch Linux / Manjaro](#arch-linux--manjaro)\n            * [NixOS / Nix](#nixos--nix)\n            * [Guix](#guix)\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.org/cats/123\n[Options]\noutput: cat123.txt    # use - to output to stdout\nHTTP 200\n\nGET https://example.org/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&search=something%20to%20search&count=100\n```\n\n> 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<div>Hello <b>World</b>!</div>\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### 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<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Request>\n    <Login>{{login}}</Login>\n    <Password>{{password}}</Password>\n</Request>\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-query)\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 >= 200\nstatus < 300\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#status-assert)\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\" 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 /^order-\\d{8}$/  # Alternative syntax with regex literal\njsonpath \"$.id\" matches /(?i)[a-z]*/        # See syntax for flags <https://docs.rs/regex/latest/regex/#grouping-and-flags>\njsonpath \"$.created\" isIsoDate\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#jsonpath-assert)\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 > 15\ncertificate \"Serial-Number\" matches /[\\da-f]+/\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://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\", \"<strong>any</strong> 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<catalog>\n   <book id=\"bk101\">\n      <author>Gambardella, Matthew</author>\n      <title>XML Developer's Guide</title>\n      <genre>Computer</genre>\n      <price>44.95</price>\n      <publish_date>2000-10-01</publish_date>\n      <description>An in-depth look at creating applications with XML.</description>\n   </book>\n</catalog>\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### 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://example.org/step1\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step2\"\n\n\nGET https://example.org/step2\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step3\"\n\n\nGET https://example.org/step3\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://example.org/step1\n[Options]\nlocation: true\nHTTP 200\n[Asserts]\nredirects count == 2\nredirects nth 0 location == \"https://example.org/step2\"\nredirects nth 1 location == \"https://example.org/step3\"\n```\n\n```hurl\nGET https://example.org/step1\n[Options]\nlocation-trusted: true\nHTTP 200\n[Asserts]\nredirects last location == \"https://example.org/step2\"\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#redirects-assert)\n\n## Debug Tips\n\n### Verbose Mode\n\nTo get more info on a given request/response, use [`[Options]` section](https://hurl.dev/docs/request.html#options):\n\n```hurl\nGET https://example.org\nHTTP 200\n\nGET https://example.org/api/cats/123\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://hurl.dev/docs/manual.html#very-verbose)\n\n### Error Format\n\n```shell\n$ hurl --test --error-format long *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.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://foo.com/failure\n[Options]\n# use - to output on standard output, foo.bin to save on disk \noutput: -\nHTTP 200\n\nGET https://foo.com/success\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/manual.html#output)\n\n### Export curl Commands\n\n```shell\n$ hurl ---curl /tmp/curl.txt *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.html#curl)\n\n### Using Proxy\n\nUse `--proxy` on a specific request or globally as command line option:\n\n```hurl\nGET https://foo.com/a\nHTTP 200\n\nGET https://foo.com/b\n[Options]\nproxy: localhost:8888\nHTTP 200\n\nGET https://foo.com/c\nHTTP 200\n```\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### 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) can be done using implicit asserts:\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\nOr explicit:\n\n```hurl\nGET https://foo.com\nHTTP 200\n[Asserts]\nversion == \"3\"\n\nGET https://bar.com\nHTTP 200\n[Asserts]\nversion == \"2\"\nversion toFloat > 1.1\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://foo.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://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 < 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\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&password=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## 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 / 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&password=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## 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, except if they are tagged as cli-only \n(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\nHurl looks also for a configuration file at the following places `$XDG_CONFIG_HOME/hurl/config` if `$XDG_CONFIG_HOME` exists,\nor `$HOME/.config/hurl/config`. The configuration file is a list of options added to each Hurl run.\n\n```shell\n$ cat ~/.config/hurl/config\n# Hurl config file\n--header x-identifier:quux\n--verbose\n--delay=1s\n--fail-with-body\n```\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 four sources from the lowest priority (most easily overridden) to highest (overrides all others):\n\n- Configuration file (ex: `~/.config/hurl/config`)\n- Environment variables (ex: `export HURL_INSECURE=true`)\n- Command-line options (ex: `hurl --insecure`)\n- Options section options (ex: `insecure: true` in file)\n\n## All Options\n\n### HTTP options\n\n| Option                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                   |\n|-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| <a href=\"#aws-sigv4\" id=\"aws-sigv4\"><code>--aws-sigv4 &lt;PROVIDER1[:PROVIDER2[:REGION[:SERVICE]]]&gt;</code></a> | Generate an `Authorization` header with an AWS SigV4 signature.<br><br>Use [`-u, --user`](#user) to specify Access Key Id (username) and Secret Key (password).<br><br>To use temporary session credentials (e.g. for an AWS IAM Role), add the `X-Amz-Security-Token` header containing the session token.<br>                                                                                                               |\n| <a href=\"#cacert\" id=\"cacert\"><code>--cacert &lt;FILE&gt;</code></a>                                              | Specifies the certificate file for peer verification. The file may contain multiple CA certificates and must be in PEM format.<br>Normally Hurl is built to use a default file for this, so this option is typically used to alter that default file.<br>                                                                                                                                                                     |\n| <a href=\"#cert\" id=\"cert\"><code>-E, --cert &lt;CERTIFICATE[:PASSWORD]&gt;</code></a>                              | Client certificate file and password.<br><br>See also [`--key`](#key).<br>                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#compressed\" id=\"compressed\"><code>--compressed</code></a>                                               | Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.<br><br>Environment variables: HURL_COMPRESSED<br>                                                                                                                                                                                                                                                       |\n| <a href=\"#connect-timeout\" id=\"connect-timeout\"><code>--connect-timeout &lt;SECONDS&gt;</code></a>                | Maximum time in seconds that you allow Hurl's connection to take.<br><br>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.<br><br>See also [`-m, --max-time`](#max-time).<br><br>Environment variables: HURL_CONNECT_TIMEOUT<br>               |\n| <a href=\"#connect-to\" id=\"connect-to\"><code>--connect-to &lt;HOST1:PORT1:HOST2:PORT2&gt;</code></a>               | 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.<br><br>See also [`--resolve`](#resolve).<br>                                                                                                                                                                                                                                            |\n| <a href=\"#digest\" id=\"digest\"><code>--digest</code></a>                                                           | Tell Hurl to use HTTP Digest authentication<br>                                                                                                                                                                                                                                                                                                                                                                               |\n| <a href=\"#header\" id=\"header\"><code>-H, --header &lt;NAME:VALUE&gt;</code></a>                                    | Add an extra header to include in information sent. Can be used several times in a command.<br><br>Do not add newlines or carriage returns.<br><br>Environment variables: HURL_HEADER='name1:value1&#124;name2:value2' (headers are separated by &#124;)<br>                                                                                                                                                                  |\n| <a href=\"#http10\" id=\"http10\"><code>-0, --http1.0</code></a>                                                      | Tells Hurl to use HTTP version 1.0 instead of using its internally preferred HTTP version.<br><br>Environment variables: HURL_HTTP10<br>                                                                                                                                                                                                                                                                                      |\n| <a href=\"#http11\" id=\"http11\"><code>--http1.1</code></a>                                                          | Tells Hurl to use HTTP version 1.1.<br><br>Environment variables: HURL_HTTP11<br>                                                                                                                                                                                                                                                                                                                                             |\n| <a href=\"#http2\" id=\"http2\"><code>--http2</code></a>                                                              | Tells Hurl to use HTTP version 2.<br>For HTTPS, this means Hurl negotiates HTTP/2 in the TLS handshake. Hurl does this by default.<br>For HTTP, this means Hurl attempts to upgrade the request to HTTP/2 using the Upgrade: request header.<br><br>Environment variables: HURL_HTTP2<br>                                                                                                                                     |\n| <a href=\"#http2-prior-knowledge\" id=\"http2-prior-knowledge\"><code>--http2-prior-knowledge</code></a>              | Tells Hurl to issue a non-TLS HTTP request using HTTP/2 directly without HTTP/1.1 Upgrade. It requires prior knowledge that the server supports HTTP/2 straight away. HTTPS requests still do HTTP/2 the standard way with negotiated protocol versions in the TLS handshake.<br><br>Environment variables: HURL_HTTP2_PRIOR_KNOWLEDGE<br>                                                                                    |\n| <a href=\"#http3\" id=\"http3\"><code>--http3</code></a>                                                              | Tells Hurl to try HTTP version 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.<br><br>Environment variables: HURL_HTTP3<br>                                                                                                                                                                           |\n| <a href=\"#insecure\" id=\"insecure\"><code>-k, --insecure</code></a>                                                 | This option explicitly allows Hurl to perform \"insecure\" SSL connections and transfers.<br><br>Environment variables: HURL_INSECURE<br>                                                                                                                                                                                                                                                                                       |\n| <a href=\"#ipv4\" id=\"ipv4\"><code>-4, --ipv4</code></a>                                                             | This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6.<br><br>Environment variables: HURL_IPV4<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#ipv6\" id=\"ipv6\"><code>-6, --ipv6</code></a>                                                             | This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4.<br><br>Environment variables: HURL_IPV6<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#key\" id=\"key\"><code>--key &lt;KEY&gt;</code></a>                                                        | Private key file name.<br>                                                                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#limit-rate\" id=\"limit-rate\"><code>--limit-rate &lt;SPEED&gt;</code></a>                                 | 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.<br>The given speed is measured in bytes/second.<br><br>Environment variables: HURL_LIMIT_RATE<br>                                                                  |\n| <a href=\"#location\" id=\"location\"><code>-L, --location</code></a>                                                 | Follow redirect. To limit the amount of redirects to follow use the [`--max-redirs`](#max-redirs) option<br><br>Environment variables: HURL_LOCATION<br>                                                                                                                                                                                                                                                                      |\n| <a href=\"#location-trusted\" id=\"location-trusted\"><code>--location-trusted</code></a>                             | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.<br>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).<br><br>Environment variables: HURL_LOCATION_TRUSTED<br>                                               |\n| <a href=\"#max-filesize\" id=\"max-filesize\"><code>--max-filesize &lt;BYTES&gt;</code></a>                           | 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.<br><br>Environment variables: HURL_MAX_FILESIZE<br><br>This is a cli-only option.<br>                                                                                                                                                                                                  |\n| <a href=\"#max-redirs\" id=\"max-redirs\"><code>--max-redirs &lt;NUM&gt;</code></a>                                   | Set maximum number of redirection-followings allowed<br><br>By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.<br><br>Environment variables: HURL_MAX_REDIRS<br>                                                                                                                                                                                                                    |\n| <a href=\"#max-time\" id=\"max-time\"><code>-m, --max-time &lt;SECONDS&gt;</code></a>                                 | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.<br><br>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.<br><br>See also [`--connect-timeout`](#connect-timeout).<br><br>Environment variables: HURL_MAX_TIME<br> |\n| <a href=\"#negotiate\" id=\"negotiate\"><code>--negotiate</code></a>                                                  | Tell Hurl to use Negotiate (SPNEGO) authentication.<br>                                                                                                                                                                                                                                                                                                                                                                       |\n| <a href=\"#no-cookie-store\" id=\"no-cookie-store\"><code>--no-cookie-store</code></a>                                | Do not use cookie storage for requests/responses in a file. By default, requests in the same Hurl file share cookie storage, this option deactivates cookie engine.<br><br>Environment variables: HURL_NO_COOKIE_STORE<br><br>This is a cli-only option.<br>                                                                                                                                                                  |\n| <a href=\"#no-header\" id=\"no-header\"><code>--no-header &lt;NAME&gt;</code></a>                                     | Remove a header from information sent. Can be used several times in a command.<br><br>Environment variables: HURL_NO_HEADER='name1&#124;name2' (names are separated by &#124;)<br>                                                                                                                                                                                                                                            |\n| <a href=\"#no-proxy\" id=\"no-proxy\"><code>--no-proxy &lt;HOST(S)&gt;</code></a>                                     | Comma-separated list of hosts which do not use a proxy.<br><br>Environment variables: no_proxy<br>                                                                                                                                                                                                                                                                                                                            |\n| <a href=\"#ntlm\" id=\"ntlm\"><code>--ntlm</code><","packages/hurl_core/tests/json/variable.json":"{\n  \"name\": \"{{name}}\",\n  \"password\": \"secret\",\n  \"age\": {{age}},\n  \"strict\": {{strict}}\n}","packages/hurl/tests/bookstore.json":"{\n  \"store\": {\n    \"book\": [\n      {\n        \"category\": \"reference\",\n        \"author\": \"Nigel Rees\",\n        \"title\": \"Sayings of the Century\",\n        \"price\": 8.95\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Evelyn Waugh\",\n        \"title\": \"Sword of Honour\",\n        \"price\": 12.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Herman Melville\",\n        \"title\": \"Moby Dick\",\n        \"isbn\": \"0-553-21311-3\",\n        \"price\": 8.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"J. R. R. Tolkien\",\n        \"title\": \"The Lord of the Rings\",\n        \"isbn\": \"0-395-19395-8\",\n        \"price\": 22.99\n      }\n    ],\n    \"bicycle\": {\n      \"color\": \"red\",\n      \"price\": 19.95\n    }\n  }\n}","packages/hurl_core/tests/json/g_clef.json":"{\n  \"encoding1\": \"\\uD834\\uDD1E\"\n}","packages/hurl_core/tests/json/person.json":"{\n  \"firstName\": \"John\",\n  \"lastName\": \"Smith\",\n  \"isAlive\": true,\n  \"age\": 27,\n  \"address\": {\n    \"streetAddress\": \"21 2nd Street\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postalCode\": \"10021-3100\"\n  },\n  \"phoneNumbers\": [\n    {\n      \"type\": \"home\",\n      \"number\": \"212 555-1234\"\n    },\n    {\n      \"type\": \"office\",\n      \"number\": \"646 555-4567\"\n    }\n  ],\n  \"children\": [],\n  \"spouse\": null\n}","packages/hurl_core/tests/json/hello.json":"\"Hello {{Name}}!\"","packages/hurl/src/jsonpath/tests/cts.json":"{\n  \"description\": \"JSONPath Compliance Test Suite. This file is autogenerated, do not edit.\",\n  \"tests\": [\n    {\n      \"name\": \"basic, root\",\n      \"selector\": \"$\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        [\n          \"first\",\n          \"second\"\n        ]\n      ],\n      \"result_paths\": [\n        \"$\"\n      ]\n    },\n    {\n      \"name\": \"basic, no leading whitespace\",\n      \"selector\": \" $\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, no trailing whitespace\",\n      \"selector\": \"$ \",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand\",\n      \"selector\": \"$.a\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, extended unicode ☺\",\n      \"selector\": \"$.☺\",\n      \"document\": {\n        \"☺\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['☺']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, underscore\",\n      \"selector\": \"$._\",\n      \"document\": {\n        \"_\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['_']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, symbol\",\n      \"selector\": \"$.&\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, number\",\n      \"selector\": \"$.1\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, absent data\",\n      \"selector\": \"$.c\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, array data\",\n      \"selector\": \"$.a\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, object data, nested\",\n      \"selector\": \"$.a.b.c\",\n      \"document\": {\n        \"a\": {\n          \"b\": {\n            \"c\": \"C\"\n          }\n        }\n      },\n      \"result\": [\n        \"C\"\n      ],\n      \"result_paths\": [\n        \"$['a']['b']['c']\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, object data\",\n      \"selector\": \"$.*\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\"\n        ],\n        [\n          \"B\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, array data\",\n      \"selector\": \"$.*\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard selector, array data\",\n      \"selector\": \"$[*]\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, then name shorthand\",\n      \"selector\": \"$.*.a\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"Ax\",\n          \"b\": \"Bx\"\n        },\n        \"y\": {\n          \"a\": \"Ay\",\n          \"b\": \"By\"\n        }\n      },\n      \"results\": [\n        [\n          \"Ax\",\n          \"Ay\"\n        ],\n        [\n          \"Ay\",\n          \"Ax\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['y']['a']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['x']['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors\",\n      \"selector\": \"$[0,2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, space instead of comma\",\n      \"selector\": \"$[0 2]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, selector, leading comma\",\n      \"selector\": \"$[,0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, selector, trailing comma\",\n      \"selector\": \"$[0,]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, array data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, object data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": 2\n      },\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice\",\n      \"selector\": \"$[1,5:7]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        5,\n        6\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[5]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice, overlapping\",\n      \"selector\": \"$[1,0:3]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, duplicate index\",\n      \"selector\": \"$[1,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and index\",\n      \"selector\": \"$[*,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and name\",\n      \"selector\": \"$[*,'a']\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\",\n          \"A\"\n        ],\n        [\n          \"B\",\n          \"A\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and slice\",\n      \"selector\": \"$[*,0:2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, multiple wildcards\",\n      \"selector\": \"$[*,*]\",\n      \"document\": [\n        0,\n        1,\n        2\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, empty segment\",\n      \"selector\": \"$[]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, descendant segment, index\",\n      \"selector\": \"$..[1]\",\n      \"document\": {\n        \"o\": [\n          0,\n          1,\n          [\n            2,\n            3\n          ]\n        ]\n      },\n      \"result\": [\n        1,\n        3\n      ],\n      \"result_paths\": [\n        \"$['o'][1]\",\n        \"$['o'][2][1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, name shorthand\",\n      \"selector\": \"$..a\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          },\n          {\n            \"a\": \"c\"\n          }\n        ]\n      },\n      \"result\": [\n        \"b\",\n        \"c\"\n      ],\n      \"result_paths\": [\n        \"$['o'][0]['a']\",\n        \"$['o'][1]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, true\",\n      \"selector\": \"$.true\",\n      \"document\": {\n        \"true\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['true']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, false\",\n      \"selector\": \"$.false\",\n      \"document\": {\n        \"false\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['false']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, null\",\n      \"selector\": \"$.null\",\n      \"document\": {\n        \"null\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['null']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, array data\",\n      \"selector\": \"$..*\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, array data\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested arrays\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        [\n          [\n            1\n          ]\n        ],\n        [\n          2\n        ]\n      ],\n      \"results\": [\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          1,\n          2\n        ],\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          2,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[0][0][0]\",\n          \"$[1][0]\"\n        ],\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[1][0]\",\n          \"$[0][0][0]\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested objects\",\n      \"selector\": \"$..[*]\",\n      \"document\": {\n        \"a\": {\n          \"c\": {\n            \"e\": 1\n          }\n        },\n        \"b\": {\n          \"d\": 2\n        }\n      },\n      \"results\": [\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, object data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"a\": \"b\"\n      },\n      \"result\": [\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, nested data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          }\n        ]\n      },\n      \"result\": [\n        [\n          {\n            \"a\": \"b\"\n          }\n        ],\n        {\n          \"a\": \"b\"\n        },\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['o']\",\n        \"$['o'][0]\",\n        \"$['o'][0]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        \"b\",\n        \"e\",\n        \"c\",\n        \"f\"\n      ],\n      \"result_paths\": [\n        \"$[0]['a']\",\n        \"$[0]['d']\",\n        \"$[1]['a']\",\n        \"$[1]['d']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, object traversal, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        \"y\": {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      },\n      \"results\": [\n        [\n          \"b\",\n          \"e\",\n          \"c\",\n          \"f\"\n        ],\n        [\n          \"c\",\n          \"f\",\n          \"b\",\n          \"e\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['x']['d']\",\n          \"$['y']['a']\",\n          \"$['y']['d']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['y']['d']\",\n          \"$['x']['a']\",\n          \"$['x']['d']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, bald descendant segment\",\n      \"selector\": \"$..\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, current node identifier without filter selector\",\n      \"selector\": \"$[@.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, root node identifier in brackets without filter selector\",\n      \"selector\": \"$[$.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, existence, without segments\",\n      \"selector\": \"$[?@]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, existence\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, existence, present with null\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, without segments\",\n      \"selector\": \"$[?$]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, with segments\",\n      \"selector\": \"$[?$.*.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, single quotes\",\n      \"selector\": \"$[?@.a=='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a=='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals number\",\n      \"selector\": \"$[?@.a==1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null, absent from data\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, equals true\",\n      \"selector\": \"$[?@.a==true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals false\",\n      \"selector\": \"$[?@.a==false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals self\",\n      \"selector\": \"$[?@==@]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute, equals self\",\n      \"selector\": \"$[?$==$]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals, absent from index selector equals absent from name selector\",\n      \"selector\": \"$[?@.absent==@.list[9]]\",\n      \"document\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, arrays\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": [\n            1,\n            2\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              [\n                2\n              ],\n              1\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              2\n            ]\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, objects\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 2\n            }\n          }\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a!='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes, different type\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes, different types\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number, different types\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null, absent from data\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals true\",\n      \"selector\": \"$[?@.a!=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals false\",\n      \"selector\": \"$[?@.a!=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, single quotes\",\n      \"selector\": \"$[?@.a<'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, double quotes\",\n      \"selector\": \"$[?@.a<\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than number\",\n      \"selector\": \"$[?@.a<10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than null\",\n      \"selector\": \"$[?@.a<null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than true\",\n      \"selector\": \"$[?@.a<true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than false\",\n      \"selector\": \"$[?@.a<false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a<='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a<=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to number\",\n      \"selector\": \"$[?@.a<=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to null\",\n      \"selector\": \"$[?@.a<=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to true\",\n      \"selector\": \"$[?@.a<=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to false\",\n      \"selector\": \"$[?@.a<=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, single quotes\",\n      \"selector\": \"$[?@.a>'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, double quotes\",\n      \"selector\": \"$[?@.a>\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than number\",\n      \"selector\": \"$[?@.a>10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than null\",\n      \"selector\": \"$[?@.a>null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than true\",\n      \"selector\": \"$[?@.a>true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than false\",\n      \"selector\": \"$[?@.a>false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a>='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a>=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to number\",\n      \"selector\": \"$[?@.a>=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to null\",\n      \"selector\": \"$[?@.a>=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to true\",\n      \"selector\": \"$[?@.a>=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to false\",\n      \"selector\": \"$[?@.a>=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and not-equals null, absent from data\",\n      \"selector\": \"$[?@.a&&@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and exists, data false\",\n      \"selector\": \"$[?@.a&&@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists or exists, data false\",\n      \"selector\": \"$[?@.a||@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, and\",\n      \"selector\": \"$[?@.a>0&&@.a<10]\",\n      \"document\": [\n        {\n          \"a\": -10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, or\",\n      \"selector\": \"$[?@.a=='b'||@.a=='d']\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not expression\",\n      \"selector\": \"$[?!(@.a=='b')]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists, data null\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, wildcard\",\n      \"selector\": \"$[?@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        {\n          \"a\": 3\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, multiple\",\n      \"selector\": \"$[?@[0, 0, 'a']]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"b\": 4\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, slice\",\n      \"selector\": \"$[?@[0:2]]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, negated\",\n      \"selector\": \"$[?!@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        1,\n        [],\n        {}\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, slice\",\n      \"selector\": \"$[?@[0:0]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, all children\",\n      \"selector\": \"$[?@[*]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, descendants\",\n      \"selector\": \"$[?@..a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, combined\",\n      \"selector\": \"$[?@.a[*].a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, nested\",\n      \"selector\": \"$[?@[?@>1]]\",\n      \"document\": [\n        [\n          0\n        ],\n        [\n          0,\n          1\n        ],\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result\": [\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, name segment on primitive, selects nothing\",\n      \"selector\": \"$[?@.a == 1]\",\n      \"document\": {\n        \"a\": 1\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, name segment on array, selects nothing\",\n      \"selector\": \"$[?@['0'] == 5]\",\n      \"document\": [\n        [\n          5,\n          6\n        ]\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, index segment on object, selects nothing\",\n      \"selector\": \"$[?@[0] == 5]\",\n      \"document\": [\n        {\n          \"0\": 5\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, followed by name selector\",\n      \"selector\": \"$[?@.a==1].b.x\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"b\": {\n            \"x\": 2\n          }\n        }\n      ],\n      \"result\": [\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]['b']['x']\"\n      ]\n    },\n    {\n      \"name\": \"filter, followed by child segment that selects multiple elements\",\n      \"selector\": \"$[?@.z=='_']['x','y']\",\n      \"document\": [\n        {\n          \"x\": 1,\n          \"y\": null,\n          \"z\": \"_\"\n        }\n      ],\n      \"result\": [\n        1,\n        null\n      ],\n      \"result_paths\": [\n        \"$[0]['x']\",\n        \"$[0]['y']\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, equal\",\n      \"selector\": \"$[?(@[0, 0]==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, not equal\",\n      \"selector\": \"$[?(@[0, 0]!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, less-or-equal\",\n      \"selector\": \"$[?(@[0, 0]<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, equal\",\n      \"selector\": \"$[?(@['a', 'a']==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, not equal\",\n      \"selector\": \"$[?(@['a', 'a']!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, less-or-equal\",\n      \"selector\": \"$[?(@['a', 'a']<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular quer"},"files":{"packages/hurl_core/tests/json/asterisk.json":"{ \"*\": {} }","packages/hurl_core/tests/json/elasticsearch.json":"{\n  \"from\": 0,\n  \"size\": 2000,\n  \"sort\": [\n    {\n      \"@timestamp\": \"desc\"\n    }\n  ],\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"match\": {\n            \"tag.env\": \"prod\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.r_code\": \"500\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.q_client-dns\": \"m.shop.sosh.fr\"\n          }\n        },\n        {\n          \"match\": {\n            \"@timestamp\": {\n              \"query\": \"{{date}}\"\n            }\n          }\n        }\n      ]\n    }\n  }\n}","packages/hurlfmt/README.md":"hurlfmt\n=====================================\n\nThe hurlfmt crate provides the `hurlfmt` binary.\nIt can format hurl files and to export them to JSON/HTML.\n","packages/hurl_core/README.md":"hurl_core\n===============\n\nThe hurl_core crate provides the common functionalities used by both hurl and hurlfmt.\n\n","packages/hurl/README.md":"<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/logo-light.svg\" > \n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/logo-dark.svg\" > \n    <img src=\"https://hurl.dev/assets/img/logo-light.svg\" width=\"264px\" alt=\"Hurl Logo\">\n</picture>\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 <b>HTTP requests</b> defined in a simple <b>plain text format</b>.\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 <b>fetching data</b> and <b>testing HTTP</b> sessions.\n\nHurl makes it easy to work with <b>HTML</b> content, <b>REST / SOAP / GraphQL</b> APIs, or any other <b>XML / JSON</b> based APIs. \n\n```hurl\n# Go home and capture token\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\n[Form]\nuser: toto\npassword: 1234\ntoken: {{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 <b>test HTTP responses</b>.\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<a href=\"https://hurl.dev/player.html?id=starwars&speed=3\"><img src=\"https://hurl.dev/assets/img/poster-starwars.png\" width=\"100%\" alt=\"Hurl Demo\"/></a>\n\n\nIt is well adapted for <b>REST / JSON APIs</b>\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<b>HTML content</b>\n\n```hurl\nGET https://example.org\nHTTP 200\n[Asserts]\nxpath \"normalize-space(//head/title)\" == \"Hello world!\"\n```\n\n<b>GraphQL</b> \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 <b>SOAP APIs</b>\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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\nHTTP 200\n```\n\nHurl can also be used to test the <b>performance</b> of HTTP endpoints\n\n```hurl\nGET https://example.org/api/v1/pets\nHTTP 200\n[Asserts]\nduration < 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 <b>integrate in CI/CD</b>, with text, JUnit, TAP and HTML reports\n\n<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-light.png\">\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-dark.png\">\n    <img src=\"https://hurl.dev/assets/img/home-waterfall-light.png\" width=\"480\" alt=\"HTML report\"/>\n</picture>\n\n# Why Hurl?\n\n<ul class=\"showcase-container\">\n    <li><b>Text Format:</b> for both devops and developers</li>\n    <li><b>Fast CLI:</b> a command line for local dev and continuous integration</li>\n    <li><b>Single Binary:</b> easy to install, with no runtime required</li>\n</ul>\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 / 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        * [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 / Ubuntu](#debian--ubuntu)\n            * [Alpine](#alpine)\n            * [Arch Linux / Manjaro](#arch-linux--manjaro)\n            * [NixOS / Nix](#nixos--nix)\n            * [Guix](#guix)\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.org/cats/123\n[Options]\noutput: cat123.txt    # use - to output to stdout\nHTTP 200\n\nGET https://example.org/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&search=something%20to%20search&count=100\n```\n\n> 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<div>Hello <b>World</b>!</div>\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### 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<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Request>\n    <Login>{{login}}</Login>\n    <Password>{{password}}</Password>\n</Request>\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-query)\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 >= 200\nstatus < 300\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#status-assert)\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\" 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 /^order-\\d{8}$/  # Alternative syntax with regex literal\njsonpath \"$.id\" matches /(?i)[a-z]*/        # See syntax for flags <https://docs.rs/regex/latest/regex/#grouping-and-flags>\njsonpath \"$.created\" isIsoDate\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#jsonpath-assert)\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 > 15\ncertificate \"Serial-Number\" matches /[\\da-f]+/\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://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\", \"<strong>any</strong> 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<catalog>\n   <book id=\"bk101\">\n      <author>Gambardella, Matthew</author>\n      <title>XML Developer's Guide</title>\n      <genre>Computer</genre>\n      <price>44.95</price>\n      <publish_date>2000-10-01</publish_date>\n      <description>An in-depth look at creating applications with XML.</description>\n   </book>\n</catalog>\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### 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://example.org/step1\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step2\"\n\n\nGET https://example.org/step2\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step3\"\n\n\nGET https://example.org/step3\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://example.org/step1\n[Options]\nlocation: true\nHTTP 200\n[Asserts]\nredirects count == 2\nredirects nth 0 location == \"https://example.org/step2\"\nredirects nth 1 location == \"https://example.org/step3\"\n```\n\n```hurl\nGET https://example.org/step1\n[Options]\nlocation-trusted: true\nHTTP 200\n[Asserts]\nredirects last location == \"https://example.org/step2\"\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#redirects-assert)\n\n## Debug Tips\n\n### Verbose Mode\n\nTo get more info on a given request/response, use [`[Options]` section](https://hurl.dev/docs/request.html#options):\n\n```hurl\nGET https://example.org\nHTTP 200\n\nGET https://example.org/api/cats/123\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://hurl.dev/docs/manual.html#very-verbose)\n\n### Error Format\n\n```shell\n$ hurl --test --error-format long *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.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://foo.com/failure\n[Options]\n# use - to output on standard output, foo.bin to save on disk \noutput: -\nHTTP 200\n\nGET https://foo.com/success\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/manual.html#output)\n\n### Export curl Commands\n\n```shell\n$ hurl ---curl /tmp/curl.txt *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.html#curl)\n\n### Using Proxy\n\nUse `--proxy` on a specific request or globally as command line option:\n\n```hurl\nGET https://foo.com/a\nHTTP 200\n\nGET https://foo.com/b\n[Options]\nproxy: localhost:8888\nHTTP 200\n\nGET https://foo.com/c\nHTTP 200\n```\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### 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) can be done using implicit asserts:\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\nOr explicit:\n\n```hurl\nGET https://foo.com\nHTTP 200\n[Asserts]\nversion == \"3\"\n\nGET https://bar.com\nHTTP 200\n[Asserts]\nversion == \"2\"\nversion toFloat > 1.1\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://foo.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://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 < 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\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&password=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## 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 / 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&password=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## 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, except if they are tagged as cli-only \n(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\nHurl looks also for a configuration file at the following places `$XDG_CONFIG_HOME/hurl/config` if `$XDG_CONFIG_HOME` exists,\nor `$HOME/.config/hurl/config`. The configuration file is a list of options added to each Hurl run.\n\n```shell\n$ cat ~/.config/hurl/config\n# Hurl config file\n--header x-identifier:quux\n--verbose\n--delay=1s\n--fail-with-body\n```\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 four sources from the lowest priority (most easily overridden) to highest (overrides all others):\n\n- Configuration file (ex: `~/.config/hurl/config`)\n- Environment variables (ex: `export HURL_INSECURE=true`)\n- Command-line options (ex: `hurl --insecure`)\n- Options section options (ex: `insecure: true` in file)\n\n## All Options\n\n### HTTP options\n\n| Option                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                   |\n|-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| <a href=\"#aws-sigv4\" id=\"aws-sigv4\"><code>--aws-sigv4 &lt;PROVIDER1[:PROVIDER2[:REGION[:SERVICE]]]&gt;</code></a> | Generate an `Authorization` header with an AWS SigV4 signature.<br><br>Use [`-u, --user`](#user) to specify Access Key Id (username) and Secret Key (password).<br><br>To use temporary session credentials (e.g. for an AWS IAM Role), add the `X-Amz-Security-Token` header containing the session token.<br>                                                                                                               |\n| <a href=\"#cacert\" id=\"cacert\"><code>--cacert &lt;FILE&gt;</code></a>                                              | Specifies the certificate file for peer verification. The file may contain multiple CA certificates and must be in PEM format.<br>Normally Hurl is built to use a default file for this, so this option is typically used to alter that default file.<br>                                                                                                                                                                     |\n| <a href=\"#cert\" id=\"cert\"><code>-E, --cert &lt;CERTIFICATE[:PASSWORD]&gt;</code></a>                              | Client certificate file and password.<br><br>See also [`--key`](#key).<br>                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#compressed\" id=\"compressed\"><code>--compressed</code></a>                                               | Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.<br><br>Environment variables: HURL_COMPRESSED<br>                                                                                                                                                                                                                                                       |\n| <a href=\"#connect-timeout\" id=\"connect-timeout\"><code>--connect-timeout &lt;SECONDS&gt;</code></a>                | Maximum time in seconds that you allow Hurl's connection to take.<br><br>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.<br><br>See also [`-m, --max-time`](#max-time).<br><br>Environment variables: HURL_CONNECT_TIMEOUT<br>               |\n| <a href=\"#connect-to\" id=\"connect-to\"><code>--connect-to &lt;HOST1:PORT1:HOST2:PORT2&gt;</code></a>               | 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.<br><br>See also [`--resolve`](#resolve).<br>                                                                                                                                                                                                                                            |\n| <a href=\"#digest\" id=\"digest\"><code>--digest</code></a>                                                           | Tell Hurl to use HTTP Digest authentication<br>                                                                                                                                                                                                                                                                                                                                                                               |\n| <a href=\"#header\" id=\"header\"><code>-H, --header &lt;NAME:VALUE&gt;</code></a>                                    | Add an extra header to include in information sent. Can be used several times in a command.<br><br>Do not add newlines or carriage returns.<br><br>Environment variables: HURL_HEADER='name1:value1&#124;name2:value2' (headers are separated by &#124;)<br>                                                                                                                                                                  |\n| <a href=\"#http10\" id=\"http10\"><code>-0, --http1.0</code></a>                                                      | Tells Hurl to use HTTP version 1.0 instead of using its internally preferred HTTP version.<br><br>Environment variables: HURL_HTTP10<br>                                                                                                                                                                                                                                                                                      |\n| <a href=\"#http11\" id=\"http11\"><code>--http1.1</code></a>                                                          | Tells Hurl to use HTTP version 1.1.<br><br>Environment variables: HURL_HTTP11<br>                                                                                                                                                                                                                                                                                                                                             |\n| <a href=\"#http2\" id=\"http2\"><code>--http2</code></a>                                                              | Tells Hurl to use HTTP version 2.<br>For HTTPS, this means Hurl negotiates HTTP/2 in the TLS handshake. Hurl does this by default.<br>For HTTP, this means Hurl attempts to upgrade the request to HTTP/2 using the Upgrade: request header.<br><br>Environment variables: HURL_HTTP2<br>                                                                                                                                     |\n| <a href=\"#http2-prior-knowledge\" id=\"http2-prior-knowledge\"><code>--http2-prior-knowledge</code></a>              | Tells Hurl to issue a non-TLS HTTP request using HTTP/2 directly without HTTP/1.1 Upgrade. It requires prior knowledge that the server supports HTTP/2 straight away. HTTPS requests still do HTTP/2 the standard way with negotiated protocol versions in the TLS handshake.<br><br>Environment variables: HURL_HTTP2_PRIOR_KNOWLEDGE<br>                                                                                    |\n| <a href=\"#http3\" id=\"http3\"><code>--http3</code></a>                                                              | Tells Hurl to try HTTP version 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.<br><br>Environment variables: HURL_HTTP3<br>                                                                                                                                                                           |\n| <a href=\"#insecure\" id=\"insecure\"><code>-k, --insecure</code></a>                                                 | This option explicitly allows Hurl to perform \"insecure\" SSL connections and transfers.<br><br>Environment variables: HURL_INSECURE<br>                                                                                                                                                                                                                                                                                       |\n| <a href=\"#ipv4\" id=\"ipv4\"><code>-4, --ipv4</code></a>                                                             | This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6.<br><br>Environment variables: HURL_IPV4<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#ipv6\" id=\"ipv6\"><code>-6, --ipv6</code></a>                                                             | This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4.<br><br>Environment variables: HURL_IPV6<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#key\" id=\"key\"><code>--key &lt;KEY&gt;</code></a>                                                        | Private key file name.<br>                                                                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#limit-rate\" id=\"limit-rate\"><code>--limit-rate &lt;SPEED&gt;</code></a>                                 | 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.<br>The given speed is measured in bytes/second.<br><br>Environment variables: HURL_LIMIT_RATE<br>                                                                  |\n| <a href=\"#location\" id=\"location\"><code>-L, --location</code></a>                                                 | Follow redirect. To limit the amount of redirects to follow use the [`--max-redirs`](#max-redirs) option<br><br>Environment variables: HURL_LOCATION<br>                                                                                                                                                                                                                                                                      |\n| <a href=\"#location-trusted\" id=\"location-trusted\"><code>--location-trusted</code></a>                             | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.<br>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).<br><br>Environment variables: HURL_LOCATION_TRUSTED<br>                                               |\n| <a href=\"#max-filesize\" id=\"max-filesize\"><code>--max-filesize &lt;BYTES&gt;</code></a>                           | 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.<br><br>Environment variables: HURL_MAX_FILESIZE<br><br>This is a cli-only option.<br>                                                                                                                                                                                                  |\n| <a href=\"#max-redirs\" id=\"max-redirs\"><code>--max-redirs &lt;NUM&gt;</code></a>                                   | Set maximum number of redirection-followings allowed<br><br>By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.<br><br>Environment variables: HURL_MAX_REDIRS<br>                                                                                                                                                                                                                    |\n| <a href=\"#max-time\" id=\"max-time\"><code>-m, --max-time &lt;SECONDS&gt;</code></a>                                 | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.<br><br>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.<br><br>See also [`--connect-timeout`](#connect-timeout).<br><br>Environment variables: HURL_MAX_TIME<br> |\n| <a href=\"#negotiate\" id=\"negotiate\"><code>--negotiate</code></a>                                                  | Tell Hurl to use Negotiate (SPNEGO) authentication.<br>                                                                                                                                                                                                                                                                                                                                                                       |\n| <a href=\"#no-cookie-store\" id=\"no-cookie-store\"><code>--no-cookie-store</code></a>                                | Do not use cookie storage for requests/responses in a file. By default, requests in the same Hurl file share cookie storage, this option deactivates cookie engine.<br><br>Environment variables: HURL_NO_COOKIE_STORE<br><br>This is a cli-only option.<br>                                                                                                                                                                  |\n| <a href=\"#no-header\" id=\"no-header\"><code>--no-header &lt;NAME&gt;</code></a>                                     | Remove a header from information sent. Can be used several times in a command.<br><br>Environment variables: HURL_NO_HEADER='name1&#124;name2' (names are separated by &#124;)<br>                                                                                                                                                                                                                                            |\n| <a href=\"#no-proxy\" id=\"no-proxy\"><code>--no-proxy &lt;HOST(S)&gt;</code></a>                                     | Comma-separated list of hosts which do not use a proxy.<br><br>Environment variables: no_proxy<br>                                                                                                                                                                                                                                                                                                                            |\n| <a href=\"#ntlm\" id=\"ntlm\"><code>--ntlm</code><","packages/hurl_core/tests/json/variable.json":"{\n  \"name\": \"{{name}}\",\n  \"password\": \"secret\",\n  \"age\": {{age}},\n  \"strict\": {{strict}}\n}","packages/hurl/tests/bookstore.json":"{\n  \"store\": {\n    \"book\": [\n      {\n        \"category\": \"reference\",\n        \"author\": \"Nigel Rees\",\n        \"title\": \"Sayings of the Century\",\n        \"price\": 8.95\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Evelyn Waugh\",\n        \"title\": \"Sword of Honour\",\n        \"price\": 12.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Herman Melville\",\n        \"title\": \"Moby Dick\",\n        \"isbn\": \"0-553-21311-3\",\n        \"price\": 8.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"J. R. R. Tolkien\",\n        \"title\": \"The Lord of the Rings\",\n        \"isbn\": \"0-395-19395-8\",\n        \"price\": 22.99\n      }\n    ],\n    \"bicycle\": {\n      \"color\": \"red\",\n      \"price\": 19.95\n    }\n  }\n}","packages/hurl_core/tests/json/g_clef.json":"{\n  \"encoding1\": \"\\uD834\\uDD1E\"\n}","packages/hurl_core/tests/json/person.json":"{\n  \"firstName\": \"John\",\n  \"lastName\": \"Smith\",\n  \"isAlive\": true,\n  \"age\": 27,\n  \"address\": {\n    \"streetAddress\": \"21 2nd Street\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postalCode\": \"10021-3100\"\n  },\n  \"phoneNumbers\": [\n    {\n      \"type\": \"home\",\n      \"number\": \"212 555-1234\"\n    },\n    {\n      \"type\": \"office\",\n      \"number\": \"646 555-4567\"\n    }\n  ],\n  \"children\": [],\n  \"spouse\": null\n}","packages/hurl_core/tests/json/hello.json":"\"Hello {{Name}}!\"","packages/hurl/src/jsonpath/tests/cts.json":"{\n  \"description\": \"JSONPath Compliance Test Suite. This file is autogenerated, do not edit.\",\n  \"tests\": [\n    {\n      \"name\": \"basic, root\",\n      \"selector\": \"$\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        [\n          \"first\",\n          \"second\"\n        ]\n      ],\n      \"result_paths\": [\n        \"$\"\n      ]\n    },\n    {\n      \"name\": \"basic, no leading whitespace\",\n      \"selector\": \" $\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, no trailing whitespace\",\n      \"selector\": \"$ \",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand\",\n      \"selector\": \"$.a\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, extended unicode ☺\",\n      \"selector\": \"$.☺\",\n      \"document\": {\n        \"☺\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['☺']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, underscore\",\n      \"selector\": \"$._\",\n      \"document\": {\n        \"_\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['_']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, symbol\",\n      \"selector\": \"$.&\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, number\",\n      \"selector\": \"$.1\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, absent data\",\n      \"selector\": \"$.c\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, array data\",\n      \"selector\": \"$.a\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, object data, nested\",\n      \"selector\": \"$.a.b.c\",\n      \"document\": {\n        \"a\": {\n          \"b\": {\n            \"c\": \"C\"\n          }\n        }\n      },\n      \"result\": [\n        \"C\"\n      ],\n      \"result_paths\": [\n        \"$['a']['b']['c']\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, object data\",\n      \"selector\": \"$.*\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\"\n        ],\n        [\n          \"B\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, array data\",\n      \"selector\": \"$.*\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard selector, array data\",\n      \"selector\": \"$[*]\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, then name shorthand\",\n      \"selector\": \"$.*.a\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"Ax\",\n          \"b\": \"Bx\"\n        },\n        \"y\": {\n          \"a\": \"Ay\",\n          \"b\": \"By\"\n        }\n      },\n      \"results\": [\n        [\n          \"Ax\",\n          \"Ay\"\n        ],\n        [\n          \"Ay\",\n          \"Ax\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['y']['a']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['x']['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors\",\n      \"selector\": \"$[0,2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, space instead of comma\",\n      \"selector\": \"$[0 2]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, selector, leading comma\",\n      \"selector\": \"$[,0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, selector, trailing comma\",\n      \"selector\": \"$[0,]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, array data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, object data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": 2\n      },\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice\",\n      \"selector\": \"$[1,5:7]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        5,\n        6\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[5]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice, overlapping\",\n      \"selector\": \"$[1,0:3]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, duplicate index\",\n      \"selector\": \"$[1,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and index\",\n      \"selector\": \"$[*,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and name\",\n      \"selector\": \"$[*,'a']\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\",\n          \"A\"\n        ],\n        [\n          \"B\",\n          \"A\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and slice\",\n      \"selector\": \"$[*,0:2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, multiple wildcards\",\n      \"selector\": \"$[*,*]\",\n      \"document\": [\n        0,\n        1,\n        2\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, empty segment\",\n      \"selector\": \"$[]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, descendant segment, index\",\n      \"selector\": \"$..[1]\",\n      \"document\": {\n        \"o\": [\n          0,\n          1,\n          [\n            2,\n            3\n          ]\n        ]\n      },\n      \"result\": [\n        1,\n        3\n      ],\n      \"result_paths\": [\n        \"$['o'][1]\",\n        \"$['o'][2][1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, name shorthand\",\n      \"selector\": \"$..a\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          },\n          {\n            \"a\": \"c\"\n          }\n        ]\n      },\n      \"result\": [\n        \"b\",\n        \"c\"\n      ],\n      \"result_paths\": [\n        \"$['o'][0]['a']\",\n        \"$['o'][1]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, true\",\n      \"selector\": \"$.true\",\n      \"document\": {\n        \"true\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['true']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, false\",\n      \"selector\": \"$.false\",\n      \"document\": {\n        \"false\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['false']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, null\",\n      \"selector\": \"$.null\",\n      \"document\": {\n        \"null\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['null']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, array data\",\n      \"selector\": \"$..*\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, array data\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested arrays\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        [\n          [\n            1\n          ]\n        ],\n        [\n          2\n        ]\n      ],\n      \"results\": [\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          1,\n          2\n        ],\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          2,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[0][0][0]\",\n          \"$[1][0]\"\n        ],\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[1][0]\",\n          \"$[0][0][0]\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested objects\",\n      \"selector\": \"$..[*]\",\n      \"document\": {\n        \"a\": {\n          \"c\": {\n            \"e\": 1\n          }\n        },\n        \"b\": {\n          \"d\": 2\n        }\n      },\n      \"results\": [\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, object data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"a\": \"b\"\n      },\n      \"result\": [\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, nested data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          }\n        ]\n      },\n      \"result\": [\n        [\n          {\n            \"a\": \"b\"\n          }\n        ],\n        {\n          \"a\": \"b\"\n        },\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['o']\",\n        \"$['o'][0]\",\n        \"$['o'][0]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        \"b\",\n        \"e\",\n        \"c\",\n        \"f\"\n      ],\n      \"result_paths\": [\n        \"$[0]['a']\",\n        \"$[0]['d']\",\n        \"$[1]['a']\",\n        \"$[1]['d']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, object traversal, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        \"y\": {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      },\n      \"results\": [\n        [\n          \"b\",\n          \"e\",\n          \"c\",\n          \"f\"\n        ],\n        [\n          \"c\",\n          \"f\",\n          \"b\",\n          \"e\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['x']['d']\",\n          \"$['y']['a']\",\n          \"$['y']['d']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['y']['d']\",\n          \"$['x']['a']\",\n          \"$['x']['d']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, bald descendant segment\",\n      \"selector\": \"$..\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, current node identifier without filter selector\",\n      \"selector\": \"$[@.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, root node identifier in brackets without filter selector\",\n      \"selector\": \"$[$.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, existence, without segments\",\n      \"selector\": \"$[?@]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, existence\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, existence, present with null\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, without segments\",\n      \"selector\": \"$[?$]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, with segments\",\n      \"selector\": \"$[?$.*.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, single quotes\",\n      \"selector\": \"$[?@.a=='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a=='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals number\",\n      \"selector\": \"$[?@.a==1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null, absent from data\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, equals true\",\n      \"selector\": \"$[?@.a==true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals false\",\n      \"selector\": \"$[?@.a==false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals self\",\n      \"selector\": \"$[?@==@]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute, equals self\",\n      \"selector\": \"$[?$==$]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals, absent from index selector equals absent from name selector\",\n      \"selector\": \"$[?@.absent==@.list[9]]\",\n      \"document\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, arrays\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": [\n            1,\n            2\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              [\n                2\n              ],\n              1\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              2\n            ]\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, objects\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 2\n            }\n          }\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a!='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes, different type\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes, different types\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number, different types\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null, absent from data\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals true\",\n      \"selector\": \"$[?@.a!=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals false\",\n      \"selector\": \"$[?@.a!=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, single quotes\",\n      \"selector\": \"$[?@.a<'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, double quotes\",\n      \"selector\": \"$[?@.a<\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than number\",\n      \"selector\": \"$[?@.a<10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than null\",\n      \"selector\": \"$[?@.a<null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than true\",\n      \"selector\": \"$[?@.a<true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than false\",\n      \"selector\": \"$[?@.a<false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a<='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a<=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to number\",\n      \"selector\": \"$[?@.a<=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to null\",\n      \"selector\": \"$[?@.a<=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to true\",\n      \"selector\": \"$[?@.a<=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to false\",\n      \"selector\": \"$[?@.a<=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, single quotes\",\n      \"selector\": \"$[?@.a>'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, double quotes\",\n      \"selector\": \"$[?@.a>\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than number\",\n      \"selector\": \"$[?@.a>10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than null\",\n      \"selector\": \"$[?@.a>null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than true\",\n      \"selector\": \"$[?@.a>true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than false\",\n      \"selector\": \"$[?@.a>false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a>='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a>=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to number\",\n      \"selector\": \"$[?@.a>=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to null\",\n      \"selector\": \"$[?@.a>=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to true\",\n      \"selector\": \"$[?@.a>=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to false\",\n      \"selector\": \"$[?@.a>=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and not-equals null, absent from data\",\n      \"selector\": \"$[?@.a&&@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and exists, data false\",\n      \"selector\": \"$[?@.a&&@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists or exists, data false\",\n      \"selector\": \"$[?@.a||@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, and\",\n      \"selector\": \"$[?@.a>0&&@.a<10]\",\n      \"document\": [\n        {\n          \"a\": -10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, or\",\n      \"selector\": \"$[?@.a=='b'||@.a=='d']\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not expression\",\n      \"selector\": \"$[?!(@.a=='b')]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists, data null\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, wildcard\",\n      \"selector\": \"$[?@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        {\n          \"a\": 3\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, multiple\",\n      \"selector\": \"$[?@[0, 0, 'a']]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"b\": 4\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, slice\",\n      \"selector\": \"$[?@[0:2]]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, negated\",\n      \"selector\": \"$[?!@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        1,\n        [],\n        {}\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, slice\",\n      \"selector\": \"$[?@[0:0]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, all children\",\n      \"selector\": \"$[?@[*]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, descendants\",\n      \"selector\": \"$[?@..a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, combined\",\n      \"selector\": \"$[?@.a[*].a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, nested\",\n      \"selector\": \"$[?@[?@>1]]\",\n      \"document\": [\n        [\n          0\n        ],\n        [\n          0,\n          1\n        ],\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result\": [\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, name segment on primitive, selects nothing\",\n      \"selector\": \"$[?@.a == 1]\",\n      \"document\": {\n        \"a\": 1\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, name segment on array, selects nothing\",\n      \"selector\": \"$[?@['0'] == 5]\",\n      \"document\": [\n        [\n          5,\n          6\n        ]\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, index segment on object, selects nothing\",\n      \"selector\": \"$[?@[0] == 5]\",\n      \"document\": [\n        {\n          \"0\": 5\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, followed by name selector\",\n      \"selector\": \"$[?@.a==1].b.x\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"b\": {\n            \"x\": 2\n          }\n        }\n      ],\n      \"result\": [\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]['b']['x']\"\n      ]\n    },\n    {\n      \"name\": \"filter, followed by child segment that selects multiple elements\",\n      \"selector\": \"$[?@.z=='_']['x','y']\",\n      \"document\": [\n        {\n          \"x\": 1,\n          \"y\": null,\n          \"z\": \"_\"\n        }\n      ],\n      \"result\": [\n        1,\n        null\n      ],\n      \"result_paths\": [\n        \"$[0]['x']\",\n        \"$[0]['y']\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, equal\",\n      \"selector\": \"$[?(@[0, 0]==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, not equal\",\n      \"selector\": \"$[?(@[0, 0]!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, less-or-equal\",\n      \"selector\": \"$[?(@[0, 0]<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, equal\",\n      \"selector\": \"$[?(@['a', 'a']==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, not equal\",\n      \"selector\": \"$[?(@['a', 'a']!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, less-or-equal\",\n      \"selector\": \"$[?(@['a', 'a']<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular quer"},"items":[{"name":"asterisk.json","path":"packages/hurl_core/tests/json/asterisk.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl_core/tests/json/asterisk.json","title":"Json Skill","category":"anthropic-skill","format":"json","content":"{ \"*\": {} }","frontmatter":{"*":{}},"isInternal":false,"tokens":5,"sizeBytes":11},{"name":"elasticsearch.json","path":"packages/hurl_core/tests/json/elasticsearch.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl_core/tests/json/elasticsearch.json","title":"Json Skill","category":"anthropic-skill","format":"json","content":"{\n  \"from\": 0,\n  \"size\": 2000,\n  \"sort\": [\n    {\n      \"@timestamp\": \"desc\"\n    }\n  ],\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"match\": {\n            \"tag.env\": \"prod\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.r_code\": \"500\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.q_client-dns\": \"m.shop.sosh.fr\"\n          }\n        },\n        {\n          \"match\": {\n            \"@timestamp\": {\n              \"query\": \"{{date}}\"\n            }\n          }\n        }\n      ]\n    }\n  }\n}","frontmatter":{"from":0,"size":2000,"sort":[{"@timestamp":"desc"}],"query":{"bool":{"must":[{"match":{"tag.env":"prod"}},{"match":{"data.r_code":"500"}},{"match":{"data.q_client-dns":"m.shop.sosh.fr"}},{"match":{"@timestamp":{"query":"{{date}}"}}}]}}},"isInternal":false,"tokens":146,"sizeBytes":553},{"name":"g_clef.json","path":"packages/hurl_core/tests/json/g_clef.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl_core/tests/json/g_clef.json","title":"Json Skill","category":"anthropic-skill","format":"json","content":"{\n  \"encoding1\": \"\\uD834\\uDD1E\"\n}","frontmatter":{"encoding1":"𝄞"},"isInternal":false,"tokens":15,"sizeBytes":33},{"name":"hello.json","path":"packages/hurl_core/tests/json/hello.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl_core/tests/json/hello.json","title":"Json Skill","category":"anthropic-skill","format":"json","content":"\"Hello {{Name}}!\"","isInternal":false,"tokens":6,"sizeBytes":17},{"name":"person.json","path":"packages/hurl_core/tests/json/person.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl_core/tests/json/person.json","title":"Json Skill","category":"anthropic-skill","format":"json","content":"{\n  \"firstName\": \"John\",\n  \"lastName\": \"Smith\",\n  \"isAlive\": true,\n  \"age\": 27,\n  \"address\": {\n    \"streetAddress\": \"21 2nd Street\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postalCode\": \"10021-3100\"\n  },\n  \"phoneNumbers\": [\n    {\n      \"type\": \"home\",\n      \"number\": \"212 555-1234\"\n    },\n    {\n      \"type\": \"office\",\n      \"number\": \"646 555-4567\"\n    }\n  ],\n  \"children\": [],\n  \"spouse\": null\n}","frontmatter":{"firstName":"John","lastName":"Smith","isAlive":true,"age":27,"address":{"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null},"isInternal":false,"tokens":142,"sizeBytes":406},{"name":"variable.json","path":"packages/hurl_core/tests/json/variable.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl_core/tests/json/variable.json","title":"Json Skill","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"{{name}}\",\n  \"password\": \"secret\",\n  \"age\": {{age}},\n  \"strict\": {{strict}}\n}","isInternal":false,"tokens":31,"sizeBytes":90},{"name":"cts.json","path":"packages/hurl/src/jsonpath/tests/cts.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl/src/jsonpath/tests/cts.json","title":"Tests Skill","category":"anthropic-skill","format":"json","content":"{\n  \"description\": \"JSONPath Compliance Test Suite. This file is autogenerated, do not edit.\",\n  \"tests\": [\n    {\n      \"name\": \"basic, root\",\n      \"selector\": \"$\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        [\n          \"first\",\n          \"second\"\n        ]\n      ],\n      \"result_paths\": [\n        \"$\"\n      ]\n    },\n    {\n      \"name\": \"basic, no leading whitespace\",\n      \"selector\": \" $\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, no trailing whitespace\",\n      \"selector\": \"$ \",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand\",\n      \"selector\": \"$.a\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, extended unicode ☺\",\n      \"selector\": \"$.☺\",\n      \"document\": {\n        \"☺\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['☺']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, underscore\",\n      \"selector\": \"$._\",\n      \"document\": {\n        \"_\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['_']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, symbol\",\n      \"selector\": \"$.&\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, number\",\n      \"selector\": \"$.1\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, absent data\",\n      \"selector\": \"$.c\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, array data\",\n      \"selector\": \"$.a\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, object data, nested\",\n      \"selector\": \"$.a.b.c\",\n      \"document\": {\n        \"a\": {\n          \"b\": {\n            \"c\": \"C\"\n          }\n        }\n      },\n      \"result\": [\n        \"C\"\n      ],\n      \"result_paths\": [\n        \"$['a']['b']['c']\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, object data\",\n      \"selector\": \"$.*\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\"\n        ],\n        [\n          \"B\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, array data\",\n      \"selector\": \"$.*\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard selector, array data\",\n      \"selector\": \"$[*]\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, then name shorthand\",\n      \"selector\": \"$.*.a\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"Ax\",\n          \"b\": \"Bx\"\n        },\n        \"y\": {\n          \"a\": \"Ay\",\n          \"b\": \"By\"\n        }\n      },\n      \"results\": [\n        [\n          \"Ax\",\n          \"Ay\"\n        ],\n        [\n          \"Ay\",\n          \"Ax\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['y']['a']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['x']['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors\",\n      \"selector\": \"$[0,2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, space instead of comma\",\n      \"selector\": \"$[0 2]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, selector, leading comma\",\n      \"selector\": \"$[,0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, selector, trailing comma\",\n      \"selector\": \"$[0,]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, array data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, object data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": 2\n      },\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice\",\n      \"selector\": \"$[1,5:7]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        5,\n        6\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[5]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice, overlapping\",\n      \"selector\": \"$[1,0:3]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, duplicate index\",\n      \"selector\": \"$[1,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and index\",\n      \"selector\": \"$[*,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and name\",\n      \"selector\": \"$[*,'a']\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\",\n          \"A\"\n        ],\n        [\n          \"B\",\n          \"A\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and slice\",\n      \"selector\": \"$[*,0:2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, multiple wildcards\",\n      \"selector\": \"$[*,*]\",\n      \"document\": [\n        0,\n        1,\n        2\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, empty segment\",\n      \"selector\": \"$[]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, descendant segment, index\",\n      \"selector\": \"$..[1]\",\n      \"document\": {\n        \"o\": [\n          0,\n          1,\n          [\n            2,\n            3\n          ]\n        ]\n      },\n      \"result\": [\n        1,\n        3\n      ],\n      \"result_paths\": [\n        \"$['o'][1]\",\n        \"$['o'][2][1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, name shorthand\",\n      \"selector\": \"$..a\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          },\n          {\n            \"a\": \"c\"\n          }\n        ]\n      },\n      \"result\": [\n        \"b\",\n        \"c\"\n      ],\n      \"result_paths\": [\n        \"$['o'][0]['a']\",\n        \"$['o'][1]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, true\",\n      \"selector\": \"$.true\",\n      \"document\": {\n        \"true\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['true']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, false\",\n      \"selector\": \"$.false\",\n      \"document\": {\n        \"false\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['false']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, null\",\n      \"selector\": \"$.null\",\n      \"document\": {\n        \"null\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['null']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, array data\",\n      \"selector\": \"$..*\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, array data\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested arrays\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        [\n          [\n            1\n          ]\n        ],\n        [\n          2\n        ]\n      ],\n      \"results\": [\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          1,\n          2\n        ],\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          2,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[0][0][0]\",\n          \"$[1][0]\"\n        ],\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[1][0]\",\n          \"$[0][0][0]\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested objects\",\n      \"selector\": \"$..[*]\",\n      \"document\": {\n        \"a\": {\n          \"c\": {\n            \"e\": 1\n          }\n        },\n        \"b\": {\n          \"d\": 2\n        }\n      },\n      \"results\": [\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, object data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"a\": \"b\"\n      },\n      \"result\": [\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, nested data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          }\n        ]\n      },\n      \"result\": [\n        [\n          {\n            \"a\": \"b\"\n          }\n        ],\n        {\n          \"a\": \"b\"\n        },\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['o']\",\n        \"$['o'][0]\",\n        \"$['o'][0]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        \"b\",\n        \"e\",\n        \"c\",\n        \"f\"\n      ],\n      \"result_paths\": [\n        \"$[0]['a']\",\n        \"$[0]['d']\",\n        \"$[1]['a']\",\n        \"$[1]['d']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, object traversal, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        \"y\": {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      },\n      \"results\": [\n        [\n          \"b\",\n          \"e\",\n          \"c\",\n          \"f\"\n        ],\n        [\n          \"c\",\n          \"f\",\n          \"b\",\n          \"e\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['x']['d']\",\n          \"$['y']['a']\",\n          \"$['y']['d']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['y']['d']\",\n          \"$['x']['a']\",\n          \"$['x']['d']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, bald descendant segment\",\n      \"selector\": \"$..\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, current node identifier without filter selector\",\n      \"selector\": \"$[@.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, root node identifier in brackets without filter selector\",\n      \"selector\": \"$[$.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, existence, without segments\",\n      \"selector\": \"$[?@]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, existence\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, existence, present with null\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, without segments\",\n      \"selector\": \"$[?$]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, with segments\",\n      \"selector\": \"$[?$.*.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, single quotes\",\n      \"selector\": \"$[?@.a=='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a=='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals number\",\n      \"selector\": \"$[?@.a==1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null, absent from data\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, equals true\",\n      \"selector\": \"$[?@.a==true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals false\",\n      \"selector\": \"$[?@.a==false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals self\",\n      \"selector\": \"$[?@==@]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute, equals self\",\n      \"selector\": \"$[?$==$]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals, absent from index selector equals absent from name selector\",\n      \"selector\": \"$[?@.absent==@.list[9]]\",\n      \"document\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, arrays\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": [\n            1,\n            2\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              [\n                2\n              ],\n              1\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              2\n            ]\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, objects\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 2\n            }\n          }\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a!='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes, different type\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes, different types\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number, different types\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null, absent from data\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals true\",\n      \"selector\": \"$[?@.a!=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals false\",\n      \"selector\": \"$[?@.a!=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, single quotes\",\n      \"selector\": \"$[?@.a<'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, double quotes\",\n      \"selector\": \"$[?@.a<\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than number\",\n      \"selector\": \"$[?@.a<10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than null\",\n      \"selector\": \"$[?@.a<null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than true\",\n      \"selector\": \"$[?@.a<true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than false\",\n      \"selector\": \"$[?@.a<false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a<='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a<=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to number\",\n      \"selector\": \"$[?@.a<=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to null\",\n      \"selector\": \"$[?@.a<=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to true\",\n      \"selector\": \"$[?@.a<=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to false\",\n      \"selector\": \"$[?@.a<=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, single quotes\",\n      \"selector\": \"$[?@.a>'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, double quotes\",\n      \"selector\": \"$[?@.a>\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than number\",\n      \"selector\": \"$[?@.a>10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than null\",\n      \"selector\": \"$[?@.a>null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than true\",\n      \"selector\": \"$[?@.a>true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than false\",\n      \"selector\": \"$[?@.a>false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a>='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a>=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to number\",\n      \"selector\": \"$[?@.a>=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to null\",\n      \"selector\": \"$[?@.a>=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to true\",\n      \"selector\": \"$[?@.a>=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to false\",\n      \"selector\": \"$[?@.a>=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and not-equals null, absent from data\",\n      \"selector\": \"$[?@.a&&@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and exists, data false\",\n      \"selector\": \"$[?@.a&&@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists or exists, data false\",\n      \"selector\": \"$[?@.a||@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, and\",\n      \"selector\": \"$[?@.a>0&&@.a<10]\",\n      \"document\": [\n        {\n          \"a\": -10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, or\",\n      \"selector\": \"$[?@.a=='b'||@.a=='d']\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not expression\",\n      \"selector\": \"$[?!(@.a=='b')]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists, data null\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, wildcard\",\n      \"selector\": \"$[?@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        {\n          \"a\": 3\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, multiple\",\n      \"selector\": \"$[?@[0, 0, 'a']]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"b\": 4\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, slice\",\n      \"selector\": \"$[?@[0:2]]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, negated\",\n      \"selector\": \"$[?!@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        1,\n        [],\n        {}\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, slice\",\n      \"selector\": \"$[?@[0:0]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, all children\",\n      \"selector\": \"$[?@[*]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, descendants\",\n      \"selector\": \"$[?@..a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, combined\",\n      \"selector\": \"$[?@.a[*].a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, nested\",\n      \"selector\": \"$[?@[?@>1]]\",\n      \"document\": [\n        [\n          0\n        ],\n        [\n          0,\n          1\n        ],\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result\": [\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, name segment on primitive, selects nothing\",\n      \"selector\": \"$[?@.a == 1]\",\n      \"document\": {\n        \"a\": 1\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, name segment on array, selects nothing\",\n      \"selector\": \"$[?@['0'] == 5]\",\n      \"document\": [\n        [\n          5,\n          6\n        ]\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, index segment on object, selects nothing\",\n      \"selector\": \"$[?@[0] == 5]\",\n      \"document\": [\n        {\n          \"0\": 5\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, followed by name selector\",\n      \"selector\": \"$[?@.a==1].b.x\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"b\": {\n            \"x\": 2\n          }\n        }\n      ],\n      \"result\": [\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]['b']['x']\"\n      ]\n    },\n    {\n      \"name\": \"filter, followed by child segment that selects multiple elements\",\n      \"selector\": \"$[?@.z=='_']['x','y']\",\n      \"document\": [\n        {\n          \"x\": 1,\n          \"y\": null,\n          \"z\": \"_\"\n        }\n      ],\n      \"result\": [\n        1,\n        null\n      ],\n      \"result_paths\": [\n        \"$[0]['x']\",\n        \"$[0]['y']\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, equal\",\n      \"selector\": \"$[?(@[0, 0]==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, not equal\",\n      \"selector\": \"$[?(@[0, 0]!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, less-or-equal\",\n      \"selector\": \"$[?(@[0, 0]<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, equal\",\n      \"selector\": \"$[?(@['a', 'a']==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, not equal\",\n      \"selector\": \"$[?(@['a', 'a']!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, less-or-equal\",\n      \"selector\": \"$[?(@['a', 'a']<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular quer","isInternal":false,"tokens":14085,"sizeBytes":50008},{"name":"bookstore.json","path":"packages/hurl/tests/bookstore.json","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl/tests/bookstore.json","title":"Tests Skill","category":"anthropic-skill","format":"json","content":"{\n  \"store\": {\n    \"book\": [\n      {\n        \"category\": \"reference\",\n        \"author\": \"Nigel Rees\",\n        \"title\": \"Sayings of the Century\",\n        \"price\": 8.95\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Evelyn Waugh\",\n        \"title\": \"Sword of Honour\",\n        \"price\": 12.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Herman Melville\",\n        \"title\": \"Moby Dick\",\n        \"isbn\": \"0-553-21311-3\",\n        \"price\": 8.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"J. R. R. Tolkien\",\n        \"title\": \"The Lord of the Rings\",\n        \"isbn\": \"0-395-19395-8\",\n        \"price\": 22.99\n      }\n    ],\n    \"bicycle\": {\n      \"color\": \"red\",\n      \"price\": 19.95\n    }\n  }\n}","frontmatter":{"store":{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],"bicycle":{"color":"red","price":19.95}}},"isInternal":false,"tokens":233,"sizeBytes":748},{"name":"README.md","path":"packages/hurl_core/README.md","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl_core/README.md","title":"hurl_core Documentation","category":"plugin-manifest","format":"markdown","content":"hurl_core\n===============\n\nThe hurl_core crate provides the common functionalities used by both hurl and hurlfmt.\n\n","isInternal":false,"tokens":22,"sizeBytes":115},{"name":"README.md","path":"packages/hurl/README.md","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurl/README.md","title":"hurl Documentation","category":"plugin-manifest","format":"markdown","content":"<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/logo-light.svg\" > \n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/logo-dark.svg\" > \n    <img src=\"https://hurl.dev/assets/img/logo-light.svg\" width=\"264px\" alt=\"Hurl Logo\">\n</picture>\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 <b>HTTP requests</b> defined in a simple <b>plain text format</b>.\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 <b>fetching data</b> and <b>testing HTTP</b> sessions.\n\nHurl makes it easy to work with <b>HTML</b> content, <b>REST / SOAP / GraphQL</b> APIs, or any other <b>XML / JSON</b> based APIs. \n\n```hurl\n# Go home and capture token\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\n[Form]\nuser: toto\npassword: 1234\ntoken: {{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 <b>test HTTP responses</b>.\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<a href=\"https://hurl.dev/player.html?id=starwars&speed=3\"><img src=\"https://hurl.dev/assets/img/poster-starwars.png\" width=\"100%\" alt=\"Hurl Demo\"/></a>\n\n\nIt is well adapted for <b>REST / JSON APIs</b>\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<b>HTML content</b>\n\n```hurl\nGET https://example.org\nHTTP 200\n[Asserts]\nxpath \"normalize-space(//head/title)\" == \"Hello world!\"\n```\n\n<b>GraphQL</b> \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 <b>SOAP APIs</b>\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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\nHTTP 200\n```\n\nHurl can also be used to test the <b>performance</b> of HTTP endpoints\n\n```hurl\nGET https://example.org/api/v1/pets\nHTTP 200\n[Asserts]\nduration < 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 <b>integrate in CI/CD</b>, with text, JUnit, TAP and HTML reports\n\n<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-light.png\">\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-dark.png\">\n    <img src=\"https://hurl.dev/assets/img/home-waterfall-light.png\" width=\"480\" alt=\"HTML report\"/>\n</picture>\n\n# Why Hurl?\n\n<ul class=\"showcase-container\">\n    <li><b>Text Format:</b> for both devops and developers</li>\n    <li><b>Fast CLI:</b> a command line for local dev and continuous integration</li>\n    <li><b>Single Binary:</b> easy to install, with no runtime required</li>\n</ul>\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 / 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        * [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 / Ubuntu](#debian--ubuntu)\n            * [Alpine](#alpine)\n            * [Arch Linux / Manjaro](#arch-linux--manjaro)\n            * [NixOS / Nix](#nixos--nix)\n            * [Guix](#guix)\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.org/cats/123\n[Options]\noutput: cat123.txt    # use - to output to stdout\nHTTP 200\n\nGET https://example.org/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&search=something%20to%20search&count=100\n```\n\n> 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<div>Hello <b>World</b>!</div>\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### 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<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Request>\n    <Login>{{login}}</Login>\n    <Password>{{password}}</Password>\n</Request>\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-query)\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 >= 200\nstatus < 300\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#status-assert)\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\" 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 /^order-\\d{8}$/  # Alternative syntax with regex literal\njsonpath \"$.id\" matches /(?i)[a-z]*/        # See syntax for flags <https://docs.rs/regex/latest/regex/#grouping-and-flags>\njsonpath \"$.created\" isIsoDate\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#jsonpath-assert)\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 > 15\ncertificate \"Serial-Number\" matches /[\\da-f]+/\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://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\", \"<strong>any</strong> 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<catalog>\n   <book id=\"bk101\">\n      <author>Gambardella, Matthew</author>\n      <title>XML Developer's Guide</title>\n      <genre>Computer</genre>\n      <price>44.95</price>\n      <publish_date>2000-10-01</publish_date>\n      <description>An in-depth look at creating applications with XML.</description>\n   </book>\n</catalog>\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### 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://example.org/step1\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step2\"\n\n\nGET https://example.org/step2\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step3\"\n\n\nGET https://example.org/step3\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://example.org/step1\n[Options]\nlocation: true\nHTTP 200\n[Asserts]\nredirects count == 2\nredirects nth 0 location == \"https://example.org/step2\"\nredirects nth 1 location == \"https://example.org/step3\"\n```\n\n```hurl\nGET https://example.org/step1\n[Options]\nlocation-trusted: true\nHTTP 200\n[Asserts]\nredirects last location == \"https://example.org/step2\"\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#redirects-assert)\n\n## Debug Tips\n\n### Verbose Mode\n\nTo get more info on a given request/response, use [`[Options]` section](https://hurl.dev/docs/request.html#options):\n\n```hurl\nGET https://example.org\nHTTP 200\n\nGET https://example.org/api/cats/123\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://hurl.dev/docs/manual.html#very-verbose)\n\n### Error Format\n\n```shell\n$ hurl --test --error-format long *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.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://foo.com/failure\n[Options]\n# use - to output on standard output, foo.bin to save on disk \noutput: -\nHTTP 200\n\nGET https://foo.com/success\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/manual.html#output)\n\n### Export curl Commands\n\n```shell\n$ hurl ---curl /tmp/curl.txt *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.html#curl)\n\n### Using Proxy\n\nUse `--proxy` on a specific request or globally as command line option:\n\n```hurl\nGET https://foo.com/a\nHTTP 200\n\nGET https://foo.com/b\n[Options]\nproxy: localhost:8888\nHTTP 200\n\nGET https://foo.com/c\nHTTP 200\n```\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### 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) can be done using implicit asserts:\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\nOr explicit:\n\n```hurl\nGET https://foo.com\nHTTP 200\n[Asserts]\nversion == \"3\"\n\nGET https://bar.com\nHTTP 200\n[Asserts]\nversion == \"2\"\nversion toFloat > 1.1\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://foo.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://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 < 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\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&password=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## 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 / 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&password=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## 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, except if they are tagged as cli-only \n(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\nHurl looks also for a configuration file at the following places `$XDG_CONFIG_HOME/hurl/config` if `$XDG_CONFIG_HOME` exists,\nor `$HOME/.config/hurl/config`. The configuration file is a list of options added to each Hurl run.\n\n```shell\n$ cat ~/.config/hurl/config\n# Hurl config file\n--header x-identifier:quux\n--verbose\n--delay=1s\n--fail-with-body\n```\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 four sources from the lowest priority (most easily overridden) to highest (overrides all others):\n\n- Configuration file (ex: `~/.config/hurl/config`)\n- Environment variables (ex: `export HURL_INSECURE=true`)\n- Command-line options (ex: `hurl --insecure`)\n- Options section options (ex: `insecure: true` in file)\n\n## All Options\n\n### HTTP options\n\n| Option                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                   |\n|-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| <a href=\"#aws-sigv4\" id=\"aws-sigv4\"><code>--aws-sigv4 &lt;PROVIDER1[:PROVIDER2[:REGION[:SERVICE]]]&gt;</code></a> | Generate an `Authorization` header with an AWS SigV4 signature.<br><br>Use [`-u, --user`](#user) to specify Access Key Id (username) and Secret Key (password).<br><br>To use temporary session credentials (e.g. for an AWS IAM Role), add the `X-Amz-Security-Token` header containing the session token.<br>                                                                                                               |\n| <a href=\"#cacert\" id=\"cacert\"><code>--cacert &lt;FILE&gt;</code></a>                                              | Specifies the certificate file for peer verification. The file may contain multiple CA certificates and must be in PEM format.<br>Normally Hurl is built to use a default file for this, so this option is typically used to alter that default file.<br>                                                                                                                                                                     |\n| <a href=\"#cert\" id=\"cert\"><code>-E, --cert &lt;CERTIFICATE[:PASSWORD]&gt;</code></a>                              | Client certificate file and password.<br><br>See also [`--key`](#key).<br>                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#compressed\" id=\"compressed\"><code>--compressed</code></a>                                               | Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.<br><br>Environment variables: HURL_COMPRESSED<br>                                                                                                                                                                                                                                                       |\n| <a href=\"#connect-timeout\" id=\"connect-timeout\"><code>--connect-timeout &lt;SECONDS&gt;</code></a>                | Maximum time in seconds that you allow Hurl's connection to take.<br><br>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.<br><br>See also [`-m, --max-time`](#max-time).<br><br>Environment variables: HURL_CONNECT_TIMEOUT<br>               |\n| <a href=\"#connect-to\" id=\"connect-to\"><code>--connect-to &lt;HOST1:PORT1:HOST2:PORT2&gt;</code></a>               | 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.<br><br>See also [`--resolve`](#resolve).<br>                                                                                                                                                                                                                                            |\n| <a href=\"#digest\" id=\"digest\"><code>--digest</code></a>                                                           | Tell Hurl to use HTTP Digest authentication<br>                                                                                                                                                                                                                                                                                                                                                                               |\n| <a href=\"#header\" id=\"header\"><code>-H, --header &lt;NAME:VALUE&gt;</code></a>                                    | Add an extra header to include in information sent. Can be used several times in a command.<br><br>Do not add newlines or carriage returns.<br><br>Environment variables: HURL_HEADER='name1:value1&#124;name2:value2' (headers are separated by &#124;)<br>                                                                                                                                                                  |\n| <a href=\"#http10\" id=\"http10\"><code>-0, --http1.0</code></a>                                                      | Tells Hurl to use HTTP version 1.0 instead of using its internally preferred HTTP version.<br><br>Environment variables: HURL_HTTP10<br>                                                                                                                                                                                                                                                                                      |\n| <a href=\"#http11\" id=\"http11\"><code>--http1.1</code></a>                                                          | Tells Hurl to use HTTP version 1.1.<br><br>Environment variables: HURL_HTTP11<br>                                                                                                                                                                                                                                                                                                                                             |\n| <a href=\"#http2\" id=\"http2\"><code>--http2</code></a>                                                              | Tells Hurl to use HTTP version 2.<br>For HTTPS, this means Hurl negotiates HTTP/2 in the TLS handshake. Hurl does this by default.<br>For HTTP, this means Hurl attempts to upgrade the request to HTTP/2 using the Upgrade: request header.<br><br>Environment variables: HURL_HTTP2<br>                                                                                                                                     |\n| <a href=\"#http2-prior-knowledge\" id=\"http2-prior-knowledge\"><code>--http2-prior-knowledge</code></a>              | Tells Hurl to issue a non-TLS HTTP request using HTTP/2 directly without HTTP/1.1 Upgrade. It requires prior knowledge that the server supports HTTP/2 straight away. HTTPS requests still do HTTP/2 the standard way with negotiated protocol versions in the TLS handshake.<br><br>Environment variables: HURL_HTTP2_PRIOR_KNOWLEDGE<br>                                                                                    |\n| <a href=\"#http3\" id=\"http3\"><code>--http3</code></a>                                                              | Tells Hurl to try HTTP version 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.<br><br>Environment variables: HURL_HTTP3<br>                                                                                                                                                                           |\n| <a href=\"#insecure\" id=\"insecure\"><code>-k, --insecure</code></a>                                                 | This option explicitly allows Hurl to perform \"insecure\" SSL connections and transfers.<br><br>Environment variables: HURL_INSECURE<br>                                                                                                                                                                                                                                                                                       |\n| <a href=\"#ipv4\" id=\"ipv4\"><code>-4, --ipv4</code></a>                                                             | This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6.<br><br>Environment variables: HURL_IPV4<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#ipv6\" id=\"ipv6\"><code>-6, --ipv6</code></a>                                                             | This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4.<br><br>Environment variables: HURL_IPV6<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#key\" id=\"key\"><code>--key &lt;KEY&gt;</code></a>                                                        | Private key file name.<br>                                                                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#limit-rate\" id=\"limit-rate\"><code>--limit-rate &lt;SPEED&gt;</code></a>                                 | 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.<br>The given speed is measured in bytes/second.<br><br>Environment variables: HURL_LIMIT_RATE<br>                                                                  |\n| <a href=\"#location\" id=\"location\"><code>-L, --location</code></a>                                                 | Follow redirect. To limit the amount of redirects to follow use the [`--max-redirs`](#max-redirs) option<br><br>Environment variables: HURL_LOCATION<br>                                                                                                                                                                                                                                                                      |\n| <a href=\"#location-trusted\" id=\"location-trusted\"><code>--location-trusted</code></a>                             | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.<br>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).<br><br>Environment variables: HURL_LOCATION_TRUSTED<br>                                               |\n| <a href=\"#max-filesize\" id=\"max-filesize\"><code>--max-filesize &lt;BYTES&gt;</code></a>                           | 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.<br><br>Environment variables: HURL_MAX_FILESIZE<br><br>This is a cli-only option.<br>                                                                                                                                                                                                  |\n| <a href=\"#max-redirs\" id=\"max-redirs\"><code>--max-redirs &lt;NUM&gt;</code></a>                                   | Set maximum number of redirection-followings allowed<br><br>By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.<br><br>Environment variables: HURL_MAX_REDIRS<br>                                                                                                                                                                                                                    |\n| <a href=\"#max-time\" id=\"max-time\"><code>-m, --max-time &lt;SECONDS&gt;</code></a>                                 | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.<br><br>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.<br><br>See also [`--connect-timeout`](#connect-timeout).<br><br>Environment variables: HURL_MAX_TIME<br> |\n| <a href=\"#negotiate\" id=\"negotiate\"><code>--negotiate</code></a>                                                  | Tell Hurl to use Negotiate (SPNEGO) authentication.<br>                                                                                                                                                                                                                                                                                                                                                                       |\n| <a href=\"#no-cookie-store\" id=\"no-cookie-store\"><code>--no-cookie-store</code></a>                                | Do not use cookie storage for requests/responses in a file. By default, requests in the same Hurl file share cookie storage, this option deactivates cookie engine.<br><br>Environment variables: HURL_NO_COOKIE_STORE<br><br>This is a cli-only option.<br>                                                                                                                                                                  |\n| <a href=\"#no-header\" id=\"no-header\"><code>--no-header &lt;NAME&gt;</code></a>                                     | Remove a header from information sent. Can be used several times in a command.<br><br>Environment variables: HURL_NO_HEADER='name1&#124;name2' (names are separated by &#124;)<br>                                                                                                                                                                                                                                            |\n| <a href=\"#no-proxy\" id=\"no-proxy\"><code>--no-proxy &lt;HOST(S)&gt;</code></a>                                     | Comma-separated list of hosts which do not use a proxy.<br><br>Environment variables: no_proxy<br>                                                                                                                                                                                                                                                                                                                            |\n| <a href=\"#ntlm\" id=\"ntlm\"><code>--ntlm</code><","isInternal":false,"tokens":12049,"sizeBytes":50000},{"name":"README.md","path":"packages/hurlfmt/README.md","rawUrl":"https://raw.githubusercontent.com/Orange-OpenSource/hurl/HEAD/packages/hurlfmt/README.md","title":"hurlfmt Documentation","category":"plugin-manifest","format":"markdown","content":"hurlfmt\n=====================================\n\nThe hurlfmt crate provides the `hurlfmt` binary.\nIt can format hurl files and to export them to JSON/HTML.\n","isInternal":false,"tokens":34,"sizeBytes":154}],"systemPromptSnippet":"<yakaai_skills repo=\"Orange-OpenSource/hurl\">\n<!-- File: packages/hurl_core/tests/json/asterisk.json (Tokens: ~5 | Category: anthropic-skill) -->\n{ \"*\": {} }\n\n<!-- File: packages/hurl_core/tests/json/elasticsearch.json (Tokens: ~146 | Category: anthropic-skill) -->\n{\n  \"from\": 0,\n  \"size\": 2000,\n  \"sort\": [\n    {\n      \"@timestamp\": \"desc\"\n    }\n  ],\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"match\": {\n            \"tag.env\": \"prod\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.r_code\": \"500\"\n          }\n        },\n        {\n          \"match\": {\n            \"data.q_client-dns\": \"m.shop.sosh.fr\"\n          }\n        },\n        {\n          \"match\": {\n            \"@timestamp\": {\n              \"query\": \"{{date}}\"\n            }\n          }\n        }\n      ]\n    }\n  }\n}\n\n<!-- File: packages/hurl_core/tests/json/g_clef.json (Tokens: ~15 | Category: anthropic-skill) -->\n{\n  \"encoding1\": \"\\uD834\\uDD1E\"\n}\n\n<!-- File: packages/hurl_core/tests/json/hello.json (Tokens: ~6 | Category: anthropic-skill) -->\n\"Hello {{Name}}!\"\n\n<!-- File: packages/hurl_core/tests/json/person.json (Tokens: ~142 | Category: anthropic-skill) -->\n{\n  \"firstName\": \"John\",\n  \"lastName\": \"Smith\",\n  \"isAlive\": true,\n  \"age\": 27,\n  \"address\": {\n    \"streetAddress\": \"21 2nd Street\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postalCode\": \"10021-3100\"\n  },\n  \"phoneNumbers\": [\n    {\n      \"type\": \"home\",\n      \"number\": \"212 555-1234\"\n    },\n    {\n      \"type\": \"office\",\n      \"number\": \"646 555-4567\"\n    }\n  ],\n  \"children\": [],\n  \"spouse\": null\n}\n\n<!-- File: packages/hurl_core/tests/json/variable.json (Tokens: ~31 | Category: anthropic-skill) -->\n{\n  \"name\": \"{{name}}\",\n  \"password\": \"secret\",\n  \"age\": {{age}},\n  \"strict\": {{strict}}\n}\n\n<!-- File: packages/hurl/src/jsonpath/tests/cts.json (Tokens: ~14085 | Category: anthropic-skill) -->\n{\n  \"description\": \"JSONPath Compliance Test Suite. This file is autogenerated, do not edit.\",\n  \"tests\": [\n    {\n      \"name\": \"basic, root\",\n      \"selector\": \"$\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        [\n          \"first\",\n          \"second\"\n        ]\n      ],\n      \"result_paths\": [\n        \"$\"\n      ]\n    },\n    {\n      \"name\": \"basic, no leading whitespace\",\n      \"selector\": \" $\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, no trailing whitespace\",\n      \"selector\": \"$ \",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand\",\n      \"selector\": \"$.a\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, extended unicode ☺\",\n      \"selector\": \"$.☺\",\n      \"document\": {\n        \"☺\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['☺']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, underscore\",\n      \"selector\": \"$._\",\n      \"document\": {\n        \"_\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['_']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, symbol\",\n      \"selector\": \"$.&\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, number\",\n      \"selector\": \"$.1\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, name shorthand, absent data\",\n      \"selector\": \"$.c\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, array data\",\n      \"selector\": \"$.a\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"basic, name shorthand, object data, nested\",\n      \"selector\": \"$.a.b.c\",\n      \"document\": {\n        \"a\": {\n          \"b\": {\n            \"c\": \"C\"\n          }\n        }\n      },\n      \"result\": [\n        \"C\"\n      ],\n      \"result_paths\": [\n        \"$['a']['b']['c']\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, object data\",\n      \"selector\": \"$.*\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\"\n        ],\n        [\n          \"B\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, array data\",\n      \"selector\": \"$.*\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard selector, array data\",\n      \"selector\": \"$[*]\",\n      \"document\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result\": [\n        \"first\",\n        \"second\"\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, wildcard shorthand, then name shorthand\",\n      \"selector\": \"$.*.a\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"Ax\",\n          \"b\": \"Bx\"\n        },\n        \"y\": {\n          \"a\": \"Ay\",\n          \"b\": \"By\"\n        }\n      },\n      \"results\": [\n        [\n          \"Ax\",\n          \"Ay\"\n        ],\n        [\n          \"Ay\",\n          \"Ax\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['y']['a']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['x']['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors\",\n      \"selector\": \"$[0,2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, space instead of comma\",\n      \"selector\": \"$[0 2]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"basic, selector, leading comma\",\n      \"selector\": \"$[,0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, selector, trailing comma\",\n      \"selector\": \"$[0,]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, array data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, name and index, object data\",\n      \"selector\": \"$['a',1]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": 2\n      },\n      \"result\": [\n        1\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice\",\n      \"selector\": \"$[1,5:7]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        5,\n        6\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[5]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, index and slice, overlapping\",\n      \"selector\": \"$[1,0:3]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, duplicate index\",\n      \"selector\": \"$[1,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        1,\n        1\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and index\",\n      \"selector\": \"$[*,1]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and name\",\n      \"selector\": \"$[*,'a']\",\n      \"document\": {\n        \"a\": \"A\",\n        \"b\": \"B\"\n      },\n      \"results\": [\n        [\n          \"A\",\n          \"B\",\n          \"A\"\n        ],\n        [\n          \"B\",\n          \"A\",\n          \"A\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, wildcard and slice\",\n      \"selector\": \"$[*,0:2]\",\n      \"document\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9,\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[5]\",\n        \"$[6]\",\n        \"$[7]\",\n        \"$[8]\",\n        \"$[9]\",\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, multiple selectors, multiple wildcards\",\n      \"selector\": \"$[*,*]\",\n      \"document\": [\n        0,\n        1,\n        2\n      ],\n      \"result\": [\n        0,\n        1,\n        2,\n        0,\n        1,\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"basic, empty segment\",\n      \"selector\": \"$[]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, descendant segment, index\",\n      \"selector\": \"$..[1]\",\n      \"document\": {\n        \"o\": [\n          0,\n          1,\n          [\n            2,\n            3\n          ]\n        ]\n      },\n      \"result\": [\n        1,\n        3\n      ],\n      \"result_paths\": [\n        \"$['o'][1]\",\n        \"$['o'][2][1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, name shorthand\",\n      \"selector\": \"$..a\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          },\n          {\n            \"a\": \"c\"\n          }\n        ]\n      },\n      \"result\": [\n        \"b\",\n        \"c\"\n      ],\n      \"result_paths\": [\n        \"$['o'][0]['a']\",\n        \"$['o'][1]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, true\",\n      \"selector\": \"$.true\",\n      \"document\": {\n        \"true\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['true']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, false\",\n      \"selector\": \"$.false\",\n      \"document\": {\n        \"false\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['false']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, name shorthand, null\",\n      \"selector\": \"$.null\",\n      \"document\": {\n        \"null\": \"A\",\n        \"_foo\": \"B\"\n      },\n      \"result\": [\n        \"A\"\n      ],\n      \"result_paths\": [\n        \"$['null']\"\n      ],\n      \"tags\": [\n        \"boundary\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, array data\",\n      \"selector\": \"$..*\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, array data\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        0,\n        1\n      ],\n      \"result\": [\n        0,\n        1\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested arrays\",\n      \"selector\": \"$..[*]\",\n      \"document\": [\n        [\n          [\n            1\n          ]\n        ],\n        [\n          2\n        ]\n      ],\n      \"results\": [\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          1,\n          2\n        ],\n        [\n          [\n            [\n              1\n            ]\n          ],\n          [\n            2\n          ],\n          [\n            1\n          ],\n          2,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[0][0][0]\",\n          \"$[1][0]\"\n        ],\n        [\n          \"$[0]\",\n          \"$[1]\",\n          \"$[0][0]\",\n          \"$[1][0]\",\n          \"$[0][0][0]\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard selector, nested objects\",\n      \"selector\": \"$..[*]\",\n      \"document\": {\n        \"a\": {\n          \"c\": {\n            \"e\": 1\n          }\n        },\n        \"b\": {\n          \"d\": 2\n        }\n      },\n      \"results\": [\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"d\": 2\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          1,\n          2\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          {\n            \"e\": 1\n          },\n          2,\n          1\n        ],\n        [\n          {\n            \"d\": 2\n          },\n          {\n            \"c\": {\n              \"e\": 1\n            }\n          },\n          2,\n          {\n            \"e\": 1\n          },\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['a']\",\n          \"$['b']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\",\n          \"$['b']['d']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['a']['c']\",\n          \"$['b']['d']\",\n          \"$['a']['c']['e']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\",\n          \"$['b']['d']\",\n          \"$['a']['c']\",\n          \"$['a']['c']['e']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, object data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"a\": \"b\"\n      },\n      \"result\": [\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, wildcard shorthand, nested data\",\n      \"selector\": \"$..*\",\n      \"document\": {\n        \"o\": [\n          {\n            \"a\": \"b\"\n          }\n        ]\n      },\n      \"result\": [\n        [\n          {\n            \"a\": \"b\"\n          }\n        ],\n        {\n          \"a\": \"b\"\n        },\n        \"b\"\n      ],\n      \"result_paths\": [\n        \"$['o']\",\n        \"$['o'][0]\",\n        \"$['o'][0]['a']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        \"b\",\n        \"e\",\n        \"c\",\n        \"f\"\n      ],\n      \"result_paths\": [\n        \"$[0]['a']\",\n        \"$[0]['d']\",\n        \"$[1]['a']\",\n        \"$[1]['d']\"\n      ]\n    },\n    {\n      \"name\": \"basic, descendant segment, object traversal, multiple selectors\",\n      \"selector\": \"$..['a','d']\",\n      \"document\": {\n        \"x\": {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        \"y\": {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      },\n      \"results\": [\n        [\n          \"b\",\n          \"e\",\n          \"c\",\n          \"f\"\n        ],\n        [\n          \"c\",\n          \"f\",\n          \"b\",\n          \"e\"\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['x']['a']\",\n          \"$['x']['d']\",\n          \"$['y']['a']\",\n          \"$['y']['d']\"\n        ],\n        [\n          \"$['y']['a']\",\n          \"$['y']['d']\",\n          \"$['x']['a']\",\n          \"$['x']['d']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"basic, bald descendant segment\",\n      \"selector\": \"$..\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, current node identifier without filter selector\",\n      \"selector\": \"$[@.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"basic, root node identifier in brackets without filter selector\",\n      \"selector\": \"$[$.a]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, existence, without segments\",\n      \"selector\": \"$[?@]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, existence\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, existence, present with null\",\n      \"selector\": \"$[?@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, without segments\",\n      \"selector\": \"$[?$]\",\n      \"document\": {\n        \"a\": 1,\n        \"b\": null\n      },\n      \"results\": [\n        [\n          1,\n          null\n        ],\n        [\n          null,\n          1\n        ]\n      ],\n      \"results_paths\": [\n        [\n          \"$['a']\",\n          \"$['b']\"\n        ],\n        [\n          \"$['b']\",\n          \"$['a']\"\n        ]\n      ]\n    },\n    {\n      \"name\": \"filter, absolute existence, with segments\",\n      \"selector\": \"$[?$.*.a]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"b\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, single quotes\",\n      \"selector\": \"$[?@.a=='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a=='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a==\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals number\",\n      \"selector\": \"$[?@.a==1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals null, absent from data\",\n      \"selector\": \"$[?@.a==null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, equals true\",\n      \"selector\": \"$[?@.a==true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals false\",\n      \"selector\": \"$[?@.a==false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals self\",\n      \"selector\": \"$[?@==@]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, absolute, equals self\",\n      \"selector\": \"$[?$==$]\",\n      \"document\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result\": [\n        1,\n        null,\n        true,\n        {\n          \"a\": \"b\"\n        },\n        [\n          false\n        ]\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, equals, absent from index selector equals absent from name selector\",\n      \"selector\": \"$[?@.absent==@.list[9]]\",\n      \"document\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"list\": [\n            1\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, arrays\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": [\n            1,\n            2\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              [\n                2\n              ],\n              1\n            ]\n          ]\n        },\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              2\n            ]\n          ]\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ],\n          \"b\": [\n            [\n              1,\n              [\n                2\n              ]\n            ]\n          ]\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, deep equality, objects\",\n      \"selector\": \"$[?@.a==@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 2\n            }\n          }\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          }\n        },\n        {\n          \"a\": {\n            \"x\": 1,\n            \"y\": {\n              \"z\": 1\n            }\n          },\n          \"b\": {\n            \"y\": {\n              \"z\": 1\n            },\n            \"x\": 1\n          }\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, single quotes\",\n      \"selector\": \"$[?@.a!='1']\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, single quotes, different type\",\n      \"selector\": \"$[?@.a!='b']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals numeric string, double quotes\",\n      \"selector\": \"$[?@.a!=\\\"1\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"1\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals string, double quotes, different types\",\n      \"selector\": \"$[?@.a!=\\\"b\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 2,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"1\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals number, different types\",\n      \"selector\": \"$[?@.a!=1]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals null, absent from data\",\n      \"selector\": \"$[?@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals true\",\n      \"selector\": \"$[?@.a!=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not-equals false\",\n      \"selector\": \"$[?@.a!=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, single quotes\",\n      \"selector\": \"$[?@.a<'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than string, double quotes\",\n      \"selector\": \"$[?@.a<\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than number\",\n      \"selector\": \"$[?@.a<10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than null\",\n      \"selector\": \"$[?@.a<null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than true\",\n      \"selector\": \"$[?@.a<true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than false\",\n      \"selector\": \"$[?@.a<false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, less than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a<='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a<=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to number\",\n      \"selector\": \"$[?@.a<=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to null\",\n      \"selector\": \"$[?@.a<=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to true\",\n      \"selector\": \"$[?@.a<=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, less than or equal to false\",\n      \"selector\": \"$[?@.a<=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, single quotes\",\n      \"selector\": \"$[?@.a>'c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than string, double quotes\",\n      \"selector\": \"$[?@.a>\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than number\",\n      \"selector\": \"$[?@.a>10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than null\",\n      \"selector\": \"$[?@.a>null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than true\",\n      \"selector\": \"$[?@.a>true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than false\",\n      \"selector\": \"$[?@.a>false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, single quotes\",\n      \"selector\": \"$[?@.a>='c']\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to string, double quotes\",\n      \"selector\": \"$[?@.a>=\\\"c\\\"]\",\n      \"document\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to number\",\n      \"selector\": \"$[?@.a>=10]\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to null\",\n      \"selector\": \"$[?@.a>=null]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to true\",\n      \"selector\": \"$[?@.a>=true]\",\n      \"document\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": true,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, greater than or equal to false\",\n      \"selector\": \"$[?@.a>=false]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"d\": \"e\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and not-equals null, absent from data\",\n      \"selector\": \"$[?@.a&&@.a!=null]\",\n      \"document\": [\n        {\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists and exists, data false\",\n      \"selector\": \"$[?@.a&&@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\"\n      ]\n    },\n    {\n      \"name\": \"filter, exists or exists, data false\",\n      \"selector\": \"$[?@.a||@.b]\",\n      \"document\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        },\n        {\n          \"c\": false\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": false,\n          \"b\": false\n        },\n        {\n          \"b\": false\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, and\",\n      \"selector\": \"$[?@.a>0&&@.a<10]\",\n      \"document\": [\n        {\n          \"a\": -10,\n          \"d\": \"e\"\n        },\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        },\n        {\n          \"a\": 20,\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": 5,\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, or\",\n      \"selector\": \"$[?@.a=='b'||@.a=='d']\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"c\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not expression\",\n      \"selector\": \"$[?!(@.a=='b')]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"b\",\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[2]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": \"a\",\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, not exists, data null\",\n      \"selector\": \"$[?!@.a]\",\n      \"document\": [\n        {\n          \"a\": null,\n          \"d\": \"e\"\n        },\n        {\n          \"d\": \"f\"\n        },\n        {\n          \"a\": \"d\",\n          \"d\": \"f\"\n        }\n      ],\n      \"result\": [\n        {\n          \"d\": \"f\"\n        }\n      ],\n      \"result_paths\": [\n        \"$[1]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, wildcard\",\n      \"selector\": \"$[?@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        {\n          \"a\": 3\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[4]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, multiple\",\n      \"selector\": \"$[?@[0, 0, 'a']]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"b\": 4\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3\n        ],\n        {\n          \"a\": 3\n        },\n        {\n          \"a\": 3,\n          \"b\": 4\n        }\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\",\n        \"$[4]\",\n        \"$[6]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, slice\",\n      \"selector\": \"$[?@[0:2]]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        [\n          2\n        ],\n        [\n          2,\n          3,\n          4\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular existence, negated\",\n      \"selector\": \"$[?!@.*]\",\n      \"document\": [\n        1,\n        [],\n        [\n          2\n        ],\n        {},\n        {\n          \"a\": 3\n        }\n      ],\n      \"result\": [\n        1,\n        [],\n        {}\n      ],\n      \"result_paths\": [\n        \"$[0]\",\n        \"$[1]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, slice\",\n      \"selector\": \"$[?@[0:0]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, all children\",\n      \"selector\": \"$[?@[*]==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, descendants\",\n      \"selector\": \"$[?@..a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, non-singular query in comparison, combined\",\n      \"selector\": \"$[?@.a[*].a==0]\",\n      \"invalid_selector\": true\n    },\n    {\n      \"name\": \"filter, nested\",\n      \"selector\": \"$[?@[?@>1]]\",\n      \"document\": [\n        [\n          0\n        ],\n        [\n          0,\n          1\n        ],\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result\": [\n        [\n          0,\n          1,\n          2\n        ],\n        [\n          42\n        ]\n      ],\n      \"result_paths\": [\n        \"$[2]\",\n        \"$[3]\"\n      ]\n    },\n    {\n      \"name\": \"filter, name segment on primitive, selects nothing\",\n      \"selector\": \"$[?@.a == 1]\",\n      \"document\": {\n        \"a\": 1\n      },\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, name segment on array, selects nothing\",\n      \"selector\": \"$[?@['0'] == 5]\",\n      \"document\": [\n        [\n          5,\n          6\n        ]\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, index segment on object, selects nothing\",\n      \"selector\": \"$[?@[0] == 5]\",\n      \"document\": [\n        {\n          \"0\": 5\n        }\n      ],\n      \"result\": [],\n      \"result_paths\": []\n    },\n    {\n      \"name\": \"filter, followed by name selector\",\n      \"selector\": \"$[?@.a==1].b.x\",\n      \"document\": [\n        {\n          \"a\": 1,\n          \"b\": {\n            \"x\": 2\n          }\n        }\n      ],\n      \"result\": [\n        2\n      ],\n      \"result_paths\": [\n        \"$[0]['b']['x']\"\n      ]\n    },\n    {\n      \"name\": \"filter, followed by child segment that selects multiple elements\",\n      \"selector\": \"$[?@.z=='_']['x','y']\",\n      \"document\": [\n        {\n          \"x\": 1,\n          \"y\": null,\n          \"z\": \"_\"\n        }\n      ],\n      \"result\": [\n        1,\n        null\n      ],\n      \"result_paths\": [\n        \"$[0]['x']\",\n        \"$[0]['y']\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, equal\",\n      \"selector\": \"$[?(@[0, 0]==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, not equal\",\n      \"selector\": \"$[?(@[0, 0]!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, index, less-or-equal\",\n      \"selector\": \"$[?(@[0, 0]<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, equal\",\n      \"selector\": \"$[?(@['a', 'a']==42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, not equal\",\n      \"selector\": \"$[?(@['a', 'a']!=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular query, name, less-or-equal\",\n      \"selector\": \"$[?(@['a', 'a']<=42)]\",\n      \"invalid_selector\": true,\n      \"tags\": [\n        \"whitespace\"\n      ]\n    },\n    {\n      \"name\": \"filter, relative non-singular quer\n\n<!-- File: packages/hurl/tests/bookstore.json (Tokens: ~233 | Category: anthropic-skill) -->\n{\n  \"store\": {\n    \"book\": [\n      {\n        \"category\": \"reference\",\n        \"author\": \"Nigel Rees\",\n        \"title\": \"Sayings of the Century\",\n        \"price\": 8.95\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Evelyn Waugh\",\n        \"title\": \"Sword of Honour\",\n        \"price\": 12.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Herman Melville\",\n        \"title\": \"Moby Dick\",\n        \"isbn\": \"0-553-21311-3\",\n        \"price\": 8.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"J. R. R. Tolkien\",\n        \"title\": \"The Lord of the Rings\",\n        \"isbn\": \"0-395-19395-8\",\n        \"price\": 22.99\n      }\n    ],\n    \"bicycle\": {\n      \"color\": \"red\",\n      \"price\": 19.95\n    }\n  }\n}\n\n<!-- File: packages/hurl_core/README.md (Tokens: ~22 | Category: plugin-manifest) -->\nhurl_core\n===============\n\nThe hurl_core crate provides the common functionalities used by both hurl and hurlfmt.\n\n<!-- File: packages/hurl/README.md (Tokens: ~12049 | Category: plugin-manifest) -->\n<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/logo-light.svg\" > \n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/logo-dark.svg\" > \n    <img src=\"https://hurl.dev/assets/img/logo-light.svg\" width=\"264px\" alt=\"Hurl Logo\">\n</picture>\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 <b>HTTP requests</b> defined in a simple <b>plain text format</b>.\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 <b>fetching data</b> and <b>testing HTTP</b> sessions.\n\nHurl makes it easy to work with <b>HTML</b> content, <b>REST / SOAP / GraphQL</b> APIs, or any other <b>XML / JSON</b> based APIs. \n\n```hurl\n# Go home and capture token\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\n[Form]\nuser: toto\npassword: 1234\ntoken: {{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 <b>test HTTP responses</b>.\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<a href=\"https://hurl.dev/player.html?id=starwars&speed=3\"><img src=\"https://hurl.dev/assets/img/poster-starwars.png\" width=\"100%\" alt=\"Hurl Demo\"/></a>\n\n\nIt is well adapted for <b>REST / JSON APIs</b>\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<b>HTML content</b>\n\n```hurl\nGET https://example.org\nHTTP 200\n[Asserts]\nxpath \"normalize-space(//head/title)\" == \"Hello world!\"\n```\n\n<b>GraphQL</b> \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 <b>SOAP APIs</b>\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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\nHTTP 200\n```\n\nHurl can also be used to test the <b>performance</b> of HTTP endpoints\n\n```hurl\nGET https://example.org/api/v1/pets\nHTTP 200\n[Asserts]\nduration < 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 <b>integrate in CI/CD</b>, with text, JUnit, TAP and HTML reports\n\n<picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-light.png\">\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://hurl.dev/assets/img/home-waterfall-dark.png\">\n    <img src=\"https://hurl.dev/assets/img/home-waterfall-light.png\" width=\"480\" alt=\"HTML report\"/>\n</picture>\n\n# Why Hurl?\n\n<ul class=\"showcase-container\">\n    <li><b>Text Format:</b> for both devops and developers</li>\n    <li><b>Fast CLI:</b> a command line for local dev and continuous integration</li>\n    <li><b>Single Binary:</b> easy to install, with no runtime required</li>\n</ul>\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 / 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        * [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 / Ubuntu](#debian--ubuntu)\n            * [Alpine](#alpine)\n            * [Arch Linux / Manjaro](#arch-linux--manjaro)\n            * [NixOS / Nix](#nixos--nix)\n            * [Guix](#guix)\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.org/cats/123\n[Options]\noutput: cat123.txt    # use - to output to stdout\nHTTP 200\n\nGET https://example.org/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&search=something%20to%20search&count=100\n```\n\n> 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<div>Hello <b>World</b>!</div>\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### 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<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Request>\n    <Login>{{login}}</Login>\n    <Password>{{password}}</Password>\n</Request>\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-query)\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 >= 200\nstatus < 300\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#status-assert)\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\" 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 /^order-\\d{8}$/  # Alternative syntax with regex literal\njsonpath \"$.id\" matches /(?i)[a-z]*/        # See syntax for flags <https://docs.rs/regex/latest/regex/#grouping-and-flags>\njsonpath \"$.created\" isIsoDate\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#jsonpath-assert)\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 > 15\ncertificate \"Serial-Number\" matches /[\\da-f]+/\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://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\", \"<strong>any</strong> 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<catalog>\n   <book id=\"bk101\">\n      <author>Gambardella, Matthew</author>\n      <title>XML Developer's Guide</title>\n      <genre>Computer</genre>\n      <price>44.95</price>\n      <publish_date>2000-10-01</publish_date>\n      <description>An in-depth look at creating applications with XML.</description>\n   </book>\n</catalog>\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### 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://example.org/step1\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step2\"\n\n\nGET https://example.org/step2\nHTTP 301\n[Asserts]\nheader \"Location\" == \"https://example.org/step3\"\n\n\nGET https://example.org/step3\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://example.org/step1\n[Options]\nlocation: true\nHTTP 200\n[Asserts]\nredirects count == 2\nredirects nth 0 location == \"https://example.org/step2\"\nredirects nth 1 location == \"https://example.org/step3\"\n```\n\n```hurl\nGET https://example.org/step1\n[Options]\nlocation-trusted: true\nHTTP 200\n[Asserts]\nredirects last location == \"https://example.org/step2\"\n```\n\n[Doc](https://hurl.dev/docs/asserting-response.html#redirects-assert)\n\n## Debug Tips\n\n### Verbose Mode\n\nTo get more info on a given request/response, use [`[Options]` section](https://hurl.dev/docs/request.html#options):\n\n```hurl\nGET https://example.org\nHTTP 200\n\nGET https://example.org/api/cats/123\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://hurl.dev/docs/manual.html#very-verbose)\n\n### Error Format\n\n```shell\n$ hurl --test --error-format long *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.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://foo.com/failure\n[Options]\n# use - to output on standard output, foo.bin to save on disk \noutput: -\nHTTP 200\n\nGET https://foo.com/success\nHTTP 200\n```\n\n[Doc](https://hurl.dev/docs/manual.html#output)\n\n### Export curl Commands\n\n```shell\n$ hurl ---curl /tmp/curl.txt *.hurl\n```\n\n[Doc](https://hurl.dev/docs/manual.html#curl)\n\n### Using Proxy\n\nUse `--proxy` on a specific request or globally as command line option:\n\n```hurl\nGET https://foo.com/a\nHTTP 200\n\nGET https://foo.com/b\n[Options]\nproxy: localhost:8888\nHTTP 200\n\nGET https://foo.com/c\nHTTP 200\n```\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### 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) can be done using implicit asserts:\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\nOr explicit:\n\n```hurl\nGET https://foo.com\nHTTP 200\n[Asserts]\nversion == \"3\"\n\nGET https://bar.com\nHTTP 200\n[Asserts]\nversion == \"2\"\nversion toFloat > 1.1\n```\n\n[Doc](https://hurl.dev/docs/asserting-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://foo.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://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 < 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<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\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&password=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## 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 / 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&password=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## 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, except if they are tagged as cli-only \n(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\nHurl looks also for a configuration file at the following places `$XDG_CONFIG_HOME/hurl/config` if `$XDG_CONFIG_HOME` exists,\nor `$HOME/.config/hurl/config`. The configuration file is a list of options added to each Hurl run.\n\n```shell\n$ cat ~/.config/hurl/config\n# Hurl config file\n--header x-identifier:quux\n--verbose\n--delay=1s\n--fail-with-body\n```\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 four sources from the lowest priority (most easily overridden) to highest (overrides all others):\n\n- Configuration file (ex: `~/.config/hurl/config`)\n- Environment variables (ex: `export HURL_INSECURE=true`)\n- Command-line options (ex: `hurl --insecure`)\n- Options section options (ex: `insecure: true` in file)\n\n## All Options\n\n### HTTP options\n\n| Option                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                   |\n|-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| <a href=\"#aws-sigv4\" id=\"aws-sigv4\"><code>--aws-sigv4 &lt;PROVIDER1[:PROVIDER2[:REGION[:SERVICE]]]&gt;</code></a> | Generate an `Authorization` header with an AWS SigV4 signature.<br><br>Use [`-u, --user`](#user) to specify Access Key Id (username) and Secret Key (password).<br><br>To use temporary session credentials (e.g. for an AWS IAM Role), add the `X-Amz-Security-Token` header containing the session token.<br>                                                                                                               |\n| <a href=\"#cacert\" id=\"cacert\"><code>--cacert &lt;FILE&gt;</code></a>                                              | Specifies the certificate file for peer verification. The file may contain multiple CA certificates and must be in PEM format.<br>Normally Hurl is built to use a default file for this, so this option is typically used to alter that default file.<br>                                                                                                                                                                     |\n| <a href=\"#cert\" id=\"cert\"><code>-E, --cert &lt;CERTIFICATE[:PASSWORD]&gt;</code></a>                              | Client certificate file and password.<br><br>See also [`--key`](#key).<br>                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#compressed\" id=\"compressed\"><code>--compressed</code></a>                                               | Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.<br><br>Environment variables: HURL_COMPRESSED<br>                                                                                                                                                                                                                                                       |\n| <a href=\"#connect-timeout\" id=\"connect-timeout\"><code>--connect-timeout &lt;SECONDS&gt;</code></a>                | Maximum time in seconds that you allow Hurl's connection to take.<br><br>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.<br><br>See also [`-m, --max-time`](#max-time).<br><br>Environment variables: HURL_CONNECT_TIMEOUT<br>               |\n| <a href=\"#connect-to\" id=\"connect-to\"><code>--connect-to &lt;HOST1:PORT1:HOST2:PORT2&gt;</code></a>               | 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.<br><br>See also [`--resolve`](#resolve).<br>                                                                                                                                                                                                                                            |\n| <a href=\"#digest\" id=\"digest\"><code>--digest</code></a>                                                           | Tell Hurl to use HTTP Digest authentication<br>                                                                                                                                                                                                                                                                                                                                                                               |\n| <a href=\"#header\" id=\"header\"><code>-H, --header &lt;NAME:VALUE&gt;</code></a>                                    | Add an extra header to include in information sent. Can be used several times in a command.<br><br>Do not add newlines or carriage returns.<br><br>Environment variables: HURL_HEADER='name1:value1&#124;name2:value2' (headers are separated by &#124;)<br>                                                                                                                                                                  |\n| <a href=\"#http10\" id=\"http10\"><code>-0, --http1.0</code></a>                                                      | Tells Hurl to use HTTP version 1.0 instead of using its internally preferred HTTP version.<br><br>Environment variables: HURL_HTTP10<br>                                                                                                                                                                                                                                                                                      |\n| <a href=\"#http11\" id=\"http11\"><code>--http1.1</code></a>                                                          | Tells Hurl to use HTTP version 1.1.<br><br>Environment variables: HURL_HTTP11<br>                                                                                                                                                                                                                                                                                                                                             |\n| <a href=\"#http2\" id=\"http2\"><code>--http2</code></a>                                                              | Tells Hurl to use HTTP version 2.<br>For HTTPS, this means Hurl negotiates HTTP/2 in the TLS handshake. Hurl does this by default.<br>For HTTP, this means Hurl attempts to upgrade the request to HTTP/2 using the Upgrade: request header.<br><br>Environment variables: HURL_HTTP2<br>                                                                                                                                     |\n| <a href=\"#http2-prior-knowledge\" id=\"http2-prior-knowledge\"><code>--http2-prior-knowledge</code></a>              | Tells Hurl to issue a non-TLS HTTP request using HTTP/2 directly without HTTP/1.1 Upgrade. It requires prior knowledge that the server supports HTTP/2 straight away. HTTPS requests still do HTTP/2 the standard way with negotiated protocol versions in the TLS handshake.<br><br>Environment variables: HURL_HTTP2_PRIOR_KNOWLEDGE<br>                                                                                    |\n| <a href=\"#http3\" id=\"http3\"><code>--http3</code></a>                                                              | Tells Hurl to try HTTP version 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.<br><br>Environment variables: HURL_HTTP3<br>                                                                                                                                                                           |\n| <a href=\"#insecure\" id=\"insecure\"><code>-k, --insecure</code></a>                                                 | This option explicitly allows Hurl to perform \"insecure\" SSL connections and transfers.<br><br>Environment variables: HURL_INSECURE<br>                                                                                                                                                                                                                                                                                       |\n| <a href=\"#ipv4\" id=\"ipv4\"><code>-4, --ipv4</code></a>                                                             | This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6.<br><br>Environment variables: HURL_IPV4<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#ipv6\" id=\"ipv6\"><code>-6, --ipv6</code></a>                                                             | This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4.<br><br>Environment variables: HURL_IPV6<br>                                                                                                                                                                                                                                                                        |\n| <a href=\"#key\" id=\"key\"><code>--key &lt;KEY&gt;</code></a>                                                        | Private key file name.<br>                                                                                                                                                                                                                                                                                                                                                                                                    |\n| <a href=\"#limit-rate\" id=\"limit-rate\"><code>--limit-rate &lt;SPEED&gt;</code></a>                                 | 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.<br>The given speed is measured in bytes/second.<br><br>Environment variables: HURL_LIMIT_RATE<br>                                                                  |\n| <a href=\"#location\" id=\"location\"><code>-L, --location</code></a>                                                 | Follow redirect. To limit the amount of redirects to follow use the [`--max-redirs`](#max-redirs) option<br><br>Environment variables: HURL_LOCATION<br>                                                                                                                                                                                                                                                                      |\n| <a href=\"#location-trusted\" id=\"location-trusted\"><code>--location-trusted</code></a>                             | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.<br>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).<br><br>Environment variables: HURL_LOCATION_TRUSTED<br>                                               |\n| <a href=\"#max-filesize\" id=\"max-filesize\"><code>--max-filesize &lt;BYTES&gt;</code></a>                           | 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.<br><br>Environment variables: HURL_MAX_FILESIZE<br><br>This is a cli-only option.<br>                                                                                                                                                                                                  |\n| <a href=\"#max-redirs\" id=\"max-redirs\"><code>--max-redirs &lt;NUM&gt;</code></a>                                   | Set maximum number of redirection-followings allowed<br><br>By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.<br><br>Environment variables: HURL_MAX_REDIRS<br>                                                                                                                                                                                                                    |\n| <a href=\"#max-time\" id=\"max-time\"><code>-m, --max-time &lt;SECONDS&gt;</code></a>                                 | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.<br><br>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.<br><br>See also [`--connect-timeout`](#connect-timeout).<br><br>Environment variables: HURL_MAX_TIME<br> |\n| <a href=\"#negotiate\" id=\"negotiate\"><code>--negotiate</code></a>                                                  | Tell Hurl to use Negotiate (SPNEGO) authentication.<br>                                                                                                                                                                                                                                                                                                                                                                       |\n| <a href=\"#no-cookie-store\" id=\"no-cookie-store\"><code>--no-cookie-store</code></a>                                | Do not use cookie storage for requests/responses in a file. By default, requests in the same Hurl file share cookie storage, this option deactivates cookie engine.<br><br>Environment variables: HURL_NO_COOKIE_STORE<br><br>This is a cli-only option.<br>                                                                                                                                                                  |\n| <a href=\"#no-header\" id=\"no-header\"><code>--no-header &lt;NAME&gt;</code></a>                                     | Remove a header from information sent. Can be used several times in a command.<br><br>Environment variables: HURL_NO_HEADER='name1&#124;name2' (names are separated by &#124;)<br>                                                                                                                                                                                                                                            |\n| <a href=\"#no-proxy\" id=\"no-proxy\"><code>--no-proxy &lt;HOST(S)&gt;</code></a>                                     | Comma-separated list of hosts which do not use a proxy.<br><br>Environment variables: no_proxy<br>                                                                                                                                                                                                                                                                                                                            |\n| <a href=\"#ntlm\" id=\"ntlm\"><code>--ntlm</code><\n\n<!-- File: packages/hurlfmt/README.md (Tokens: ~34 | Category: plugin-manifest) -->\nhurlfmt\n=====================================\n\nThe hurlfmt crate provides the `hurlfmt` binary.\nIt can format hurl files and to export them to JSON/HTML.\n</yakaai_skills>"}