# 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
