# rust-client
A fast, opinionated command line HTTP client.
Fundamentally, `rust-client` is a thin wrapper around Rust's fantastic `reqwest` library. Unlike `curl`, however, it is designed more as a debugging tool. Headers are displayed above the response body, the command line interface is more intuitive than remembering flags, and default en-/decoding behavior.
## Performance
The following is a totally unscientific benchmark using `/usr/bin/time` to finely measure memory usage and timing for `rust-client`, `curl`, and Python `http`; on my very old development box. Each app was run 5 times on a warm cache, with the following being the averages:
```sh
> /usr/bin/time -l rc get localhost:8000
GET http://localhost:8000/
HTTP/1.1 200 OK
content-length: 9
date: Tue, 10 Jul 2018 14:21:55 GMT
---
It works!
0.03 real 0.01 user 0.01 sys
9494528 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
2376 page reclaims
0 page faults
0 swaps
0 block input operations
0 block output operations
10 messages sent
10 messages received
0 signals received
4 voluntary context switches
95 involuntary context switches
> /usr/bin/time -l curl localhost:8000
It works! 0.03 real 0.01 user 0.00 sys
5005312 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
1272 page reclaims
0 page faults
0 swaps
0 block input operations
0 block output operations
10 messages sent
10 messages received
0 signals received
7 voluntary context switches
47 involuntary context switches
> /usr/bin/time -l http localhost:8000
HTTP/1.1 200 OK
content-length: 9
date: Tue, 10 Jul 2018 14:24:20 GMT
It works!
0.80 real 0.45 user 0.26 sys
26623181 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
33318 page reclaims
0 page faults
0 swaps
0 block input operations
0 block output operations
10 messages sent
10 messages received
30 signals received
100 voluntary context switches
1012 involuntary context switches
```
Note, the measurement of `http` is after warming up the Python runtime using multiple runs of `http`. The following is the initial result:
```sh
HTTP/1.1 200 OK
content-length: 9
date: Tue, 10 Jul 2018 14:23:53 GMT
It works!
3.75 real 0.46 user 0.36 sys
26664960 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
32776 page reclaims
535 page faults
0 swaps
148 block input operations
0 block output operations
14 messages sent
14 messages received
29 signals received
761 voluntary context switches
1263 involuntary context switches
```
While `rust-client` and `curl` perform similarly, `curl` does not print the same level of information that `rust-client` does.
The test server is the example server from `hyper`'s documentation.
## TODO
[x] Have `Command` include request body from `RunConfig`
[ ] Add `JSON` and `Form` arguments which automatically set headers and serialize appropriately
[ ] Allow adding arbitrary headers to request
[ ] Add documentation to major types and functions
[ ] Flag to disable ansi escaping for output
[ ] HTML pretty printing
[ ] encode body content in a specific format (JSON, YAML, etc)
[ ] decode response based on Content-Type