## NAME

`xh` - Friendly and fast tool for sending HTTP requests

## SYNOPSIS

```
xh [OPTIONS] [METHOD] URL [REQUEST_ITEM ...]
```

## DESCRIPTION

**xh** is an HTTP client with a friendly command line interface. It strives to
have readable output and easy-to-use options.

xh is mostly compatible with HTTPie: see http(1).

The `--curl` option can be used to print a curl(1) translation of the
command instead of sending a request.

## POSITIONAL ARGUMENTS

- `[METHOD]`:
  The HTTP method to use for the request.
  
  This defaults to GET, or to POST if the request contains a body.

- `URL`:
  The URL to request.

  The URL scheme defaults to `http://` normally, or `https://` if
  the program is invoked as `xhs`.

  A leading colon works as shorthand for localhost. `:8000` is equivalent
  to `localhost:8000`, and `:/path` is equivalent to `localhost/path`.

- `[REQUEST_ITEM ...]`:

  Optional key-value pairs to be included in the request.
  
  The separator is used to determine the type:
  
  - `key==value`: Add a query string to the URL.
    
  - `key=value`: Add a JSON property (--json) or form field (--form) to the request body.
    
  - `key:=value`: Add a field with a literal JSON value to the request body.
    
    Example: `numbers:=[1,2,3] enabled:=true`
    
  - `key@filename`: Upload a file (requires --form or --multipart).
    
    To set the filename and mimetype, `;type=` and `;filename=` can be used respectively.
    
    Example: `pfp@ra.jpg;type=image/jpeg;filename=profile.jpg`
    
  - `@filename`: Use a file as the request body.
    
  - `header:value`: Add a header, e.g. `user-agent:foobar`
    
  - `header:`: Unset a header, e.g. `connection:`
    
  - `header;`: Add a header with an empty value.
    
  An `@` prefix can be used to read a value from a file. For example: `x-api-key:@api-key.txt`.
  
  A backslash can be used to escape special characters, e.g. `weird\:key=value`.
  
  To construct a complex JSON object, the REQUEST_ITEM's key can be set to a JSON path instead of a field name. For more information on this syntax, refer to https://httpie.io/docs/cli/nested-json.

## OPTIONS

Each `--OPTION` can be reset with a `--no-OPTION` argument.

- `-j`, `--json`: (default) Serialize data items from the command line as a JSON object.
  
  Overrides both --form and --multipart.

- `-f`, `--form`: Serialize data items from the command line as form fields.
  
  Overrides both --json and --multipart.

- `--multipart`: Like --form, but force a multipart/form-data request even without files.
  
  Overrides both --json and --form.

- `--raw=RAW`: Pass raw request data without extra processing.

- `--pretty=STYLE`: Controls output processing. Possible values are:
  
  - `all`: (default) Enable both coloring and formatting
  - `colors`: Apply syntax highlighting to output
  - `format`: Pretty-print json and sort headers
  - `none`: Disable both coloring and formatting
    
  Defaults to `format` if the NO_COLOR env is set and to `none` if stdout is not tty.

- `--format-options=FORMAT_OPTIONS`: Set output formatting options. Supported option are:
  
  - `json.indent:<NUM>`
  - `json.format:<true|false>`
  - `xml.indent:<NUM>`
  - `xml.format:<true|false>`
  - `headers.sort:<true|false>`
    
  Example: --format-options=json.indent:2,headers.sort:false.

- `-s`, `--style=THEME`: Output coloring style.

  [possible values: `auto`, `solarized`, `monokai`, `fruity`]

- `--response-charset=ENCODING`: Override the response encoding for terminal display purposes.
  
  Example: --response-charset=latin1.

- `--response-mime=MIME_TYPE`: Override the response mime type for coloring and formatting for the terminal.
  
  Example: --response-mime=application/json.

- `-p`, `--print=FORMAT`: String specifying what the output should contain
  
  - `H`: request headers
  - `B`: request body
  - `h`: response headers
  - `b`: response body
  - `m`: response metadata
    
  Example: --print=Hb.

- `-h`, `--headers`: Print only the response headers. Shortcut for --print=h.

- `-b`, `--body`: Print only the response body. Shortcut for --print=b.

- `-m`, `--meta`: Print only the response metadata. Shortcut for --print=m.

- `-v`, `--verbose`: Print the whole request as well as the response.
  
  Additionally, this enables --all for printing intermediary requests/responses while following redirects.
  
  Using verbose twice i.e. -vv will print the response metadata as well.
  
  Equivalent to --print=HhBb --all.

- `--debug`: Print full error stack traces and debug log messages.
  
  Logging can be configured in more detail using the `$RUST_LOG` environment variable. Set `RUST_LOG=trace` to show even more messages. See https://docs.rs/env_logger/0.11.3/env_logger/#enabling-logging.

- `--all`: Show any intermediary requests/responses while following redirects with --follow.

- `-P`, `--history-print=FORMAT`: The same as --print but applies only to intermediary requests/responses.

- `-q`, `--quiet`: Do not print to stdout or stderr.
  
  Using quiet twice i.e. -qq will suppress warnings as well.

- `-S`, `--stream`: Always stream the response body.

- `-x`, `--compress`: Content compressed (encoded) with Deflate algorithm.
  
  The Content-Encoding header is set to deflate.
  
  Compression is skipped if it appears that compression ratio is negative. Compression can be forced by repeating this option.
  
  Note: Compression cannot be used if the Content-Encoding request header is present.

- `-o`, `--output=FILE`: Save output to FILE instead of stdout.

- `-d`, `--download`: Download the body to a file instead of printing it.
  
  The Accept-Encoding header is set to identity and any redirects will be followed.

- `-c`, `--continue`: Resume an interrupted download. Requires --download and --output.

- `--session=FILE`: Create, or reuse and update a session.
  
  Within a session, custom headers, auth credentials, as well as any cookies sent by the server persist between requests.

- `--session-read-only=FILE`: Create or read a session without updating it from the request/response exchange.

- `-A`, `--auth-type=AUTH_TYPE`: Specify the auth mechanism.

  [possible values: `basic`, `bearer`, `digest`]

- `-a`, `--auth=USER[:PASS] | TOKEN`: Authenticate as USER with PASS (-A basic|digest) or with TOKEN (-A bearer).
  
  PASS will be prompted if missing. Use a trailing colon (i.e. `USER:`) to authenticate with just a username.
  
  TOKEN is expected if --auth-type=bearer.

- `--ignore-netrc`: Do not use credentials from .netrc.

- `--offline`: Construct HTTP requests without sending them anywhere.

- `--check-status`: (default) Exit with an error status code if the server replies with an error.
  
  The exit code will be 4 on 4xx (Client Error), 5 on 5xx (Server Error), or 3 on 3xx (Redirect) if --follow isn't set.
  
  If stdout is redirected then a warning is written to stderr.

- `-F`, `--follow`: Do follow redirects.

- `--max-redirects=NUM`: Number of redirects to follow. Only respected if --follow is used.

- `--timeout=SEC`: Connection timeout of the request.
  
  The default value is `0`, i.e., there is no timeout limit.

- `--proxy=PROTOCOL:URL`: Use a proxy for a protocol. For example: --proxy https:http://proxy.host:8080.
  
  PROTOCOL can be `all`, `http` or `https`.
  
  If your proxy requires credentials, put them in the URL, like so: --proxy http:socks5://user:password@proxy.host:8000.
  
  You can specify proxies for multiple protocols by repeating this option.
  
  The environment variables `ALL_PROXY`, `HTTP_PROXY` and `HTTPS_PROXY` can also be used, but are completely ignored if --proxy is passed.

- `--verify=VERIFY`: If `no`, skip SSL verification. If a file path, use it as a CA bundle.
  
  Specifying a CA bundle will disable the system's built-in root certificates.
  
  `false` instead of `no` also works. The default is `yes` (`true`).

- `--cert=FILE`: Use a client side certificate for SSL.

- `--cert-key=FILE`: A private key file to use with --cert.
  
  Only necessary if the private key is not contained in the cert file.

- `--ssl=VERSION`: Force a particular TLS version.
  
  `auto` gives the default behavior of negotiating a version with the server.

  [possible values: `auto`, `tls1`, `tls1.1`, `tls1.2`, `tls1.3`]

- `--native-tls`: Use the system TLS library instead of rustls (if enabled at compile time).

- `--https`: Make HTTPS requests if not specified in the URL.

- `--http-version=VERSION`: HTTP version to use.

  [possible values: `1.0`, `1.1`, `2`, `2-prior-knowledge`, `3-prior-knowledge`]

- `--resolve=HOST:ADDRESS`: Override DNS resolution for specific domain to a custom IP.
  
  You can override multiple domains by repeating this option.
  
  Example: --resolve=example.com:127.0.0.1.

- `--interface=NAME`: Bind to a network interface or local IP address.
  
  Example: --interface=eth0 --interface=192.168.0.2.

- `-4`, `--ipv4`: Resolve hostname to ipv4 addresses only.

- `-6`, `--ipv6`: Resolve hostname to ipv6 addresses only.

- `--unix-socket=FILE`: Connect using a Unix domain socket.
  
  Example: xh :/index.html --unix-socket=/var/run/temp.sock.

- `-I`, `--ignore-stdin`: Do not attempt to read stdin.
  
  This disables the default behaviour of reading the request body from stdin when a redirected input is detected.
  
  It is recommended to pass this flag when using xh for scripting purposes. For more information, refer to https://httpie.io/docs/cli/best-practices.

- `--curl`: Print a translation to a curl command.
  
  For translating the other way, try https://curl2httpie.online/.

- `--curl-long`: Use the long versions of curl's flags.

- `--generate=KIND`: Generate shell completions or man pages. Possible values are:
  
  - `complete-bash`: Generate completions for bash
  - `complete-elvish`: Generate completions for elvish
  - `complete-fish`: Generage completions for fish
  - `complete-nushell`: Generate completions for nushell
  - `complete-powershell`: Generate completions for powershell
  - `complete-zsh`: Generate completions for zsh
  - `man`: Generate manual page in roff format
  - `man-markdown`: Generate manual page in markdown format
    
  Example: xh --generate=complete-bash > xh.bash.

- `--help`: Print help.

- `-V`, `--version`: Print version.

## EXIT STATUS

- `0`: Successful program execution.
- `1`: Usage, syntax or network error.
- `2`: Request timeout.
- `3`: Unexpected HTTP 3xx Redirection.
- `4`: HTTP 4xx Client Error.
- `5`: HTTP 5xx Server Error.
- `6`: Too many redirects.

## ENVIRONMENT

- `XH_CONFIG_DIR`:
  Specifies where to look for config.json and named session data.
  The default is `~/.config/xh` for Linux/macOS and `%APPDATA%\xh` for Windows.

- `XH_HTTPIE_COMPAT_MODE`:
  Enables the HTTPie Compatibility Mode. The only current difference is that
  `--check-status` is not enabled by default. An alternative to setting this
  environment variable is to rename the binary to either http or https.

- `REQUESTS_CA_BUNDLE`, `CURL_CA_BUNDLE`:
  Sets a custom CA bundle path.

- `ALL_PROXY=[protocol://]<host>[:port]`:
  Sets the proxy server for all requests (unless overridden for a specific protocol).

- `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.

- `NO_PROXY`:
  List of comma-separated hosts for which to ignore the other proxy environment variables. `*` matches all host names.

- `NETRC`:
  Location of the `.netrc` file.

- `NO_COLOR`:
  Disables output coloring. See <https://no-color.org>

- `RUST_LOG`:
  Configure low-level debug messages. See https://docs.rs/env_logger/0.11.3/env_logger/#enabling-logging

## FILES

- `~/.config/xh/config.json`:
  xh configuration file. The only configurable option is `default_options`
  which is a list of default shell arguments that gets passed to `xh`.
  Example:

  ```json
  { "default_options": ["--native-tls", "--style=solarized"] }
  ```

- `~/.netrc`, `~/_netrc`:
Auto-login information file.

- `~/.config/xh/sessions`:
Session data directory grouped by domain and port number.

## EXAMPLES

Send a GET request:
```
xh httpbin.org/json
```

Send a POST request with body `{"name": "ahmed", "age": 24}`:
```
xh httpbin.org/post name=ahmed age:=24
```

Send a GET request to http://httpbin.org/json?id=5&sort=true:
```
xh get httpbin.org/json id==5 sort==true
```

Send a GET request and include a header named `X-Api-Key` with value `12345`:
```
xh get Ihttpbin.org/json x-api-key:12345
```

Send a POST request with body read from stdin:
```
echo "[1, 2, 3]" | xh post httpbin.org/post
```

Send a PUT request and pipe the result to `less`:
```
xh put httpbin.org/put id:=49 age:=25 | less
```

Download and save to `res.json`:
```
xh -d httpbin.org/json -o res.json
```

Make a request with a custom user agent:
```
xh httpbin.org/get user-agent:foobar
```

Make an HTTPS request to https://example.com:
```
xhs example.com
```

## REPORTING BUGS
xh's Github issues https://github.com/ducaale/xh/issues

## SEE ALSO
curl(1), http(1)

HTTPie's online documentation https://httpie.io/docs/cli
