Announcing Hurl 6.0.0

Christmas is early this year: Father Christmas emoji the Hurl team is thrilled to announce Hurl 6.0.0!

Hurl is a command line tool powered by curl, that runs HTTP requests defined in a simple plain text format:

GET https://example.org/api/tests/4567
HTTP 200
[Asserts]
header "x-foo" contains "bar"
certificate "Expire-Date" daysAfterNow > 15
jsonpath "$.status" == "RUNNING"    # Check the status code
jsonpath "$.tests" count == 25      # Check the number of items
jsonpath "$.id" matches /\d{4}/     # Check the format of the id

What’s New in This Release

Generating Dynamic Values with Functions

Before 6.0.0, Hurl files could be only templatized with variables. Variables are either injected in the command line, in [Options] section or through captures.

For instance, let’s take this Hurl file:

PUT https://example.org/api/hits
Content-Type: application/json
{
    "key0": "{{a_string}}",
    "key1": {{a_bool}},
    "key2": {{a_null}},
    "key3": {{a_number}}
}

When called with these options:

$ hurl --variable a_string=apple \
       --variable a_bool=true \
       --variable a_null=null \
       --variable a_number=42 \
       test.hurl

it runs a PUT request with the following JSON body:

{
    "key0": "apple",
    "key1": true,
    "key2": null,
    "key3": 42
}

With Hurl 6.0.0, we’re introducing functions to generate dynamic values. Current functions are:

In the following example, we use the newDate function to generate a dynamic query parameter:

GET https://example.org/api/foo
[QueryStringParams]
date: {{newDate}}
HTTP 200

We run a GET request to https://example.org/api/foo?date=2024%2D12%2D02T10%3A35%3A44%2E461731Z where the date query parameter value is 2024-12-02T10:35:44.461731Z URL encoded.

In this second example, we use the newUuid function to generate an email dynamically:

POST https://example.org/api/foo
{
  "name": "foo",
  "email": "{{newUuid}}@test.com"
}

When run, the request body will be:

{
  "name": "foo",
  "email": "0531f78f-7f87-44be-a7f2-969a1c4e6d97@test.com"
}

Functions are a really nice addition to the Hurl file format, we’ve started small with these two functions, but we plan to add many more; don’t hesitate to open a discussion for your use case!

curl Run Export

In 6.0.0, we have added a new option to help debug and export your Hurl files: with the new --curl option, we can export run files to a list of curl commands. It’s really convenient:

$ hurl --curl commands.txt *.hurl
$ cat commands.txt
curl 'https://google.com'
curl --head 'https://google.com'
curl 'https://google.com'

Debug curl command for each request is still available with --verbose mode but --curl makes it easy to get instead of grepping the standard error.

Speaking of debug curl command, we have also added it to JSON and HTML report, nice!

Shorter Syntax for Sections

With this new version, we have made the syntax a little shorter for sections: instead of [QueryStringParams] we can use [Query] now, [FormParams] becomes [Form] and [MultipartFormData] becomes [Multipart].

POST https://foo.com/login
[Form]
user: alice
password: secret
token: 1234578
HTTP 302
GET https://foo.com/search
[Query]
q: Mbappé
HTTP 200

Shorter names make a nicer Hurl file and are simpler to remember. We will support longer sections names for a long time of course, but we’ll remove them someday! For the moment, documentation is still using longer names and, progressively, it will be updated with shorter names.

Others

In this new version we have implemented two curl options:

  • --limit-rate: limit request to the specified speed in bytes per second. This option is available as a CLI option and can be set on a specific request
  • --connect-timeout: maximum time that connections are allowed to take. This option is set in seconds, but can also use time units like 10s, 20000ms etc...
GET https://foo.com
[Options]
connect-timeout: 30s
limit-rate: 32000

Speaking of CLI options, help in hurl --help has been redesigned and categorized, to make it a little more readable.

We have also fixed a lot of bugs: a particular one was a nasty (but rare) bug in our parallel implementation. Shout-out to Lambros Petrou for having identified this one: TLDR, don’t exit a main entry point program when there are still living threads... Lambros is the mind behind Skybear.NET, a managed platform to automate HTTP API testing. Give it a try, it’s really powerful, simple and super cool (besides using Hurl of course!)

There are a lot of other improvements with Hurl 6.0.0 and also a lot of bug fixes, you can check the complete list of enhancements and bug fixes in our release note.

If you like Hurl, don’t hesitate to give us a star on GitHub or share it on 𝕏 / Twitter!

We’ll be happy to hear from you, either for enhancement requests or for sharing your success story using Hurl!