# 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