2020-08-27 10:07:46 +03:00
|
|
|
## NAME
|
|
|
|
|
|
|
|
hurl - run and test HTTP requests.
|
|
|
|
|
|
|
|
|
|
|
|
## SYNOPSIS
|
|
|
|
|
|
|
|
**hurl** [options] [FILE...]
|
|
|
|
|
|
|
|
|
|
|
|
## DESCRIPTION
|
|
|
|
|
|
|
|
**Hurl** is an HTTP client that performs HTTP requests defined in a simple plain text format.
|
|
|
|
|
|
|
|
Hurl is very versatile, it enables to chain HTTP requests, capture values from HTTP responses and make asserts.
|
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```
|
|
|
|
$ hurl session.hurl
|
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
If no input-files are specified, input is read from stdin.
|
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```
|
|
|
|
$ echo GET http://httpbin.org/get | hurl
|
2020-08-27 10:07:46 +03:00
|
|
|
{
|
|
|
|
"args": {},
|
|
|
|
"headers": {
|
|
|
|
"Accept": "*/*",
|
|
|
|
"Accept-Encoding": "gzip",
|
|
|
|
"Content-Length": "0",
|
|
|
|
"Host": "httpbin.org",
|
|
|
|
"User-Agent": "hurl/0.99.10",
|
2021-02-20 16:17:42 +03:00
|
|
|
"X-Amzn-Trace-Id": "Root=1-5eedf4c7-520814d64e2f9249ea44e0"
|
2020-08-27 10:07:46 +03:00
|
|
|
},
|
|
|
|
"origin": "1.2.3.4",
|
|
|
|
"url": "http://httpbin.org/get"
|
|
|
|
}
|
2020-10-23 18:30:01 +03:00
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
2021-05-28 17:19:29 +03:00
|
|
|
Output goes to stdout by default. For output to a file, use the -o option:
|
2020-08-27 10:07:46 +03:00
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```
|
|
|
|
$ hurl -o output input.hurl
|
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
2021-05-28 17:19:29 +03:00
|
|
|
By default, Hurl executes all HTTP requests and outputs the response body of the last HTTP call.
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## HURL FILE FORMAT
|
|
|
|
|
|
|
|
The Hurl file format is fully documented in [https://hurl.dev/docs/hurl-file.html](https://hurl.dev/docs/hurl-file.html)
|
|
|
|
|
|
|
|
It consists of one or several HTTP requests
|
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```hurl
|
|
|
|
GET http:/example.net/endpoint1
|
|
|
|
GET http:/example.net/endpoint2
|
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
### Capturing values
|
|
|
|
|
|
|
|
A value from an HTTP response can be-reused for successive HTTP requests.
|
|
|
|
|
|
|
|
A typical example occurs with csrf tokens.
|
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```hurl
|
|
|
|
GET https://example.net
|
|
|
|
HTTP/1.1 200
|
|
|
|
# Capture the CSRF token value from html body.
|
|
|
|
[Captures]
|
|
|
|
csrf_token: xpath "normalize-space(//meta[@name='_csrf_token']/@content)"
|
2020-08-27 10:07:46 +03:00
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
# Do the login !
|
|
|
|
POST https://example.net/login?user=toto&password=1234
|
|
|
|
X-CSRF-TOKEN: {{csrf_token}}
|
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
### Asserts
|
|
|
|
|
|
|
|
The HTTP response defined in the Hurl session are used to make asserts.
|
|
|
|
|
|
|
|
At the minimum, the response includes the asserts on the HTTP version and status code.
|
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```hurl
|
|
|
|
GET http:/google.com
|
|
|
|
HTTP/1.1 302
|
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
It can also include asserts on the response headers
|
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```hurl
|
|
|
|
GET http:/google.com
|
|
|
|
HTTP/1.1 302
|
|
|
|
Location: http://www.google.com
|
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
You can also include explicit asserts combining query and predicate
|
|
|
|
|
2020-10-23 18:30:01 +03:00
|
|
|
```hurl
|
|
|
|
GET http:/google.com
|
|
|
|
HTTP/1.1 302
|
|
|
|
[Asserts]
|
|
|
|
xpath "//title" equals "301 Moved"
|
|
|
|
```
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
Thanks to asserts, Hurl can be used as a testing tool to run scenarii.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## OPTIONS
|
|
|
|
|
|
|
|
Options that exist in curl have exactly the same semantic.
|
|
|
|
|
|
|
|
|
|
|
|
### --color {#color}
|
|
|
|
|
|
|
|
Colorize Output
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-11-16 10:36:20 +03:00
|
|
|
### -b, --cookie <file> {#cookie}
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
Read cookies from file (using the Netscape cookie file format).
|
|
|
|
|
|
|
|
Combined with [-c, --cookie-jar](#cookie-jar), you can simulate a cookie storage between successive Hurl runs.
|
|
|
|
|
|
|
|
|
2020-10-29 19:16:59 +03:00
|
|
|
### --compressed {#compressed}
|
2020-10-11 22:13:41 +03:00
|
|
|
|
|
|
|
Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.
|
|
|
|
|
|
|
|
|
2020-09-23 22:27:49 +03:00
|
|
|
### --connect-timeout <seconds> {#connect-timeout}
|
|
|
|
|
2020-10-29 21:29:51 +03:00
|
|
|
Maximum time in seconds that you allow Hurl's connection to take.
|
2020-09-23 22:27:49 +03:00
|
|
|
|
|
|
|
See also [-m, --max-time](#max-time) option.
|
|
|
|
|
2020-08-27 10:07:46 +03:00
|
|
|
|
2020-11-16 10:36:20 +03:00
|
|
|
### -c, --cookie-jar <file> {#cookie-jar}
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
Write cookies to FILE after running the session (only for one session).
|
|
|
|
The file will be written using the Netscape cookie file format.
|
|
|
|
|
|
|
|
Combined with [-b, --cookie](#cookie),you can simulate a cookie storage between successive Hurl runs.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### --fail-at-end {#fail-at-end}
|
|
|
|
|
|
|
|
Continue executing requests to the end of the Hurl file even when an assert error occurs.
|
|
|
|
By default, Hurl exits after an assert error in the HTTP response.
|
|
|
|
|
2020-11-16 10:36:20 +03:00
|
|
|
Note that this option does not affect the behavior with multiple input Hurl files.
|
2020-08-27 10:07:46 +03:00
|
|
|
|
2020-11-16 10:36:20 +03:00
|
|
|
All the input files are executed independently. The result of one file does not affect the execution of the other Hurl files.
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
### --file-root <dir> {#file-root}
|
|
|
|
|
|
|
|
Set root filesystem to import files in Hurl. This is used for both files in multipart form data and request body.
|
|
|
|
When this is not explicitly defined, the files are relative to the current directory in which Hurl is running.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### -h, --help {#help}
|
|
|
|
|
|
|
|
Usage help. This lists all current command line options with a short description.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### --html <dir> {#html}
|
|
|
|
|
|
|
|
Generate html report in dir.
|
|
|
|
|
2021-09-25 11:54:27 +03:00
|
|
|
If the html report already exists, it will be updated with the new test results.
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
### -i, --include {#include}
|
|
|
|
|
2020-11-16 10:36:20 +03:00
|
|
|
Include the HTTP headers in the output (last entry).
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
2021-01-16 16:18:21 +03:00
|
|
|
### --interactive {#interactive}
|
|
|
|
|
|
|
|
Stop between requests.
|
|
|
|
This is similar to a break point, You can then continue (Press C) or quit (Press Q).
|
|
|
|
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
### --json <file> {#json}
|
|
|
|
|
|
|
|
Write full session(s) to a json file. The format is very closed to HAR format.
|
|
|
|
|
2021-09-25 11:54:27 +03:00
|
|
|
If the json file already exists, the file will be updated with the new test results.
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
### -k, --insecure {#insecure}
|
|
|
|
|
|
|
|
This option explicitly allows Hurl to perform "insecure" SSL connections and transfers.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### -L, --location {#location}
|
|
|
|
|
|
|
|
Follow redirect. You can limit the amount of redirects to follow by using the [--max-redirs](#max-redirs) option.
|
|
|
|
|
|
|
|
|
2020-10-29 21:29:51 +03:00
|
|
|
### -m, --max-time <seconds> {#max-time}
|
2020-09-23 22:27:49 +03:00
|
|
|
|
|
|
|
Maximum time in seconds that you allow a request/response to take. This is the standard timeout.
|
|
|
|
|
|
|
|
See also [--connect-timeout](#connect-timeout) option.
|
|
|
|
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
### --max-redirs <num> {#max-redirs}
|
|
|
|
|
|
|
|
Set maximum number of redirection-followings allowed
|
|
|
|
By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.
|
|
|
|
|
|
|
|
|
|
|
|
### --no-color {#color}
|
|
|
|
|
|
|
|
Do not colorize Output
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### --noproxy <no-proxy-list> {#noproxy}
|
|
|
|
|
|
|
|
Comma-separated list of hosts which do not use a proxy.
|
|
|
|
Override value from Environment variable no_proxy.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### --to-entry <entry-number> {#to-entry}
|
|
|
|
|
|
|
|
Execute Hurl file to ENTRY_NUMBER (starting at 1).
|
|
|
|
Ignore the remaining of the file. It is useful for debugging a session.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### -o, --output <file> {#output}
|
|
|
|
|
|
|
|
Write output to <file> instead of stdout.
|
|
|
|
|
|
|
|
|
2021-07-27 19:18:14 +03:00
|
|
|
### --progress {#progress}
|
|
|
|
|
|
|
|
Print filename and status for each test
|
|
|
|
|
|
|
|
|
2021-07-27 18:19:15 +03:00
|
|
|
### --summary {#summary}
|
|
|
|
|
|
|
|
Print test metrics at the end of the run
|
|
|
|
|
2021-07-28 22:29:40 +03:00
|
|
|
### --test {#test}
|
|
|
|
|
|
|
|
Activate test mode; equals --output /dev/null --progress --summary
|
|
|
|
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
### -x, --proxy [protocol://]host[:port] {#proxy}
|
|
|
|
|
|
|
|
Use the specified proxy.
|
|
|
|
|
2020-10-21 14:48:22 +03:00
|
|
|
### -u, --user <user:password> {#user}
|
|
|
|
|
|
|
|
Add basic Authentication header to each request.
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
|
2020-09-09 23:16:47 +03:00
|
|
|
### --variable <name=value> {#variable}
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
Define variable (name/value) to be used in Hurl templates.
|
|
|
|
Only string values can be defined.
|
|
|
|
|
|
|
|
|
2021-01-09 12:25:01 +03:00
|
|
|
### --variables-file <file> {#variables-file}
|
|
|
|
|
|
|
|
Set properties file in which your define your variables.
|
|
|
|
|
|
|
|
Each variable is defined as name=value exactly as with [--variable](#variable) option.
|
|
|
|
|
|
|
|
Note that defining a variable twice produces an error.
|
|
|
|
|
2020-08-27 10:07:46 +03:00
|
|
|
|
|
|
|
### -v, --verbose {#verbose}
|
|
|
|
|
|
|
|
Turn on verbose output on standard error stream
|
|
|
|
Useful for debugging.
|
|
|
|
|
|
|
|
A line starting with '>' means data sent by Hurl.
|
|
|
|
A line staring with '<' means data received by Hurl.
|
|
|
|
A line starting with '*' means additional info provided by Hurl.
|
|
|
|
|
|
|
|
If you only want HTTP headers in the output, -i, --include might be the option you're looking for.
|
|
|
|
|
|
|
|
|
|
|
|
### -V, --version {#version}
|
|
|
|
|
|
|
|
Prints version information
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## ENVIRONMENT
|
|
|
|
|
|
|
|
Environment variables can only be specified in lowercase.
|
|
|
|
|
|
|
|
Using an environment variable to set the proxy has the same effect as using
|
|
|
|
the [-x, --proxy](#proxy) option.
|
|
|
|
|
|
|
|
### http_proxy [protocol://]<host>[:port]
|
|
|
|
|
|
|
|
Sets the proxy server to use for HTTP.
|
|
|
|
|
|
|
|
|
|
|
|
### https_proxy [protocol://]<host>[:port]
|
|
|
|
|
|
|
|
Sets the proxy server to use for HTTPS.
|
|
|
|
|
|
|
|
|
|
|
|
### all_proxy [protocol://]<host>[:port]
|
|
|
|
|
|
|
|
Sets the proxy server to use if no protocol-specific proxy is set.
|
|
|
|
|
|
|
|
### no_proxy <comma-separated list of hosts>
|
|
|
|
|
|
|
|
list of host names that shouldn't go through any proxy.
|
|
|
|
|
|
|
|
|
|
|
|
## EXIT CODES
|
|
|
|
|
|
|
|
### 1
|
|
|
|
Failed to parse command-line options.
|
|
|
|
|
|
|
|
|
|
|
|
### 2
|
|
|
|
Input File Parsing Error.
|
|
|
|
|
|
|
|
|
|
|
|
### 3
|
|
|
|
Runtime error (such as failure to connect to host).
|
|
|
|
|
|
|
|
|
|
|
|
### 4
|
|
|
|
Assert Error.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## WWW
|
|
|
|
|
|
|
|
[https://hurl.dev](https://hurl.dev)
|
|
|
|
|
|
|
|
|
|
|
|
## SEE ALSO
|
|
|
|
|
|
|
|
curl(1) hurlfmt(1)
|