# TODO
What are we doing?
- [x] Parse URL (http)
- [x] Set request headers (http)
- [x] Request/response body
- [x] Resolve DNS (dns-lookup)
- [x] Timeout for entire request.
- [ ] Propagate timeout to socket itself?
- [x] Connect socket … or is this API surface?
- [x] Wrap socket in SSL (tls-api)
- [x] Talk http1 (write own h1, httparse)
- [x] Talk http2 (h2)
- [x] Sniff default tokio runtime?
- [x] Set tokio Runtime
- [x] Explore http::Request extension mechanic
- Ergonomic RequestExt
- [x] Query parameters
- [ ] Username/password
- [ ] authorization header
- [x] Serialize JSON
- Ergonomic body
- [x] AsyncRead
- [x] Read to Vec
- [x] Read to String
- [x] Read to JSON
- Body data transformations
- [x] chunked encoding (my own)
- [ ] x-www-form-urlencoded (write it?)
- [ ] form-data (multipart) (write it?)
- Content decoding
- [x] character sets
- [x] gzip
- Content encoding
- [x] character sets
- [x] gzip
- [x] Retry logic
- [x] Categorize errors as retryable or not
- [x] Back-off
- [x] Connection pooling
- [ ] Connection pool timeout
- [ ] Max connections in pool
- [ ] Max connections per host
- [x] Cookie state in connection (cookie)
- [x] Follow redirects
- [ ] Expect-100
- [x] 307/308 redirects.
- [ ] HTTP Proxy
- [x] Investigate why tls-api wants a Sync stream.
- [x] Replace tls-api with with plain rustls.
- [x] Cleanup Errors (implement Display proper)
- [x] Don't send a body in HEAD/OPTIONS etc.
- [ ] Set is_finished early if not content in response
- [x] Tests
- [x] Basic GET with query params
- [x] Basic GET with headers
- [x] Timeout
- [x] POST with small body
- [x] POST with large body
- [x] POST without content length (chunked http11)
- [x] Charset decode
- [x] gzip encoding
- [x] gzip decode
- [x] Download large body
- [x] Follow redirects
- [x] Retries
- [x] 1_000_000 URLs?
- [x] Doc
- [x] First page doc
- [ ] Metadata gathering through request
- [x] Flush after sending body
- [ ] More compressions?
- [ ] Buffer small request/response bodies