httpcat is a simple utility for constructing raw HTTP
requests on the command line.
Sometimes it is useful to be able to create an actual raw HTTP request on the command line:
- To debug a server issue
- To test the handling of invalid HTTP requests
- To learn how HTTP works under the hood
In such cases, existing CLI HTTP clients—such as
httpie,
curl,
or wget
—are too high-level as they provide
an abstraction layer and one doesn't have a complete control over the
exact raw data that gets written to the HTTP socket connection.
Lower-level tools, such as the popular
netcat, are better suited for this
job.
However, the syntax of HTTP requires headers to be separated with
\r\n which makes it difficult to produce them on the command line.
A typical solution involves the use of echo:
$ echo -ne 'POST /post HTTP/1.1\r\nHost: httpbin.org\r\nContent-Length: 5\r\n\r\nHello' | \
nc localhost 8000httpcat makes this easier:
- Reads command arguments as lines and then lines from
stdin - Auto-completes them, if necessary
- Writes them to
stdout
- Automatic
\r\ncompletion - Automatic
Methodcompletion inRequest-Line - Automatic
HTTP-Versioncompletion inRequest-Line
Interactively create a request and send it with nc:
$ httpcat -v | nc httpbin.org 80
POST /post HTTP/1.1
> POST /post HTTP/1.1\r\n
Host: httpbin.org
> Host: httpbin.org\r\n
Content-Length: 6
> Content-Length: 6\r\n
> \r\n
Hello
> HelloSpecify the whole request in the arguments. Here '' represents an empty
line which will be converted to \r\n\ separating the headers and the
body. Note also that the omitted HTTP-Version is auto-completed:
$ httpcat -v 'POST /post' 'Host: httpbin.org' 'Content-Length: 5' '' 'Hello' | nc httpbin.org 80
> POST /post HTTP/1.1\r\n
> Host: httpbin.org\r\n
> Content-Length: 5\r\n
> \r\n
> Hello
Omitted Method is set to GET and HTTP-Version is auto-completed:
$ httpcat -v / 'Host: example.org' '' | nc example.org 80
> GET / HTTP/1.1\r\n
> Host: example.org\r\n
> \r\nYou can, for example, use stdin for data and arguments for headers:
$ cat file.txt | httpcat -v 'POST /post' 'Host: httpbin.org' 'Content-Length: 16' '' | nc httpbin.org 80
> POST /post HTTP/1.1\r\n
> Host: httpbin.org\r\n
> Content-Length: 16\r\n
> \r\n
> Hello from fileSee also httpcat --help:
usage: httpcat [-h] [-V, --version] [-v] [-n] [line [line ...]]
Create raw HTTP requests on the command line.
positional arguments:
line input lines read before lines from stdin
optional arguments:
-h, --help show this help message and exit
-V, --version show program's version number and exit
-v, --verbose print info about output lines to stderr
-n, --no-stdin disable reading of lines from stdin
- Python 3
pip3 install httpcatAlternatively, you can just download httpcat.py manually and invoke
it as ./httpcat.py instead of httpcat.
python3 setup.py testHTTPie CLI starting with version 2.0.0 also provides an --offline mode. This makes it a good alternative to httpcat because it provides a convenient mechanism for crafting arbitrary HTTP requests without sending them using the user-friendly HTTPie syntax, for example:
echo -n 'Hello' | http --offline POST httpbin.org/postThe above command generates the following output:
POST /post HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 5
Content-Type: application/json
Host: httpbin.org
User-Agent: HTTPie/2.2.0
HelloThe output is valid HTTP, so it can simply be sent using nc:
$ echo -n 'Hello' | http --offline POST httpbin.org/post | nc httpbin.org 80-
0.0.2(2016-12-13)- Added
-v, --verboseand the command is more quiet by default. - Added
-n, --no-stdin - Added
-h, --help - Added
-V, --version
- Added
-
0.0.1(2016-12-12)- Initial release.
Jakub Roztocil