foghttp 0.3.7__tar.gz → 0.3.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. {foghttp-0.3.7 → foghttp-0.3.9}/Cargo.lock +75 -1
  2. {foghttp-0.3.7 → foghttp-0.3.9}/Cargo.toml +6 -1
  3. {foghttp-0.3.7 → foghttp-0.3.9}/PKG-INFO +22 -6
  4. {foghttp-0.3.7 → foghttp-0.3.9}/README.md +21 -5
  5. foghttp-0.3.9/docs/auth.md +128 -0
  6. foghttp-0.3.9/docs/cookies.md +112 -0
  7. {foghttp-0.3.7 → foghttp-0.3.9}/docs/index.md +25 -3
  8. {foghttp-0.3.7 → foghttp-0.3.9}/docs/lifecycle.md +11 -3
  9. {foghttp-0.3.7 → foghttp-0.3.9}/docs/limitations.md +24 -7
  10. {foghttp-0.3.7 → foghttp-0.3.9}/docs/policy-hooks.md +6 -5
  11. {foghttp-0.3.7 → foghttp-0.3.9}/docs/proxies.md +13 -4
  12. {foghttp-0.3.7 → foghttp-0.3.9}/docs/pyo3-boundary.md +5 -3
  13. {foghttp-0.3.7 → foghttp-0.3.9}/docs/quickstart.md +4 -0
  14. {foghttp-0.3.7 → foghttp-0.3.9}/docs/redirects.md +13 -5
  15. {foghttp-0.3.7 → foghttp-0.3.9}/docs/request-builder.md +13 -10
  16. foghttp-0.3.9/docs/retries.md +224 -0
  17. foghttp-0.3.9/docs/ssrf.md +132 -0
  18. {foghttp-0.3.7 → foghttp-0.3.9}/docs/telemetry.md +13 -5
  19. {foghttp-0.3.7 → foghttp-0.3.9}/docs/timeouts.md +14 -4
  20. {foghttp-0.3.7 → foghttp-0.3.9}/docs/upload-types.md +3 -3
  21. {foghttp-0.3.7 → foghttp-0.3.9}/docs/use-cases.md +22 -11
  22. {foghttp-0.3.7 → foghttp-0.3.9}/examples/README.md +16 -2
  23. foghttp-0.3.9/examples/authentication.py +27 -0
  24. foghttp-0.3.9/examples/cookies.py +24 -0
  25. foghttp-0.3.9/examples/retry_policy.py +41 -0
  26. foghttp-0.3.9/examples/ssrf_policy.py +30 -0
  27. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/__init__.py +21 -0
  28. foghttp-0.3.9/foghttp/_auth_headers.py +61 -0
  29. foghttp-0.3.9/foghttp/_client/auth.py +70 -0
  30. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/config.py +15 -7
  31. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/core.py +2 -1
  32. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/options.py +9 -9
  33. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/raw/errors.py +18 -2
  34. foghttp-0.3.9/foghttp/_client/raw/lifecycle.py +111 -0
  35. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/raw/requests.py +10 -0
  36. foghttp-0.3.9/foghttp/_client/raw/ssrf_errors.py +32 -0
  37. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/raw/timeout_errors.py +1 -0
  38. foghttp-0.3.9/foghttp/_client/request_builder/builder.py +60 -0
  39. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/request_builder/merge.py +3 -3
  40. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/response.py +41 -28
  41. foghttp-0.3.9/foghttp/_client/retry.py +45 -0
  42. foghttp-0.3.9/foghttp/_client/retry_trace_mapping.py +89 -0
  43. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/dispatcher.py +14 -1
  44. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/emission.py +13 -1
  45. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/request_context.py +31 -0
  46. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/request_events.py +7 -0
  47. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/responses.py +12 -0
  48. foghttp-0.3.9/foghttp/_client/telemetry/retries.py +19 -0
  49. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/transport_requests.py +6 -2
  50. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_foghttp.pyi +64 -0
  51. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_telemetry.py +1 -1
  52. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/runtime.py +2 -8
  53. foghttp-0.3.9/foghttp/_validation/callables.py +11 -0
  54. foghttp-0.3.9/foghttp/_validation/ssrf.py +100 -0
  55. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/async_client.py +12 -0
  56. foghttp-0.3.9/foghttp/auth.py +43 -0
  57. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/client.py +12 -0
  58. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/errors/__init__.py +5 -1
  59. foghttp-0.3.9/foghttp/errors/base.py +25 -0
  60. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/errors/response.py +14 -1
  61. foghttp-0.3.9/foghttp/errors/ssrf.py +32 -0
  62. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/headers.py +38 -4
  63. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/messages.py +0 -2
  64. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/policy.py +7 -8
  65. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/request.py +26 -17
  66. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/response.py +17 -2
  67. foghttp-0.3.9/foghttp/retry.py +135 -0
  68. foghttp-0.3.9/foghttp/retry_trace.py +35 -0
  69. foghttp-0.3.9/foghttp/ssrf.py +91 -0
  70. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/base.py +11 -0
  71. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/status.py +12 -0
  72. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/telemetry/__init__.py +10 -1
  73. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/telemetry/events.py +21 -0
  74. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/timeout_diagnostics.py +1 -0
  75. {foghttp-0.3.7 → foghttp-0.3.9}/pyproject.toml +1 -1
  76. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/mod.rs +9 -2
  77. foghttp-0.3.9/src/core/client/ssrf.rs +284 -0
  78. foghttp-0.3.9/src/core/policy/cookies.rs +1065 -0
  79. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/error.rs +10 -0
  80. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/mod.rs +7 -1
  81. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/pipeline.rs +50 -2
  82. foghttp-0.3.9/src/core/policy/retry/tests.rs +253 -0
  83. foghttp-0.3.9/src/core/policy/retry.rs +160 -0
  84. foghttp-0.3.9/src/core/policy/ssrf.rs +749 -0
  85. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/tests.rs +3 -1
  86. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/url/mod.rs +8 -0
  87. {foghttp-0.3.7 → foghttp-0.3.9}/src/errors.rs +4 -0
  88. foghttp-0.3.9/src/py/client/auth.rs +115 -0
  89. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/mod.rs +131 -5
  90. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/parts.rs +2 -0
  91. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/response.rs +21 -0
  92. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/timeout_diagnostics.rs +2 -0
  93. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/transport/body.rs +11 -0
  94. foghttp-0.3.9/src/py/client/transport/buffered.rs +163 -0
  95. foghttp-0.3.9/src/py/client/transport/errors.rs +81 -0
  96. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/transport/mod.rs +1 -0
  97. foghttp-0.3.9/src/py/client/transport/request.rs +811 -0
  98. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/transport/response.rs +16 -1
  99. foghttp-0.3.9/src/py/client/transport/retry.rs +93 -0
  100. foghttp-0.3.9/src/py/client/transport/streaming.rs +198 -0
  101. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/transport/tests.rs +18 -7
  102. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/upload_body.rs +47 -21
  103. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/mod.rs +4 -0
  104. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/response.rs +25 -0
  105. foghttp-0.3.9/src/py/retry.rs +343 -0
  106. foghttp-0.3.9/tests/client_auth/test_async_auth.py +230 -0
  107. foghttp-0.3.9/tests/client_auth/test_contract.py +128 -0
  108. foghttp-0.3.9/tests/client_auth/test_sync_auth.py +589 -0
  109. foghttp-0.3.9/tests/client_cookies/assertions.py +13 -0
  110. foghttp-0.3.9/tests/client_cookies/test_async_cookies.py +96 -0
  111. foghttp-0.3.9/tests/client_cookies/test_sync_cookies.py +181 -0
  112. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/helpers.py +2 -0
  113. foghttp-0.3.9/tests/client_options/raw_options.py +42 -0
  114. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_options/test_raw_numeric_boundary.py +17 -45
  115. foghttp-0.3.9/tests/client_options/test_raw_retry_boundary.py +59 -0
  116. foghttp-0.3.9/tests/client_options/test_raw_ssrf_boundary.py +170 -0
  117. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/client_options.py +2 -0
  118. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/test_http_proxy_transport.py +6 -4
  119. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/test_https_proxy_connect.py +17 -17
  120. foghttp-0.3.9/tests/client_retry/assertions.py +36 -0
  121. foghttp-0.3.9/tests/client_retry/conftest.py +11 -0
  122. foghttp-0.3.9/tests/client_retry/constants.py +18 -0
  123. foghttp-0.3.9/tests/client_retry/models.py +20 -0
  124. foghttp-0.3.9/tests/client_retry/server.py +341 -0
  125. foghttp-0.3.9/tests/client_retry/sources.py +114 -0
  126. foghttp-0.3.9/tests/client_retry/test_async_retry.py +181 -0
  127. foghttp-0.3.9/tests/client_retry/test_attempt_trace.py +528 -0
  128. foghttp-0.3.9/tests/client_retry/test_auth_refresh.py +137 -0
  129. foghttp-0.3.9/tests/client_retry/test_policy_config.py +114 -0
  130. foghttp-0.3.9/tests/client_retry/test_sync_retry.py +506 -0
  131. foghttp-0.3.9/tests/client_ssrf/__init__.py +1 -0
  132. foghttp-0.3.9/tests/client_ssrf/test_async_ssrf.py +70 -0
  133. foghttp-0.3.9/tests/client_ssrf/test_policy_config.py +124 -0
  134. foghttp-0.3.9/tests/client_ssrf/test_sync_ssrf.py +210 -0
  135. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/test_event_contract.py +4 -0
  136. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/test_async_tls.py +1 -2
  137. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/test_sync_tls.py +1 -2
  138. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/test_tls_config.py +1 -3
  139. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_upload/test_upload_helpers.py +1 -1
  140. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/test_async_fault_injection.py +7 -5
  141. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/test_sync_fault_injection.py +7 -5
  142. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/test_sync_socket_shutdown.py +1 -1
  143. {foghttp-0.3.7 → foghttp-0.3.9}/tests/http_body_scenarios.py +3 -0
  144. {foghttp-0.3.7 → foghttp-0.3.9}/tests/network_errors/test_async_network_errors.py +5 -4
  145. {foghttp-0.3.7 → foghttp-0.3.9}/tests/network_errors/test_sync_network_errors.py +5 -4
  146. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/test_async_future_boundary.py +2 -2
  147. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/test_raw_client_signatures.py +14 -0
  148. foghttp-0.3.9/tests/request_builder/__init__.py +0 -0
  149. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_parity.py +5 -0
  150. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_factories.py +3 -7
  151. foghttp-0.3.9/tests/response_decompression/__init__.py +0 -0
  152. foghttp-0.3.9/tests/support/http_routes.py +158 -0
  153. {foghttp-0.3.7 → foghttp-0.3.9}/tests/support/raw_responses.py +23 -2
  154. {foghttp-0.3.7 → foghttp-0.3.9}/tests/support/sync_http_server.py +21 -0
  155. {foghttp-0.3.7 → foghttp-0.3.9}/tests/support/transport_stats.py +10 -4
  156. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_client_options.py +3 -3
  157. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_public_api.py +10 -0
  158. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_raw_client.py +33 -1
  159. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_raw_client_errors.py +75 -0
  160. foghttp-0.3.9/tests/test_transport_stats_waiters.py +52 -0
  161. foghttp-0.3.9/tests/types/__init__.py +0 -0
  162. foghttp-0.3.9/tests/types/test_auth_contracts.py +33 -0
  163. foghttp-0.3.9/tests/types/test_policy_contracts.py +91 -0
  164. foghttp-0.3.9/tests/types/test_retry_trace_contracts.py +87 -0
  165. {foghttp-0.3.7 → foghttp-0.3.9}/uv.lock +1 -1
  166. foghttp-0.3.7/foghttp/_client/raw/lifecycle.py +0 -45
  167. foghttp-0.3.7/foghttp/_client/request_builder/builder.py +0 -48
  168. foghttp-0.3.7/foghttp/errors/base.py +0 -9
  169. foghttp-0.3.7/src/py/client/transport/buffered.rs +0 -108
  170. foghttp-0.3.7/src/py/client/transport/errors.rs +0 -31
  171. foghttp-0.3.7/src/py/client/transport/request.rs +0 -302
  172. foghttp-0.3.7/src/py/client/transport/streaming.rs +0 -156
  173. foghttp-0.3.7/tests/support/http_routes.py +0 -77
  174. foghttp-0.3.7/tests/types/test_policy_contracts.py +0 -40
  175. {foghttp-0.3.7 → foghttp-0.3.9}/.flake8 +0 -0
  176. {foghttp-0.3.7 → foghttp-0.3.9}/.github/workflows/ci.yml +0 -0
  177. {foghttp-0.3.7 → foghttp-0.3.9}/.github/workflows/release.yml +0 -0
  178. {foghttp-0.3.7 → foghttp-0.3.9}/.gitignore +0 -0
  179. {foghttp-0.3.7 → foghttp-0.3.9}/.pre-commit-config.yaml +0 -0
  180. {foghttp-0.3.7 → foghttp-0.3.9}/CODE_OF_CONDUCT.md +0 -0
  181. {foghttp-0.3.7 → foghttp-0.3.9}/CONTRIBUTING.md +0 -0
  182. {foghttp-0.3.7 → foghttp-0.3.9}/LICENSE +0 -0
  183. {foghttp-0.3.7 → foghttp-0.3.9}/SECURITY.md +0 -0
  184. {foghttp-0.3.7 → foghttp-0.3.9}/docs/benchmarks.md +0 -0
  185. {foghttp-0.3.7 → foghttp-0.3.9}/docs/packaging.md +0 -0
  186. {foghttp-0.3.7 → foghttp-0.3.9}/docs/streaming.md +0 -0
  187. {foghttp-0.3.7 → foghttp-0.3.9}/docs/tls.md +0 -0
  188. {foghttp-0.3.7 → foghttp-0.3.9}/examples/async_json_fanout.py +0 -0
  189. {foghttp-0.3.7 → foghttp-0.3.9}/examples/async_lifecycle_debug.py +0 -0
  190. {foghttp-0.3.7 → foghttp-0.3.9}/examples/async_resource_limits.py +0 -0
  191. {foghttp-0.3.7 → foghttp-0.3.9}/examples/async_streaming.py +0 -0
  192. {foghttp-0.3.7 → foghttp-0.3.9}/examples/compressed_response.py +0 -0
  193. {foghttp-0.3.7 → foghttp-0.3.9}/examples/http_proxy.py +0 -0
  194. {foghttp-0.3.7 → foghttp-0.3.9}/examples/multipart_uploads.py +0 -0
  195. {foghttp-0.3.7 → foghttp-0.3.9}/examples/prepared_requests.py +0 -0
  196. {foghttp-0.3.7 → foghttp-0.3.9}/examples/redirects.py +0 -0
  197. {foghttp-0.3.7 → foghttp-0.3.9}/examples/request_builder_compatibility.py +0 -0
  198. {foghttp-0.3.7 → foghttp-0.3.9}/examples/sync_json_api.py +0 -0
  199. {foghttp-0.3.7 → foghttp-0.3.9}/examples/sync_streaming.py +0 -0
  200. {foghttp-0.3.7 → foghttp-0.3.9}/examples/telemetry_hooks.py +0 -0
  201. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/__init__.py +0 -0
  202. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/asyncio_futures.py +0 -0
  203. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/constants.py +0 -0
  204. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/lifecycle_debug.py +0 -0
  205. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/process.py +0 -0
  206. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/__init__.py +0 -0
  207. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/auth.py +0 -0
  208. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/constants.py +0 -0
  209. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/environment.py +0 -0
  210. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/models.py +0 -0
  211. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/no_proxy.py +0 -0
  212. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/no_proxy_rule.py +0 -0
  213. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/no_proxy_tokens.py +0 -0
  214. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/resolver.py +0 -0
  215. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/transport_policy.py +0 -0
  216. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/proxy/url_parsing.py +0 -0
  217. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/raw/__init__.py +0 -0
  218. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/request_builder/__init__.py +0 -0
  219. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/request_builder/defaults.py +0 -0
  220. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/request_builder/header_policy.py +0 -0
  221. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/request_builder/models.py +0 -0
  222. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/runtime/__init__.py +0 -0
  223. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/runtime/constants.py +0 -0
  224. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/runtime/mode.py +0 -0
  225. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/runtime/validation.py +0 -0
  226. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/runtime/workers.py +0 -0
  227. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/stats.py +0 -0
  228. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/stream_context.py +0 -0
  229. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/__init__.py +0 -0
  230. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/clock.py +0 -0
  231. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/telemetry/url.py +0 -0
  232. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/tls.py +0 -0
  233. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/transport.py +0 -0
  234. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_client/transport_snapshot_mapping.py +0 -0
  235. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/__init__.py +0 -0
  236. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/constants.py +0 -0
  237. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/content_type.py +0 -0
  238. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/encoding.py +0 -0
  239. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/fields.py +0 -0
  240. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/file_parts.py +0 -0
  241. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/iterators.py +0 -0
  242. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/length.py +0 -0
  243. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/models.py +0 -0
  244. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/normalize.py +0 -0
  245. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/parts.py +0 -0
  246. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/stream.py +0 -0
  247. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_multipart/values.py +0 -0
  248. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_redaction.py +0 -0
  249. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_request_body.py +0 -0
  250. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_response/__init__.py +0 -0
  251. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_response/encoding.py +0 -0
  252. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_response/status.py +0 -0
  253. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_streaming/__init__.py +0 -0
  254. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_streaming/text/__init__.py +0 -0
  255. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_streaming/text/async_chunks.py +0 -0
  256. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_streaming/text/iterators.py +0 -0
  257. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_streaming/text/lines.py +0 -0
  258. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_streaming/text/sync_chunks.py +0 -0
  259. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/__init__.py +0 -0
  260. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/async_sending.py +0 -0
  261. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/chunks.py +0 -0
  262. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/feeders.py +0 -0
  263. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/file_source.py +0 -0
  264. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/models.py +0 -0
  265. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/normalize.py +0 -0
  266. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/predicates.py +0 -0
  267. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_upload_body/thread_bridge.py +0 -0
  268. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_validation/__init__.py +0 -0
  269. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/_validation/numeric.py +0 -0
  270. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/body.py +0 -0
  271. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/errors/lifecycle.py +0 -0
  272. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/errors/timeout.py +0 -0
  273. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/lifecycle_debug.py +0 -0
  274. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/limits.py +0 -0
  275. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/methods.py +0 -0
  276. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/models.py +0 -0
  277. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/pool_diagnostics.py +0 -0
  278. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/py.typed +0 -0
  279. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/request_extensions.py +0 -0
  280. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/request_info.py +0 -0
  281. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stats.py +0 -0
  282. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/status_codes/__init__.py +0 -0
  283. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/status_codes/client_error.py +0 -0
  284. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/status_codes/redirect.py +0 -0
  285. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/status_codes/server_error.py +0 -0
  286. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/status_codes/success.py +0 -0
  287. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/__init__.py +0 -0
  288. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/async_response.py +0 -0
  289. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/bindings.py +0 -0
  290. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/constants.py +0 -0
  291. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/lifecycle_debug.py +0 -0
  292. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/sync_response.py +0 -0
  293. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/stream_response/telemetry.py +0 -0
  294. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/telemetry/config.py +0 -0
  295. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/telemetry/errors.py +0 -0
  296. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/telemetry/sinks.py +0 -0
  297. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/timeouts.py +0 -0
  298. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/tls.py +0 -0
  299. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/transport_state.py +0 -0
  300. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/transport_stats.py +0 -0
  301. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/types/__init__.py +0 -0
  302. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/types/http.py +0 -0
  303. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/types/multipart.py +0 -0
  304. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/types/request.py +0 -0
  305. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/types/streams.py +0 -0
  306. {foghttp-0.3.7 → foghttp-0.3.9}/foghttp/url.py +0 -0
  307. {foghttp-0.3.7 → foghttp-0.3.9}/logo.png +0 -0
  308. {foghttp-0.3.7 → foghttp-0.3.9}/ruff.toml +0 -0
  309. {foghttp-0.3.7 → foghttp-0.3.9}/scripts/check_all_position.py +0 -0
  310. {foghttp-0.3.7 → foghttp-0.3.9}/scripts/install_wheel_smoke.py +0 -0
  311. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/body.rs +0 -0
  312. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/connection_limit.rs +0 -0
  313. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/proxy/authorization.rs +0 -0
  314. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/proxy/endpoint.rs +0 -0
  315. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/proxy/http.rs +0 -0
  316. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/proxy/mod.rs +0 -0
  317. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/proxy/tests.rs +0 -0
  318. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/proxy/tunnel.rs +0 -0
  319. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/telemetry/mod.rs +0 -0
  320. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/telemetry/tests.rs +0 -0
  321. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/client/write_timeout.rs +0 -0
  322. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/headers/mod.rs +0 -0
  323. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/headers/request.rs +0 -0
  324. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/headers/response.rs +0 -0
  325. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/headers/tests.rs +0 -0
  326. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/method.rs +0 -0
  327. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/atomic.rs +0 -0
  328. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/buffered.rs +0 -0
  329. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/counters.rs +0 -0
  330. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/lifecycle.rs +0 -0
  331. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/mod.rs +0 -0
  332. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/origin/blocking.rs +0 -0
  333. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/origin/metrics.rs +0 -0
  334. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/origin/mod.rs +0 -0
  335. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/origin/registry.rs +0 -0
  336. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/origin/snapshots.rs +0 -0
  337. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/origin/tests.rs +0 -0
  338. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/origin/waiters.rs +0 -0
  339. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/snapshots.rs +0 -0
  340. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/telemetry.rs +0 -0
  341. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/metrics/tests.rs +0 -0
  342. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/mod.rs +0 -0
  343. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/numeric/mod.rs +0 -0
  344. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/numeric/tests.rs +0 -0
  345. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/proxy.rs +0 -0
  346. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/action.rs +0 -0
  347. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/headers.rs +0 -0
  348. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/method.rs +0 -0
  349. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/mod.rs +0 -0
  350. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/policy.rs +0 -0
  351. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/status.rs +0 -0
  352. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/tests.rs +0 -0
  353. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/redirect/utils.rs +0 -0
  354. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/policy/request.rs +0 -0
  355. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/request.rs +0 -0
  356. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/response/body.rs +0 -0
  357. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/response/budget.rs +0 -0
  358. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/response/decompression.rs +0 -0
  359. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/response/mod.rs +0 -0
  360. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/tls/mod.rs +0 -0
  361. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/tls/tests.rs +0 -0
  362. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/url/constants.rs +0 -0
  363. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/url/origin.rs +0 -0
  364. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/url/scheme.rs +0 -0
  365. {foghttp-0.3.7 → foghttp-0.3.9}/src/core/url/tests.rs +0 -0
  366. {foghttp-0.3.7 → foghttp-0.3.9}/src/lib.rs +0 -0
  367. {foghttp-0.3.7 → foghttp-0.3.9}/src/messages.rs +0 -0
  368. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/diagnostics.rs +0 -0
  369. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/gate.rs +0 -0
  370. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/mod.rs +0 -0
  371. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/origin.rs +0 -0
  372. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/pending.rs +0 -0
  373. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/permit.rs +0 -0
  374. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/telemetry.rs +0 -0
  375. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/acquire/tests.rs +0 -0
  376. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/async_requests/active.rs +0 -0
  377. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/async_requests/callback.rs +0 -0
  378. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/async_requests/mod.rs +0 -0
  379. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/async_requests/registry.rs +0 -0
  380. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/async_requests/spawn.rs +0 -0
  381. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/async_requests/stream_spawn.rs +0 -0
  382. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/future.rs +0 -0
  383. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/lifecycle/mod.rs +0 -0
  384. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/lifecycle/tests.rs +0 -0
  385. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/options.rs +0 -0
  386. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/policy_hooks.rs +0 -0
  387. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/process.rs +0 -0
  388. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/runtime/constants.rs +0 -0
  389. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/runtime/mod.rs +0 -0
  390. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/runtime/shared.rs +0 -0
  391. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/runtime/tests.rs +0 -0
  392. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/runtime/workers.rs +0 -0
  393. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/callback.rs +0 -0
  394. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/constants.rs +0 -0
  395. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/mod.rs +0 -0
  396. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/read.rs +0 -0
  397. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/registry.rs +0 -0
  398. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/state.rs +0 -0
  399. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/streams/state_tests.rs +0 -0
  400. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/transport/client.rs +0 -0
  401. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/client/transport/context.rs +0 -0
  402. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/pool_diagnostics.rs +0 -0
  403. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/stats.rs +0 -0
  404. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/transport_state.rs +0 -0
  405. {foghttp-0.3.7 → foghttp-0.3.9}/src/py/url.rs +0 -0
  406. {foghttp-0.3.7 → foghttp-0.3.9}/tests/__init__.py +0 -0
  407. {foghttp-0.3.7/tests/client_keepalive → foghttp-0.3.9/tests/client_auth}/__init__.py +0 -0
  408. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/__init__.py +0 -0
  409. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/conftest.py +0 -0
  410. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/constants.py +0 -0
  411. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/helpers.py +0 -0
  412. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/lifecycle_debug_actions.py +0 -0
  413. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/lifecycle_debug_assertions.py +0 -0
  414. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/lifecycle_debug_data.py +0 -0
  415. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/lifecycle_debug_predicates.py +0 -0
  416. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/test_async_cancellation.py +0 -0
  417. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/test_async_lifecycle_debug_buffered.py +0 -0
  418. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/test_async_lifecycle_debug_messages.py +0 -0
  419. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/test_async_lifecycle_debug_streaming.py +0 -0
  420. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/test_async_lifecycle_debug_strict.py +0 -0
  421. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/test_async_telemetry.py +0 -0
  422. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_cancellation/test_asyncio_helpers.py +0 -0
  423. {foghttp-0.3.7/tests/client_multipart → foghttp-0.3.9/tests/client_cookies}/__init__.py +0 -0
  424. {foghttp-0.3.7/tests/client_policy_hooks → foghttp-0.3.9/tests/client_keepalive}/__init__.py +0 -0
  425. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_keepalive/assertions.py +0 -0
  426. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_keepalive/conftest.py +0 -0
  427. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_keepalive/constants.py +0 -0
  428. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_keepalive/models.py +0 -0
  429. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_keepalive/server.py +0 -0
  430. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_keepalive/test_async_keepalive.py +0 -0
  431. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_keepalive/test_sync_keepalive.py +0 -0
  432. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/__init__.py +0 -0
  433. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/conftest.py +0 -0
  434. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/constants.py +0 -0
  435. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/fork_actions.py +0 -0
  436. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_async_client_lifecycle.py +0 -0
  437. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_fork_close_safety.py +0 -0
  438. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_fork_safety.py +0 -0
  439. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_fork_stream_safety.py +0 -0
  440. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_raw_client_lifecycle.py +0 -0
  441. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_sync_client_lifecycle.py +0 -0
  442. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_sync_close_race.py +0 -0
  443. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_lifecycle/test_sync_close_waits.py +0 -0
  444. {foghttp-0.3.7/tests/client_proxy → foghttp-0.3.9/tests/client_multipart}/__init__.py +0 -0
  445. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_multipart/assertions.py +0 -0
  446. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_multipart/models.py +0 -0
  447. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_multipart/sources.py +0 -0
  448. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_multipart/test_async_multipart.py +0 -0
  449. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_multipart/test_multipart_internals.py +0 -0
  450. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_multipart/test_request_builder.py +0 -0
  451. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_multipart/test_sync_multipart.py +0 -0
  452. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_options/__init__.py +0 -0
  453. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_options/test_numeric_validation.py +0 -0
  454. {foghttp-0.3.7/tests/client_query → foghttp-0.3.9/tests/client_policy_hooks}/__init__.py +0 -0
  455. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_policy_hooks/requests.py +0 -0
  456. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_policy_hooks/test_async_hooks.py +0 -0
  457. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_policy_hooks/test_contract.py +0 -0
  458. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_policy_hooks/test_sync_hooks.py +0 -0
  459. {foghttp-0.3.7/tests/client_resources → foghttp-0.3.9/tests/client_proxy}/__init__.py +0 -0
  460. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/conftest.py +0 -0
  461. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/connect_proxy_server.py +0 -0
  462. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/environment.py +0 -0
  463. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/http_proxy_server.py +0 -0
  464. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/test_client_config.py +0 -0
  465. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/test_environment.py +0 -0
  466. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/test_no_proxy.py +0 -0
  467. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_proxy/test_proxy_models.py +0 -0
  468. {foghttp-0.3.7/tests/client_telemetry → foghttp-0.3.9/tests/client_query}/__init__.py +0 -0
  469. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_query/assertions.py +0 -0
  470. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_query/constants.py +0 -0
  471. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_query/test_async_query.py +0 -0
  472. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_query/test_async_query_redirects.py +0 -0
  473. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_query/test_request_builder.py +0 -0
  474. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_query/test_sync_query.py +0 -0
  475. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_query/test_sync_query_redirects.py +0 -0
  476. {foghttp-0.3.7/tests/client_timeouts → foghttp-0.3.9/tests/client_resources}/__init__.py +0 -0
  477. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/conftest.py +0 -0
  478. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/constants.py +0 -0
  479. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/helpers.py +0 -0
  480. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_async_connection_limits.py +0 -0
  481. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_async_global_limits.py +0 -0
  482. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_async_origin_limits.py +0 -0
  483. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_async_pool_diagnostics.py +0 -0
  484. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_async_response_body_limits.py +0 -0
  485. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_async_transport_state.py +0 -0
  486. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_diagnostic_snapshot_contract.py +0 -0
  487. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_sync_connection_limits.py +0 -0
  488. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_sync_global_limits.py +0 -0
  489. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_sync_origin_limits.py +0 -0
  490. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_sync_pool_diagnostics.py +0 -0
  491. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_sync_response_body_limits.py +0 -0
  492. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_resources/test_sync_transport_state.py +0 -0
  493. {foghttp-0.3.7/tests/client_tls → foghttp-0.3.9/tests/client_retry}/__init__.py +0 -0
  494. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/__init__.py +0 -0
  495. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/conftest.py +0 -0
  496. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/constants.py +0 -0
  497. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/server.py +0 -0
  498. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/stream_readers.py +0 -0
  499. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/test_async_streaming.py +0 -0
  500. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/test_async_streaming_text_lines.py +0 -0
  501. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/test_streaming_text_decoding.py +0 -0
  502. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/test_sync_streaming.py +0 -0
  503. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/test_sync_streaming_text_lines.py +0 -0
  504. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_streaming/text_decoding_sources.py +0 -0
  505. {foghttp-0.3.7/tests/client_upload → foghttp-0.3.9/tests/client_telemetry}/__init__.py +0 -0
  506. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/assertions.py +0 -0
  507. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/conftest.py +0 -0
  508. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/constants.py +0 -0
  509. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/models.py +0 -0
  510. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/test_async_stream_hooks.py +0 -0
  511. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/test_async_stream_telemetry.py +0 -0
  512. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/test_async_telemetry.py +0 -0
  513. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/test_concurrent_delivery.py +0 -0
  514. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/test_sync_stream_telemetry.py +0 -0
  515. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_telemetry/test_sync_telemetry.py +0 -0
  516. {foghttp-0.3.7/tests/fault_injection → foghttp-0.3.9/tests/client_timeouts}/__init__.py +0 -0
  517. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_timeouts/conftest.py +0 -0
  518. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_timeouts/constants.py +0 -0
  519. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_timeouts/helpers.py +0 -0
  520. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_timeouts/test_async_timeouts.py +0 -0
  521. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_timeouts/test_sync_timeouts.py +0 -0
  522. {foghttp-0.3.7/tests/network_errors → foghttp-0.3.9/tests/client_tls}/__init__.py +0 -0
  523. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/assertions.py +0 -0
  524. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/certificates.py +0 -0
  525. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/conftest.py +0 -0
  526. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/constants.py +0 -0
  527. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/handshake_server.py +0 -0
  528. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/models.py +0 -0
  529. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/server.py +0 -0
  530. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/test_async_tls_redirects.py +0 -0
  531. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_tls/test_sync_tls_redirects.py +0 -0
  532. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_transport/__init__.py +0 -0
  533. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_transport/models.py +0 -0
  534. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_transport/test_transport_adapter.py +0 -0
  535. {foghttp-0.3.7/tests/request_builder → foghttp-0.3.9/tests/client_upload}/__init__.py +0 -0
  536. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_upload/helpers.py +0 -0
  537. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_upload/test_streaming_upload.py +0 -0
  538. {foghttp-0.3.7 → foghttp-0.3.9}/tests/client_warning_actions.py +0 -0
  539. {foghttp-0.3.7 → foghttp-0.3.9}/tests/conftest.py +0 -0
  540. {foghttp-0.3.7/tests/response_decompression → foghttp-0.3.9/tests/fault_injection}/__init__.py +0 -0
  541. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/conftest.py +0 -0
  542. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/constants.py +0 -0
  543. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/models.py +0 -0
  544. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/protocol.py +0 -0
  545. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/responses.py +0 -0
  546. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/server.py +0 -0
  547. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/state.py +0 -0
  548. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/state_assertions.py +0 -0
  549. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/test_async_socket_shutdown.py +0 -0
  550. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/timeout_assertions.py +0 -0
  551. {foghttp-0.3.7 → foghttp-0.3.9}/tests/fault_injection/transport_waiters.py +0 -0
  552. {foghttp-0.3.7/tests/types → foghttp-0.3.9/tests/network_errors}/__init__.py +0 -0
  553. {foghttp-0.3.7 → foghttp-0.3.9}/tests/network_errors/conftest.py +0 -0
  554. {foghttp-0.3.7 → foghttp-0.3.9}/tests/network_errors/constants.py +0 -0
  555. {foghttp-0.3.7 → foghttp-0.3.9}/tests/network_errors/helpers.py +0 -0
  556. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/__init__.py +0 -0
  557. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/async_future_server.py +0 -0
  558. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/conftest.py +0 -0
  559. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/constants.py +0 -0
  560. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/gil_progress.py +0 -0
  561. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/test_sync_gil_boundary.py +0 -0
  562. {foghttp-0.3.7 → foghttp-0.3.9}/tests/pyo3_boundary/thread_worker.py +0 -0
  563. {foghttp-0.3.7 → foghttp-0.3.9}/tests/redirect_helpers.py +0 -0
  564. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/encoding_property_helpers.py +0 -0
  565. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_base_url.py +0 -0
  566. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_body.py +0 -0
  567. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_default_headers.py +0 -0
  568. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_default_params.py +0 -0
  569. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_encoding_properties.py +0 -0
  570. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_extensions.py +0 -0
  571. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_header_policy.py +0 -0
  572. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_headers.py +0 -0
  573. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_merge_contract.py +0 -0
  574. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_no_mutation.py +0 -0
  575. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_query_params.py +0 -0
  576. {foghttp-0.3.7 → foghttp-0.3.9}/tests/request_builder/test_shortcuts.py +0 -0
  577. {foghttp-0.3.7 → foghttp-0.3.9}/tests/response_decompression/conftest.py +0 -0
  578. {foghttp-0.3.7 → foghttp-0.3.9}/tests/response_decompression/constants.py +0 -0
  579. {foghttp-0.3.7 → foghttp-0.3.9}/tests/response_decompression/helpers.py +0 -0
  580. {foghttp-0.3.7 → foghttp-0.3.9}/tests/response_decompression/payloads.py +0 -0
  581. {foghttp-0.3.7 → foghttp-0.3.9}/tests/response_decompression/server.py +0 -0
  582. {foghttp-0.3.7 → foghttp-0.3.9}/tests/response_decompression/test_async_response_decompression.py +0 -0
  583. {foghttp-0.3.7 → foghttp-0.3.9}/tests/response_decompression/test_sync_response_decompression.py +0 -0
  584. {foghttp-0.3.7 → foghttp-0.3.9}/tests/support/__init__.py +0 -0
  585. {foghttp-0.3.7 → foghttp-0.3.9}/tests/support/async_http_server.py +0 -0
  586. {foghttp-0.3.7 → foghttp-0.3.9}/tests/support/timeout_diagnostics.py +0 -0
  587. {foghttp-0.3.7 → foghttp-0.3.9}/tests/support/transport_state.py +0 -0
  588. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_async_client.py +0 -0
  589. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_async_redirects.py +0 -0
  590. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_async_response.py +0 -0
  591. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_headers.py +0 -0
  592. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_query_params.py +0 -0
  593. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_redaction.py +0 -0
  594. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_request_extensions.py +0 -0
  595. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_request_model.py +0 -0
  596. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_response_encoding.py +0 -0
  597. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_response_flags.py +0 -0
  598. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_runtime_workers.py +0 -0
  599. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_sync_client.py +0 -0
  600. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_sync_redirects.py +0 -0
  601. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_sync_response.py +0 -0
  602. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_transport_stats.py +0 -0
  603. {foghttp-0.3.7 → foghttp-0.3.9}/tests/test_url.py +0 -0
  604. {foghttp-0.3.7 → foghttp-0.3.9}/tests/types/test_request_extensions_contracts.py +0 -0
  605. {foghttp-0.3.7 → foghttp-0.3.9}/tests/types/test_upload_contracts.py +0 -0
@@ -81,6 +81,12 @@ dependencies = [
81
81
  "cfg-if",
82
82
  ]
83
83
 
84
+ [[package]]
85
+ name = "deranged"
86
+ version = "0.5.8"
87
+ source = "registry+https://github.com/rust-lang/crates.io-index"
88
+ checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
89
+
84
90
  [[package]]
85
91
  name = "displaydoc"
86
92
  version = "0.2.6"
@@ -92,6 +98,12 @@ dependencies = [
92
98
  "syn",
93
99
  ]
94
100
 
101
+ [[package]]
102
+ name = "fastrand"
103
+ version = "2.4.1"
104
+ source = "registry+https://github.com/rust-lang/crates.io-index"
105
+ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
106
+
95
107
  [[package]]
96
108
  name = "find-msvc-tools"
97
109
  version = "0.1.9"
@@ -110,17 +122,21 @@ dependencies = [
110
122
 
111
123
  [[package]]
112
124
  name = "foghttp"
113
- version = "0.3.7"
125
+ version = "0.3.9"
114
126
  dependencies = [
115
127
  "brotli",
116
128
  "bytes",
129
+ "fastrand",
117
130
  "flate2",
118
131
  "http-body-util",
132
+ "httpdate",
119
133
  "hyper",
120
134
  "hyper-rustls",
121
135
  "hyper-util",
122
136
  "pyo3",
137
+ "rfc_6265",
123
138
  "rustls",
139
+ "time",
124
140
  "tokio",
125
141
  "tower-service",
126
142
  "url",
@@ -224,6 +240,12 @@ version = "1.10.1"
224
240
  source = "registry+https://github.com/rust-lang/crates.io-index"
225
241
  checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
226
242
 
243
+ [[package]]
244
+ name = "httpdate"
245
+ version = "1.0.3"
246
+ source = "registry+https://github.com/rust-lang/crates.io-index"
247
+ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
248
+
227
249
  [[package]]
228
250
  name = "hyper"
229
251
  version = "1.10.1"
@@ -421,6 +443,12 @@ dependencies = [
421
443
  "windows-sys 0.61.2",
422
444
  ]
423
445
 
446
+ [[package]]
447
+ name = "num-conv"
448
+ version = "0.2.2"
449
+ source = "registry+https://github.com/rust-lang/crates.io-index"
450
+ checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
451
+
424
452
  [[package]]
425
453
  name = "once_cell"
426
454
  version = "1.21.4"
@@ -454,6 +482,12 @@ dependencies = [
454
482
  "zerovec",
455
483
  ]
456
484
 
485
+ [[package]]
486
+ name = "powerfmt"
487
+ version = "0.2.0"
488
+ source = "registry+https://github.com/rust-lang/crates.io-index"
489
+ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
490
+
457
491
  [[package]]
458
492
  name = "proc-macro2"
459
493
  version = "1.0.106"
@@ -529,6 +563,16 @@ dependencies = [
529
563
  "proc-macro2",
530
564
  ]
531
565
 
566
+ [[package]]
567
+ name = "rfc_6265"
568
+ version = "0.1.1"
569
+ source = "registry+https://github.com/rust-lang/crates.io-index"
570
+ checksum = "c385d4fba1a27dee6cdda85c619e8f714131a1c36da3ee4b67230414c8d7fd84"
571
+ dependencies = [
572
+ "idna",
573
+ "time",
574
+ ]
575
+
532
576
  [[package]]
533
577
  name = "ring"
534
578
  version = "0.17.14"
@@ -674,6 +718,36 @@ version = "0.13.5"
674
718
  source = "registry+https://github.com/rust-lang/crates.io-index"
675
719
  checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
676
720
 
721
+ [[package]]
722
+ name = "time"
723
+ version = "0.3.54"
724
+ source = "registry+https://github.com/rust-lang/crates.io-index"
725
+ checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244"
726
+ dependencies = [
727
+ "deranged",
728
+ "num-conv",
729
+ "powerfmt",
730
+ "serde_core",
731
+ "time-core",
732
+ "time-macros",
733
+ ]
734
+
735
+ [[package]]
736
+ name = "time-core"
737
+ version = "0.1.9"
738
+ source = "registry+https://github.com/rust-lang/crates.io-index"
739
+ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
740
+
741
+ [[package]]
742
+ name = "time-macros"
743
+ version = "0.2.32"
744
+ source = "registry+https://github.com/rust-lang/crates.io-index"
745
+ checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85"
746
+ dependencies = [
747
+ "num-conv",
748
+ "time-core",
749
+ ]
750
+
677
751
  [[package]]
678
752
  name = "tinystr"
679
753
  version = "0.8.3"
@@ -1,8 +1,9 @@
1
1
  [package]
2
2
  name = "foghttp"
3
- version = "0.3.7"
3
+ version = "0.3.9"
4
4
  description = "Observable Rust-powered HTTP client for Python services."
5
5
  edition = "2021"
6
+ rust-version = "1.88"
6
7
  homepage = "https://github.com/AmberFog/foghttp"
7
8
  license = "MIT"
8
9
  publish = false
@@ -20,8 +21,12 @@ extension-module = ["pyo3/extension-module"]
20
21
  [dependencies]
21
22
  brotli = "8.0.4"
22
23
  bytes = "1.12.0"
24
+ fastrand = "2.3.0"
23
25
  flate2 = "1.1.9"
24
26
  http-body-util = "0.1.3"
27
+ httpdate = "1.0.3"
28
+ rfc_6265 = { version = "0.1.1", default-features = false, features = ["date", "idna", "path"] }
29
+ time = { version = "0.3.54", default-features = false, features = ["std"] }
25
30
  url = "2.5.8"
26
31
 
27
32
  [dependencies.hyper]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: foghttp
3
- Version: 0.3.7
3
+ Version: 0.3.9
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Framework :: AsyncIO
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -74,6 +74,8 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
74
74
  - typed telemetry event hooks with redacted request/response lifecycle events
75
75
  - versioned telemetry snapshots that separate alert-oriented stats from
76
76
  diagnostic dump APIs
77
+ - opt-in Rust-owned retries with replayability gates and immutable attempt
78
+ traces, plus opt-in per-hop and post-DNS SSRF destination controls
77
79
  - opt-in async lifecycle debug snapshots for staging and tests
78
80
  - lazy process-wide shared Tokio runtime by default, opt-in dedicated runtime
79
81
  tuning, and fail-closed client ownership across `fork()`
@@ -170,6 +172,10 @@ async with foghttp.AsyncClient() as client:
170
172
  response body, and request completion lifecycle
171
173
  - opt-in typed transport policy hooks for lightweight request admission and
172
174
  response-head checks without default-path Python callbacks
175
+ - opt-in Rust-owned retry policy for selected statuses and pre-header network
176
+ failures, with safe methods, replayable bodies, and immutable attempt traces
177
+ - opt-in Rust-owned SSRF destination policy with per-hop allowlists,
178
+ post-resolution IP checks, and DNS rebinding mitigation
173
179
  - versioned telemetry snapshot metadata for `stats()`, `dump_transport_state()`,
174
180
  and `dump_pool_diagnostics()`
175
181
  - opt-in async lifecycle debug mode for active request snapshots, strict leak
@@ -178,17 +184,25 @@ async with foghttp.AsyncClient() as client:
178
184
  safety
179
185
  - shared Tokio runtime by default, with opt-in dedicated runtime worker tuning
180
186
  - grouped HTTP status constants and reusable HTTP method constants
187
+ - client-level Basic and synchronous callable authentication with retry refresh
188
+ and cross-origin credential stripping
189
+ - opt-in client-owned cookie jar with bounded domain/path/expiry matching,
190
+ redirect/retry coordination, and redacted diagnostics
181
191
 
182
192
  ## Documentation
183
193
 
184
194
  - [Documentation](https://github.com/AmberFog/foghttp/blob/main/docs/index.md)
185
195
  - [Quickstart](https://github.com/AmberFog/foghttp/blob/main/docs/quickstart.md)
186
196
  - [Request builder compatibility](https://github.com/AmberFog/foghttp/blob/main/docs/request-builder.md)
197
+ - [Authentication](https://github.com/AmberFog/foghttp/blob/main/docs/auth.md)
198
+ - [Cookies](https://github.com/AmberFog/foghttp/blob/main/docs/cookies.md)
187
199
  - [Client lifecycle](https://github.com/AmberFog/foghttp/blob/main/docs/lifecycle.md)
188
200
  - [Packaging and Python compatibility](https://github.com/AmberFog/foghttp/blob/main/docs/packaging.md)
189
201
  - [Timeout model](https://github.com/AmberFog/foghttp/blob/main/docs/timeouts.md)
190
202
  - [Upload typing contracts](https://github.com/AmberFog/foghttp/blob/main/docs/upload-types.md)
191
203
  - [Transport policy hooks](https://github.com/AmberFog/foghttp/blob/main/docs/policy-hooks.md)
204
+ - [Retry policy](https://github.com/AmberFog/foghttp/blob/main/docs/retries.md)
205
+ - [SSRF protection](https://github.com/AmberFog/foghttp/blob/main/docs/ssrf.md)
192
206
  - [Telemetry contract](https://github.com/AmberFog/foghttp/blob/main/docs/telemetry.md)
193
207
  - [Response streaming](https://github.com/AmberFog/foghttp/blob/main/docs/streaming.md)
194
208
  - [Proxy and trust_env](https://github.com/AmberFog/foghttp/blob/main/docs/proxies.md)
@@ -207,11 +221,13 @@ available as bytes/text/line context-managed APIs. Streaming `content=` uploads
207
221
  and multipart `files=` uploads are available with explicit replayability and
208
222
  cleanup rules. HTTP proxy routing and HTTPS proxy `CONNECT` tunnelling are
209
223
  available through `proxy=` and `trust_env=True` when the proxy endpoint itself
210
- uses `http://`.
211
- Cookies, auth helpers, HTTP/2, automatic `Accept-Encoding` negotiation,
212
- streaming decompression, and per-request connect timeout reconfiguration are
213
- planned for later versions. Physical connection caps currently apply to the
214
- HTTP/1.1 connector path; HTTP/2 will require separate stream-level limits.
224
+ uses `http://`. Proxy-routed requests fail closed when `SSRFPolicy` is enabled
225
+ because the client cannot prove which target address a remote proxy resolves.
226
+ Provider-specific OAuth flows, HTTP/2, automatic `Accept-Encoding` negotiation,
227
+ streaming decompression, and per-request connect timeout
228
+ reconfiguration are planned for later versions. Physical connection caps
229
+ currently apply to the HTTP/1.1 connector path; HTTP/2 will require separate
230
+ stream-level limits.
215
231
  Response body read timeout is available for buffered and streaming response
216
232
  bodies; request body write timeout is available for buffered and streaming
217
233
  request bodies. Socket lifecycle telemetry is available for the current HTTP/1
@@ -31,6 +31,8 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
31
31
  - typed telemetry event hooks with redacted request/response lifecycle events
32
32
  - versioned telemetry snapshots that separate alert-oriented stats from
33
33
  diagnostic dump APIs
34
+ - opt-in Rust-owned retries with replayability gates and immutable attempt
35
+ traces, plus opt-in per-hop and post-DNS SSRF destination controls
34
36
  - opt-in async lifecycle debug snapshots for staging and tests
35
37
  - lazy process-wide shared Tokio runtime by default, opt-in dedicated runtime
36
38
  tuning, and fail-closed client ownership across `fork()`
@@ -127,6 +129,10 @@ async with foghttp.AsyncClient() as client:
127
129
  response body, and request completion lifecycle
128
130
  - opt-in typed transport policy hooks for lightweight request admission and
129
131
  response-head checks without default-path Python callbacks
132
+ - opt-in Rust-owned retry policy for selected statuses and pre-header network
133
+ failures, with safe methods, replayable bodies, and immutable attempt traces
134
+ - opt-in Rust-owned SSRF destination policy with per-hop allowlists,
135
+ post-resolution IP checks, and DNS rebinding mitigation
130
136
  - versioned telemetry snapshot metadata for `stats()`, `dump_transport_state()`,
131
137
  and `dump_pool_diagnostics()`
132
138
  - opt-in async lifecycle debug mode for active request snapshots, strict leak
@@ -135,17 +141,25 @@ async with foghttp.AsyncClient() as client:
135
141
  safety
136
142
  - shared Tokio runtime by default, with opt-in dedicated runtime worker tuning
137
143
  - grouped HTTP status constants and reusable HTTP method constants
144
+ - client-level Basic and synchronous callable authentication with retry refresh
145
+ and cross-origin credential stripping
146
+ - opt-in client-owned cookie jar with bounded domain/path/expiry matching,
147
+ redirect/retry coordination, and redacted diagnostics
138
148
 
139
149
  ## Documentation
140
150
 
141
151
  - [Documentation](https://github.com/AmberFog/foghttp/blob/main/docs/index.md)
142
152
  - [Quickstart](https://github.com/AmberFog/foghttp/blob/main/docs/quickstart.md)
143
153
  - [Request builder compatibility](https://github.com/AmberFog/foghttp/blob/main/docs/request-builder.md)
154
+ - [Authentication](https://github.com/AmberFog/foghttp/blob/main/docs/auth.md)
155
+ - [Cookies](https://github.com/AmberFog/foghttp/blob/main/docs/cookies.md)
144
156
  - [Client lifecycle](https://github.com/AmberFog/foghttp/blob/main/docs/lifecycle.md)
145
157
  - [Packaging and Python compatibility](https://github.com/AmberFog/foghttp/blob/main/docs/packaging.md)
146
158
  - [Timeout model](https://github.com/AmberFog/foghttp/blob/main/docs/timeouts.md)
147
159
  - [Upload typing contracts](https://github.com/AmberFog/foghttp/blob/main/docs/upload-types.md)
148
160
  - [Transport policy hooks](https://github.com/AmberFog/foghttp/blob/main/docs/policy-hooks.md)
161
+ - [Retry policy](https://github.com/AmberFog/foghttp/blob/main/docs/retries.md)
162
+ - [SSRF protection](https://github.com/AmberFog/foghttp/blob/main/docs/ssrf.md)
149
163
  - [Telemetry contract](https://github.com/AmberFog/foghttp/blob/main/docs/telemetry.md)
150
164
  - [Response streaming](https://github.com/AmberFog/foghttp/blob/main/docs/streaming.md)
151
165
  - [Proxy and trust_env](https://github.com/AmberFog/foghttp/blob/main/docs/proxies.md)
@@ -164,11 +178,13 @@ available as bytes/text/line context-managed APIs. Streaming `content=` uploads
164
178
  and multipart `files=` uploads are available with explicit replayability and
165
179
  cleanup rules. HTTP proxy routing and HTTPS proxy `CONNECT` tunnelling are
166
180
  available through `proxy=` and `trust_env=True` when the proxy endpoint itself
167
- uses `http://`.
168
- Cookies, auth helpers, HTTP/2, automatic `Accept-Encoding` negotiation,
169
- streaming decompression, and per-request connect timeout reconfiguration are
170
- planned for later versions. Physical connection caps currently apply to the
171
- HTTP/1.1 connector path; HTTP/2 will require separate stream-level limits.
181
+ uses `http://`. Proxy-routed requests fail closed when `SSRFPolicy` is enabled
182
+ because the client cannot prove which target address a remote proxy resolves.
183
+ Provider-specific OAuth flows, HTTP/2, automatic `Accept-Encoding` negotiation,
184
+ streaming decompression, and per-request connect timeout
185
+ reconfiguration are planned for later versions. Physical connection caps
186
+ currently apply to the HTTP/1.1 connector path; HTTP/2 will require separate
187
+ stream-level limits.
172
188
  Response body read timeout is available for buffered and streaming response
173
189
  bodies; request body write timeout is available for buffered and streaming
174
190
  request bodies. Socket lifecycle telemetry is available for the current HTTP/1
@@ -0,0 +1,128 @@
1
+ # Authentication
2
+
3
+ FogHTTP provides a small client-level authentication API for Basic credentials
4
+ and request-aware header refresh. Pass `auth=` to either `Client` or
5
+ `AsyncClient`; both clients use the same synchronous contract.
6
+
7
+ ## Basic Authentication
8
+
9
+ Pass a `(username, password)` tuple:
10
+
11
+ ```python
12
+ import foghttp
13
+
14
+
15
+ with foghttp.Client(auth=("service-user", "service-password")) as client:
16
+ response = client.get("https://api.example.com/me")
17
+ response.raise_for_status()
18
+ ```
19
+
20
+ FogHTTP encodes the `username:password` payload as UTF-8 and then Base64. A
21
+ username cannot contain `:` because that character separates the two fields;
22
+ passwords may contain it. Use HTTPS because Basic credentials are encoded, not
23
+ encrypted.
24
+
25
+ ## Callable Authentication
26
+
27
+ A callable receives an immutable `AuthRequest` and returns any normal
28
+ `HeaderSource`: a mapping, an iterable of pairs, `Headers`, or `None`.
29
+
30
+ ```python
31
+ import foghttp
32
+
33
+
34
+ def authenticate(request: foghttp.AuthRequest) -> dict[str, str]:
35
+ tenant = request.extensions["example.tenant"]
36
+ token = token_store.current_token(tenant)
37
+ return {"Authorization": f"Bearer {token}"}
38
+
39
+
40
+ with foghttp.Client(auth=authenticate) as client:
41
+ response = client.get(
42
+ "https://api.example.com/me",
43
+ extensions={"example.tenant": "acme"},
44
+ )
45
+ ```
46
+
47
+ `AuthRequest` contains the current method, URL, immutable header pairs,
48
+ redirect-hop number, and request extensions. Before every snapshot, FogHTTP
49
+ restores the auth-free header layer, including client defaults and per-request
50
+ values, so refresh logic never sees or permanently replaces its stale output.
51
+ Returning `None` or an empty header source removes the previous auth-managed
52
+ values and leaves that lower layer in place.
53
+
54
+ The hook runs at the start of every transport attempt, before request-slot and
55
+ connection acquisition, including a retry and a same-origin redirect. A later
56
+ pool/connection timeout can therefore end the attempt without sending bytes on
57
+ the wire. The hook is synchronous, executes inline on a Rust transport worker
58
+ thread, and may be called concurrently for concurrent requests. Keep it fast,
59
+ thread-safe, independent of event-loop-local state, and do not re-enter the same
60
+ client from the hook. Hook time advances the wall clock used by later total
61
+ timeout checks, but a running callback is not preempted by FogHTTP timeouts,
62
+ task cancellation, or `aclose()`. Once it returns after cancellation, the
63
+ transport request remains aborted and does not acquire a slot or send bytes.
64
+ Time-sensitive signatures must therefore tolerate the configured acquire
65
+ delays. Coroutine functions and awaitable results are rejected.
66
+
67
+ Hook exceptions propagate unchanged before the request acquires a transport
68
+ slot. Auth does not silently fall back to stale credentials, and retry policy
69
+ does not retry auth-hook failures.
70
+
71
+ ## Header Order And Prepared Requests
72
+
73
+ Header precedence is:
74
+
75
+ 1. client default headers;
76
+ 2. auth-managed headers;
77
+ 3. per-request headers and body-generated semantic headers.
78
+
79
+ An explicit per-request header therefore wins over a header with the same name
80
+ returned by auth. FogHTTP also preserves a header added, changed, or deleted on
81
+ a prepared `Request` after `build_request()`; auth does not overwrite that
82
+ manual decision.
83
+
84
+ ```python
85
+ with foghttp.Client(
86
+ headers={"Authorization": "Bearer default"},
87
+ auth=("service-user", "service-password"),
88
+ ) as client:
89
+ response = client.get(
90
+ "https://api.example.com/me",
91
+ headers={"Authorization": "Bearer one-request-token"},
92
+ )
93
+ ```
94
+
95
+ Auth hooks cannot set transport-owned headers such as `Host`, `Content-Length`,
96
+ `Transfer-Encoding`, `Connection`, or `Proxy-Authorization`.
97
+
98
+ ## Redirect Scope
99
+
100
+ Same-origin redirects refresh auth for the new method and URL. On the first
101
+ cross-origin redirect, FogHTTP removes every header actually managed by auth,
102
+ including custom signature or API-key names, and disables auth for the rest of
103
+ that logical request. The callback is not invoked for the new origin, even if a
104
+ later redirect returns to the original origin.
105
+
106
+ This rule is deliberately stricter than asking each callback to recognize a
107
+ trust-boundary change. Explicit `Authorization` request headers are also
108
+ removed by the normal cross-origin redirect header policy.
109
+
110
+ ## Redaction And Scope
111
+
112
+ Basic credentials are reduced to the encoded header during configuration and
113
+ are excluded from configuration repr. `AuthRequest` repr shows header and
114
+ extension counts rather than values. Headers generated by an auth hook are
115
+ marked sensitive dynamically, so their values are redacted from
116
+ `Response.request` and redirect-history repr even when they use a vendor-specific
117
+ name. FogHTTP telemetry does not record request headers.
118
+
119
+ The callable itself is trusted code: it can read the request snapshot, and the
120
+ contents of an exception raised by the callable remain the application's
121
+ responsibility.
122
+
123
+ The API is intentionally FogHTTP-native rather than compatible with
124
+ `httpx.Auth`. The opt-in [cookie jar](./cookies.md) is a separate Rust-owned
125
+ transport policy. If an auth hook supplies `Cookie`, that explicit value wins
126
+ for the hop and the jar does not merge into it. OAuth flows, provider SDKs,
127
+ async auth callables, and a public middleware framework remain outside this
128
+ interface.
@@ -0,0 +1,112 @@
1
+ # Cookies
2
+
3
+ FogHTTP cookies are client-level, opt-in session state. The default remains
4
+ stateless: `cookies=False` stores nothing and never adds a `Cookie` header.
5
+
6
+ ```python
7
+ import foghttp
8
+
9
+
10
+ with foghttp.Client(cookies=True) as client:
11
+ login = client.post(
12
+ "https://api.example.com/login",
13
+ json={"username": "ada", "password": "secret"}, # pragma: allowlist secret
14
+ )
15
+ login.raise_for_status()
16
+
17
+ profile = client.get("https://api.example.com/profile")
18
+ profile.raise_for_status()
19
+ ```
20
+
21
+ `AsyncClient(cookies=True)` has the same behavior. The jar belongs to one
22
+ client, is kept only in memory, and disappears with that client. Clients never
23
+ share cookie state implicitly.
24
+
25
+ ## Matching And Storage
26
+
27
+ The Rust transport owns the jar because redirects, retries, and streaming
28
+ response headers are already managed there. Enabling cookies does not add a
29
+ Python callback to each request.
30
+
31
+ For every `Set-Cookie` response field, FogHTTP independently applies the
32
+ following rules:
33
+
34
+ - host-only and `Domain` cookies use HTTP cookie domain matching
35
+ - `Path` uses segment-boundary matching; a missing or relative value uses the
36
+ request URL's default path
37
+ - `Max-Age` takes precedence over tolerant HTTP cookie-date `Expires` parsing;
38
+ persistent lifetimes are capped at 400 days and expired cookies are removed
39
+ - `Secure` cookies are accepted and sent only for HTTPS or a trustworthy
40
+ loopback origin
41
+ - an insecure origin cannot overwrite or delete a matching secure cookie
42
+ - `__Secure-` and `__Host-` name-prefix requirements are enforced
43
+ - malformed or rejected fields do not prevent valid sibling fields from being
44
+ stored
45
+ - nameless fields such as `Set-Cookie: session-token` are returned without an
46
+ equals sign, following the HTTP cookie retrieval algorithm
47
+
48
+ Matching cookies are sent with longer paths first, then by creation order.
49
+ Cookie values are opaque: supported ASCII header octets, including
50
+ percent-looking values, are preserved exactly rather than decoded or
51
+ canonicalized. Name/value pairs containing non-ASCII `obs-text` are ignored
52
+ rather than transcoded across the Python/Rust string boundary. Cookie scope
53
+ does not include the TCP port. Non-ASCII `Domain` attributes are rejected;
54
+ ASCII punycode domains remain supported.
55
+
56
+ Response headers update the jar before redirect or retry handling, before a
57
+ buffered body is read, and before a streaming response is exposed. A cookie set
58
+ on a retryable response can therefore be used by the next attempt. A body read
59
+ failure does not roll back a valid `Set-Cookie` already received in the response
60
+ headers.
61
+
62
+ ## Header Precedence And Redirects
63
+
64
+ FogHTTP removes only its own previously attached `Cookie` header and selects
65
+ again for every transport attempt and redirect hop. It never blindly forwards
66
+ a managed cookie from the source URL to the redirect target.
67
+
68
+ An explicit request, prepared-request, client-default, or auth-generated
69
+ `Cookie` header wins for that hop. FogHTTP does not merge the jar into an
70
+ explicit value. The existing redirect security policy preserves explicit
71
+ cookies for same-origin redirects and removes them for cross-origin redirects;
72
+ after removal, the jar may select cookies that independently match the target.
73
+
74
+ Because HTTP cookies are scoped by host/domain and path rather than port, a
75
+ cookie may be sent to another port on the same matching host. `Secure` still
76
+ prevents sending a secure cookie over an untrusted plain-HTTP destination.
77
+
78
+ ## Capacity And Expiration
79
+
80
+ The in-memory jar is bounded:
81
+
82
+ - at most 4096 octets for the cookie name and value together
83
+ - at most 16 KiB for one `Set-Cookie` field
84
+ - at most 50 cookies per stored domain value
85
+ - at most 3000 cookies per client
86
+
87
+ Expired entries are removed first. When a domain limit is exceeded, non-secure
88
+ cookies are evicted before secure cookies; equal-priority cookies and global
89
+ overflow are ordered by least recent access. Servers must tolerate cookie
90
+ eviction, as required for interoperable HTTP cookie use.
91
+
92
+ ## Redaction
93
+
94
+ `Cookie` and `Set-Cookie` values are available through the normal header API,
95
+ but their values are redacted from request, response, redirect-history, and
96
+ header `repr()` output. Telemetry does not record request or response header
97
+ values. The native jar has no public debug or inspection representation and
98
+ does not log rejected cookie contents.
99
+
100
+ ## V1 Boundaries
101
+
102
+ The v1 jar is an HTTP service-client feature, not a browser cookie engine:
103
+
104
+ - no public-suffix list is applied; only accept `Domain` cookies from services
105
+ you trust not to set an overly broad suffix
106
+ - `SameSite`, `Partitioned`, and browser third-party-cookie policy are not
107
+ enforced because FogHTTP has no browser top-level-site context
108
+ - there is no persistent storage, public jar mutation/inspection API, or
109
+ automatic sharing between clients
110
+
111
+ Use a browser automation stack when those browser security and privacy
112
+ semantics are part of the application contract.
@@ -4,7 +4,7 @@ layout: "home"
4
4
  hero:
5
5
  name: "FogHTTP"
6
6
  text: "Rust-powered HTTP client for Python"
7
- tagline: "Buffered JSON and form requests, streaming and multipart uploads, sync and async response streaming, transparent response decoding, base URL clients, default headers and params, sync and async APIs, redirects, custom CA certificates, cancellation, and observable request limits with pool diagnostics."
7
+ tagline: "Buffered JSON and form requests, streaming and multipart uploads, sync and async response streaming, transparent response decoding, base URL clients, default headers and params, opt-in cookies, safe retries and SSRF destination controls, redirects, custom CA certificates, cancellation, and observable request limits with pool diagnostics."
8
8
 
9
9
  features:
10
10
  - title: "Rust transport"
@@ -62,6 +62,14 @@ FogHTTP is designed around a few engineering priorities:
62
62
  events
63
63
  - opt-in typed transport policy hooks for lightweight request admission and
64
64
  response-head checks, with Rust-owned redirect safety
65
+ - opt-in Rust-owned retry policy with safe-method defaults, replayability
66
+ gating, bounded backoff, typed decisions, and immutable attempt traces
67
+ - opt-in Rust-owned SSRF destination policy with per-hop allowlists,
68
+ post-resolution IP checks, and DNS rebinding mitigation
69
+ - client-level Basic authentication and synchronous request-aware auth hooks
70
+ with retry refresh and cross-origin credential stripping
71
+ - opt-in client-owned cookie jar with bounded RFC-style domain, path, expiry,
72
+ redirect, and retry behavior
65
73
  - versioned telemetry snapshots that separate alert-oriented stats from
66
74
  diagnostic dump APIs
67
75
  - opt-in async lifecycle debug snapshots for tests, staging, and incident
@@ -74,11 +82,15 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
74
82
 
75
83
  - [Quickstart](./quickstart.md)
76
84
  - [Request builder compatibility](./request-builder.md)
85
+ - [Authentication](./auth.md)
86
+ - [Cookies](./cookies.md)
77
87
  - [Client lifecycle](./lifecycle.md)
78
88
  - [Packaging and Python compatibility](./packaging.md)
79
89
  - [Timeout model](./timeouts.md)
80
90
  - [Upload typing contracts](./upload-types.md)
81
91
  - [Transport policy hooks](./policy-hooks.md)
92
+ - [Retry policy](./retries.md)
93
+ - [SSRF protection](./ssrf.md)
82
94
  - [Telemetry contract](./telemetry.md)
83
95
  - [Response streaming](./streaming.md)
84
96
  - [TLS trust](./tls.md)
@@ -98,6 +110,10 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
98
110
  - cancellable buffered async requests
99
111
  - bounded sync and async response streaming
100
112
  - prepared requests that can be inspected before sending
113
+ - opt-in safe retries with request-scoped attempt diagnostics
114
+ - client-level Basic or callable authentication with explicit redirect scope
115
+ - direct service clients that need an opt-in SSRF guard for partially trusted
116
+ destination URLs
101
117
  - simple benchmarks against other buffered HTTP clients
102
118
 
103
119
  ## Key Features
@@ -106,6 +122,8 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
106
122
  - `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE`, and RFC 10008 `QUERY`
107
123
  - `base_url` for reusable API clients and relative request paths
108
124
  - default client headers and query params for reusable API clients
125
+ - client-level `auth=` for Basic credentials or synchronous header refresh
126
+ - opt-in `cookies=True` session state; see [Cookies](./cookies.md)
109
127
  - query params with repeated keys, JSON, form-urlencoded data, buffered
110
128
  bytes/text bodies, file-like bodies, streaming bytes-like iterables, and
111
129
  multipart `files=` uploads
@@ -136,6 +154,10 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
136
154
  response body, and request completion lifecycle
137
155
  - opt-in typed transport policy hooks with immutable request/response views and
138
156
  no default-path Python callback
157
+ - opt-in retry policy for selected statuses and pre-header network failures,
158
+ with safe methods, replayable bodies, and immutable attempt traces
159
+ - opt-in SSRF destination policy that validates initial and redirected targets,
160
+ then pins each connection attempt to its checked DNS result
139
161
  - versioned telemetry snapshot metadata for `stats()`, `dump_transport_state()`,
140
162
  and `dump_pool_diagnostics()`
141
163
  - opt-in async lifecycle debug mode for active request snapshots and strict
@@ -148,8 +170,8 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
148
170
 
149
171
  ## Not Yet
150
172
 
151
- FogHTTP does not yet implement cookies, HTTP/2, automatic `Accept-Encoding`
152
- negotiation, streaming decompression, or advanced authentication helpers.
173
+ FogHTTP does not yet implement HTTP/2, automatic `Accept-Encoding` negotiation,
174
+ streaming decompression, or provider-specific authentication flows.
153
175
  `trust_env` supports HTTP proxy routing, HTTPS
154
176
  `CONNECT` tunnelling through `http://` proxy endpoints, and `SSL_CERT_FILE`.
155
177
  Disabling TLS verification is intentionally not supported. See
@@ -268,6 +268,12 @@ Calling `aclose()` closes the async client for everyone using it, cancels
268
268
  in-flight async requests, aborts active async streamed response bodies, and then
269
269
  shuts down the Rust transport.
270
270
 
271
+ Cancellation is cooperative at Rust future boundaries. A synchronous auth hook
272
+ that is already executing cannot be preempted by task cancellation or
273
+ `aclose()`; it may continue until the callback returns. The transport request is
274
+ still aborted and holds no request slot or socket because auth runs before
275
+ acquisition.
276
+
271
277
  ```python
272
278
  import asyncio
273
279
 
@@ -527,9 +533,11 @@ if diagnostics["pending_requests"]:
527
533
  ## Current Boundaries
528
534
 
529
535
  The lifecycle contract currently applies to buffered requests/responses,
530
- sync/async streamed response bodies, and streaming request bodies passed through
531
- `content=`. Cookies and advanced auth helpers are planned later and may extend
532
- the lifecycle model.
536
+ sync/async streamed response bodies, streaming request bodies passed through
537
+ `content=`, synchronous callable auth hooks, and the opt-in cookie jar. Cookie
538
+ state belongs to one client and disappears when that client is closed or
539
+ dropped; it is never persisted or shared globally. Provider-specific
540
+ authentication flows may extend the lifecycle model later.
533
541
 
534
542
  FogHTTP exposes socket lifecycle telemetry for the current HTTP/1 path, but
535
543
  HTTP/2 stream-level connection limits are planned with HTTP/2 support rather