# 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