foghttp 0.3.4__tar.gz → 0.3.5__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 (500) hide show
  1. {foghttp-0.3.4 → foghttp-0.3.5}/.github/workflows/ci.yml +1 -1
  2. {foghttp-0.3.4 → foghttp-0.3.5}/.pre-commit-config.yaml +4 -4
  3. {foghttp-0.3.4 → foghttp-0.3.5}/Cargo.lock +1 -1
  4. {foghttp-0.3.4 → foghttp-0.3.5}/Cargo.toml +1 -1
  5. {foghttp-0.3.4 → foghttp-0.3.5}/PKG-INFO +23 -17
  6. {foghttp-0.3.4 → foghttp-0.3.5}/README.md +21 -16
  7. foghttp-0.3.5/docs/benchmarks.md +206 -0
  8. {foghttp-0.3.4 → foghttp-0.3.5}/docs/index.md +13 -9
  9. {foghttp-0.3.4 → foghttp-0.3.5}/docs/lifecycle.md +4 -3
  10. {foghttp-0.3.4 → foghttp-0.3.5}/docs/limitations.md +21 -17
  11. {foghttp-0.3.4 → foghttp-0.3.5}/docs/quickstart.md +20 -9
  12. {foghttp-0.3.4 → foghttp-0.3.5}/docs/request-builder.md +74 -17
  13. {foghttp-0.3.4 → foghttp-0.3.5}/docs/streaming.md +4 -2
  14. {foghttp-0.3.4 → foghttp-0.3.5}/docs/timeouts.md +52 -35
  15. foghttp-0.3.5/docs/upload-types.md +92 -0
  16. {foghttp-0.3.4 → foghttp-0.3.5}/docs/use-cases.md +10 -7
  17. {foghttp-0.3.4 → foghttp-0.3.5}/examples/README.md +6 -3
  18. foghttp-0.3.5/examples/multipart_uploads.py +51 -0
  19. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/__init__.py +2 -0
  20. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/core.py +5 -2
  21. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/errors.py +4 -10
  22. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/requests.py +31 -10
  23. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/timeout_errors.py +2 -0
  24. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/builder.py +5 -3
  25. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/models.py +4 -2
  26. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/transport_requests.py +1 -2
  27. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_foghttp.pyi +25 -0
  28. foghttp-0.3.5/foghttp/_multipart/__init__.py +3 -0
  29. foghttp-0.3.5/foghttp/_multipart/constants.py +8 -0
  30. foghttp-0.3.5/foghttp/_multipart/content_type.py +92 -0
  31. foghttp-0.3.5/foghttp/_multipart/encoding.py +62 -0
  32. foghttp-0.3.5/foghttp/_multipart/fields.py +48 -0
  33. foghttp-0.3.5/foghttp/_multipart/file_parts.py +115 -0
  34. foghttp-0.3.5/foghttp/_multipart/iterators.py +49 -0
  35. foghttp-0.3.5/foghttp/_multipart/length.py +29 -0
  36. foghttp-0.3.5/foghttp/_multipart/models.py +43 -0
  37. foghttp-0.3.5/foghttp/_multipart/normalize.py +54 -0
  38. foghttp-0.3.5/foghttp/_multipart/parts.py +25 -0
  39. foghttp-0.3.5/foghttp/_multipart/stream.py +107 -0
  40. foghttp-0.3.5/foghttp/_multipart/values.py +45 -0
  41. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_redaction.py +34 -2
  42. foghttp-0.3.5/foghttp/_request_body.py +58 -0
  43. foghttp-0.3.5/foghttp/_upload_body/__init__.py +13 -0
  44. foghttp-0.3.5/foghttp/_upload_body/async_sending.py +38 -0
  45. foghttp-0.3.5/foghttp/_upload_body/chunks.py +11 -0
  46. foghttp-0.3.5/foghttp/_upload_body/feeders.py +106 -0
  47. foghttp-0.3.5/foghttp/_upload_body/file_source.py +80 -0
  48. foghttp-0.3.5/foghttp/_upload_body/models.py +39 -0
  49. foghttp-0.3.5/foghttp/_upload_body/normalize.py +39 -0
  50. foghttp-0.3.5/foghttp/_upload_body/predicates.py +17 -0
  51. foghttp-0.3.5/foghttp/_upload_body/runtime.py +205 -0
  52. foghttp-0.3.5/foghttp/_upload_body/thread_bridge.py +67 -0
  53. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/async_client.py +20 -19
  54. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/body.py +25 -18
  55. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/client.py +20 -19
  56. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/__init__.py +2 -1
  57. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/timeout.py +5 -1
  58. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/messages.py +27 -2
  59. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/request.py +3 -2
  60. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/timeout_diagnostics.py +1 -0
  61. foghttp-0.3.5/foghttp/types/__init__.py +59 -0
  62. foghttp-0.3.5/foghttp/types/multipart.py +39 -0
  63. foghttp-0.3.5/foghttp/types/streams.py +29 -0
  64. {foghttp-0.3.4 → foghttp-0.3.5}/pyproject.toml +5 -5
  65. foghttp-0.3.5/src/core/client/body.rs +345 -0
  66. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/mod.rs +34 -5
  67. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/telemetry/mod.rs +96 -5
  68. foghttp-0.3.5/src/core/client/telemetry/tests.rs +317 -0
  69. foghttp-0.3.5/src/core/client/write_timeout.rs +179 -0
  70. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/request.rs +20 -5
  71. {foghttp-0.3.4 → foghttp-0.3.5}/src/errors.rs +5 -0
  72. {foghttp-0.3.4 → foghttp-0.3.5}/src/messages.rs +1 -0
  73. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/body.rs +0 -8
  74. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/mod.rs +46 -11
  75. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/options.rs +2 -0
  76. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/timeout_diagnostics.rs +18 -1
  77. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/buffered.rs +8 -5
  78. foghttp-0.3.5/src/py/client/transport/client.rs +50 -0
  79. foghttp-0.3.5/src/py/client/transport/errors.rs +12 -0
  80. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/mod.rs +1 -0
  81. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/request.rs +91 -11
  82. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/streaming.rs +8 -5
  83. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/tests.rs +31 -4
  84. foghttp-0.3.5/src/py/client/upload_body.rs +203 -0
  85. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/mod.rs +2 -1
  86. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/server.py +38 -1
  87. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/test_async_keepalive.py +16 -0
  88. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/test_sync_keepalive.py +16 -0
  89. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_raw_client_lifecycle.py +2 -2
  90. foghttp-0.3.5/tests/client_multipart/assertions.py +50 -0
  91. foghttp-0.3.5/tests/client_multipart/models.py +9 -0
  92. foghttp-0.3.5/tests/client_multipart/sources.py +163 -0
  93. foghttp-0.3.5/tests/client_multipart/test_async_multipart.py +323 -0
  94. foghttp-0.3.5/tests/client_multipart/test_multipart_internals.py +346 -0
  95. foghttp-0.3.5/tests/client_multipart/test_request_builder.py +326 -0
  96. foghttp-0.3.5/tests/client_multipart/test_sync_multipart.py +326 -0
  97. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_options/test_raw_numeric_boundary.py +32 -0
  98. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_http_proxy_transport.py +66 -0
  99. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_https_proxy_connect.py +33 -0
  100. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_sync_streaming.py +2 -0
  101. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_sync_streaming_text_lines.py +5 -0
  102. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/conftest.py +44 -3
  103. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/constants.py +12 -0
  104. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/test_async_timeouts.py +53 -0
  105. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/test_sync_timeouts.py +30 -0
  106. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_transport/models.py +30 -4
  107. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_transport/test_transport_adapter.py +53 -4
  108. foghttp-0.3.5/tests/client_upload/helpers.py +110 -0
  109. foghttp-0.3.5/tests/client_upload/test_streaming_upload.py +588 -0
  110. foghttp-0.3.5/tests/client_upload/test_upload_helpers.py +174 -0
  111. foghttp-0.3.5/tests/request_builder/__init__.py +0 -0
  112. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_body.py +28 -3
  113. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_shortcuts.py +106 -0
  114. foghttp-0.3.5/tests/response_decompression/__init__.py +0 -0
  115. {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/async_http_server.py +26 -1
  116. {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/sync_http_server.py +24 -2
  117. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_raw_client.py +10 -4
  118. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_raw_client_errors.py +40 -2
  119. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_redaction.py +64 -0
  120. foghttp-0.3.5/tests/types/__init__.py +0 -0
  121. foghttp-0.3.5/tests/types/test_upload_contracts.py +138 -0
  122. {foghttp-0.3.4 → foghttp-0.3.5}/uv.lock +15 -1
  123. foghttp-0.3.4/docs/benchmarks.md +0 -356
  124. foghttp-0.3.4/foghttp/_request_body.py +0 -30
  125. foghttp-0.3.4/foghttp/types/__init__.py +0 -24
  126. foghttp-0.3.4/src/core/client/telemetry/tests.rs +0 -70
  127. foghttp-0.3.4/src/py/client/transport/client.rs +0 -24
  128. {foghttp-0.3.4 → foghttp-0.3.5}/.flake8 +0 -0
  129. {foghttp-0.3.4 → foghttp-0.3.5}/.github/workflows/release.yml +0 -0
  130. {foghttp-0.3.4 → foghttp-0.3.5}/.gitignore +0 -0
  131. {foghttp-0.3.4 → foghttp-0.3.5}/CODE_OF_CONDUCT.md +0 -0
  132. {foghttp-0.3.4 → foghttp-0.3.5}/CONTRIBUTING.md +0 -0
  133. {foghttp-0.3.4 → foghttp-0.3.5}/LICENSE +0 -0
  134. {foghttp-0.3.4 → foghttp-0.3.5}/SECURITY.md +0 -0
  135. {foghttp-0.3.4 → foghttp-0.3.5}/docs/proxies.md +0 -0
  136. {foghttp-0.3.4 → foghttp-0.3.5}/docs/pyo3-boundary.md +0 -0
  137. {foghttp-0.3.4 → foghttp-0.3.5}/docs/redirects.md +0 -0
  138. {foghttp-0.3.4 → foghttp-0.3.5}/docs/telemetry.md +0 -0
  139. {foghttp-0.3.4 → foghttp-0.3.5}/docs/tls.md +0 -0
  140. {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_json_fanout.py +0 -0
  141. {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_lifecycle_debug.py +0 -0
  142. {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_resource_limits.py +0 -0
  143. {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_streaming.py +0 -0
  144. {foghttp-0.3.4 → foghttp-0.3.5}/examples/compressed_response.py +0 -0
  145. {foghttp-0.3.4 → foghttp-0.3.5}/examples/http_proxy.py +0 -0
  146. {foghttp-0.3.4 → foghttp-0.3.5}/examples/prepared_requests.py +0 -0
  147. {foghttp-0.3.4 → foghttp-0.3.5}/examples/redirects.py +0 -0
  148. {foghttp-0.3.4 → foghttp-0.3.5}/examples/request_builder_compatibility.py +0 -0
  149. {foghttp-0.3.4 → foghttp-0.3.5}/examples/sync_json_api.py +0 -0
  150. {foghttp-0.3.4 → foghttp-0.3.5}/examples/sync_streaming.py +0 -0
  151. {foghttp-0.3.4 → foghttp-0.3.5}/examples/telemetry_hooks.py +0 -0
  152. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/__init__.py +0 -0
  153. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/asyncio_futures.py +0 -0
  154. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/config.py +0 -0
  155. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/constants.py +0 -0
  156. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/lifecycle_debug.py +0 -0
  157. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/options.py +0 -0
  158. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/__init__.py +0 -0
  159. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/auth.py +0 -0
  160. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/constants.py +0 -0
  161. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/environment.py +0 -0
  162. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/models.py +0 -0
  163. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/no_proxy.py +0 -0
  164. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/no_proxy_rule.py +0 -0
  165. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/no_proxy_tokens.py +0 -0
  166. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/resolver.py +0 -0
  167. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/transport_policy.py +0 -0
  168. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/url_parsing.py +0 -0
  169. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/__init__.py +0 -0
  170. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/lifecycle.py +0 -0
  171. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/__init__.py +0 -0
  172. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/defaults.py +0 -0
  173. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/header_policy.py +0 -0
  174. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/merge.py +0 -0
  175. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/response.py +0 -0
  176. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/runtime/__init__.py +0 -0
  177. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/runtime/constants.py +0 -0
  178. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/runtime/workers.py +0 -0
  179. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/stats.py +0 -0
  180. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/stream_context.py +0 -0
  181. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/__init__.py +0 -0
  182. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/clock.py +0 -0
  183. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/dispatcher.py +0 -0
  184. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/emission.py +0 -0
  185. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/request_context.py +0 -0
  186. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/request_events.py +0 -0
  187. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/responses.py +0 -0
  188. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/url.py +0 -0
  189. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/tls.py +0 -0
  190. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/transport.py +0 -0
  191. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_response/__init__.py +0 -0
  192. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_response/encoding.py +0 -0
  193. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_response/status.py +0 -0
  194. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/__init__.py +0 -0
  195. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/__init__.py +0 -0
  196. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/async_chunks.py +0 -0
  197. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/iterators.py +0 -0
  198. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/lines.py +0 -0
  199. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/sync_chunks.py +0 -0
  200. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_telemetry.py +0 -0
  201. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_validation/__init__.py +0 -0
  202. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_validation/numeric.py +0 -0
  203. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/base.py +0 -0
  204. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/lifecycle.py +0 -0
  205. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/response.py +0 -0
  206. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/headers.py +0 -0
  207. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/lifecycle_debug.py +0 -0
  208. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/limits.py +0 -0
  209. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/methods.py +0 -0
  210. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/models.py +0 -0
  211. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/pool_diagnostics.py +0 -0
  212. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/py.typed +0 -0
  213. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/request_info.py +0 -0
  214. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/response.py +0 -0
  215. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stats.py +0 -0
  216. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/__init__.py +0 -0
  217. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/client_error.py +0 -0
  218. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/redirect.py +0 -0
  219. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/server_error.py +0 -0
  220. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/success.py +0 -0
  221. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/__init__.py +0 -0
  222. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/async_response.py +0 -0
  223. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/base.py +0 -0
  224. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/bindings.py +0 -0
  225. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/constants.py +0 -0
  226. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/lifecycle_debug.py +0 -0
  227. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/status.py +0 -0
  228. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/sync_response.py +0 -0
  229. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/telemetry.py +0 -0
  230. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/__init__.py +0 -0
  231. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/config.py +0 -0
  232. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/errors.py +0 -0
  233. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/events.py +0 -0
  234. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/sinks.py +0 -0
  235. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/timeouts.py +0 -0
  236. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/tls.py +0 -0
  237. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/transport_state.py +0 -0
  238. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/transport_stats.py +0 -0
  239. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/types/http.py +0 -0
  240. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/types/request.py +0 -0
  241. {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/url.py +0 -0
  242. {foghttp-0.3.4 → foghttp-0.3.5}/logo.png +0 -0
  243. {foghttp-0.3.4 → foghttp-0.3.5}/ruff.toml +0 -0
  244. {foghttp-0.3.4 → foghttp-0.3.5}/scripts/check_all_position.py +0 -0
  245. {foghttp-0.3.4 → foghttp-0.3.5}/scripts/install_wheel_smoke.py +0 -0
  246. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/authorization.rs +0 -0
  247. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/endpoint.rs +0 -0
  248. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/http.rs +0 -0
  249. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/mod.rs +0 -0
  250. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/tests.rs +0 -0
  251. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/tunnel.rs +0 -0
  252. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/mod.rs +0 -0
  253. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/request.rs +0 -0
  254. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/response.rs +0 -0
  255. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/tests.rs +0 -0
  256. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/method.rs +0 -0
  257. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/atomic.rs +0 -0
  258. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/buffered.rs +0 -0
  259. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/counters.rs +0 -0
  260. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/lifecycle.rs +0 -0
  261. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/mod.rs +0 -0
  262. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/blocking.rs +0 -0
  263. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/metrics.rs +0 -0
  264. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/mod.rs +0 -0
  265. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/registry.rs +0 -0
  266. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/snapshots.rs +0 -0
  267. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/tests.rs +0 -0
  268. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/waiters.rs +0 -0
  269. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/snapshots.rs +0 -0
  270. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/telemetry.rs +0 -0
  271. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/tests.rs +0 -0
  272. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/mod.rs +0 -0
  273. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/numeric/mod.rs +0 -0
  274. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/numeric/tests.rs +0 -0
  275. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/body.rs +0 -0
  276. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/budget.rs +0 -0
  277. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/decompression.rs +0 -0
  278. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/mod.rs +0 -0
  279. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/tls/mod.rs +0 -0
  280. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/tls/tests.rs +0 -0
  281. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/constants.rs +0 -0
  282. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/mod.rs +0 -0
  283. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/origin.rs +0 -0
  284. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/scheme.rs +0 -0
  285. {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/tests.rs +0 -0
  286. {foghttp-0.3.4 → foghttp-0.3.5}/src/lib.rs +0 -0
  287. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/diagnostics.rs +0 -0
  288. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/gate.rs +0 -0
  289. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/mod.rs +0 -0
  290. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/origin.rs +0 -0
  291. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/pending.rs +0 -0
  292. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/permit.rs +0 -0
  293. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/telemetry.rs +0 -0
  294. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/tests.rs +0 -0
  295. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/active.rs +0 -0
  296. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/callback.rs +0 -0
  297. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/mod.rs +0 -0
  298. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/registry.rs +0 -0
  299. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/spawn.rs +0 -0
  300. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/stream_spawn.rs +0 -0
  301. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/future.rs +0 -0
  302. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/lifecycle/mod.rs +0 -0
  303. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/lifecycle/tests.rs +0 -0
  304. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/action.rs +0 -0
  305. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/headers.rs +0 -0
  306. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/method.rs +0 -0
  307. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/mod.rs +0 -0
  308. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/policy.rs +0 -0
  309. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/status.rs +0 -0
  310. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/tests.rs +0 -0
  311. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/utils.rs +0 -0
  312. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/constants.rs +0 -0
  313. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/mod.rs +0 -0
  314. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/tests.rs +0 -0
  315. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/workers.rs +0 -0
  316. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/callback.rs +0 -0
  317. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/constants.rs +0 -0
  318. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/mod.rs +0 -0
  319. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/parts.rs +0 -0
  320. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/read.rs +0 -0
  321. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/registry.rs +0 -0
  322. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/response.rs +0 -0
  323. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/state.rs +0 -0
  324. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/state_tests.rs +0 -0
  325. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/body.rs +0 -0
  326. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/context.rs +0 -0
  327. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/proxy.rs +0 -0
  328. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/response.rs +0 -0
  329. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/pool_diagnostics.rs +0 -0
  330. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/response.rs +0 -0
  331. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/stats.rs +0 -0
  332. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/transport_state.rs +0 -0
  333. {foghttp-0.3.4 → foghttp-0.3.5}/src/py/url.rs +0 -0
  334. {foghttp-0.3.4 → foghttp-0.3.5}/tests/__init__.py +0 -0
  335. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/__init__.py +0 -0
  336. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/conftest.py +0 -0
  337. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/constants.py +0 -0
  338. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/helpers.py +0 -0
  339. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_actions.py +0 -0
  340. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_assertions.py +0 -0
  341. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_data.py +0 -0
  342. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_predicates.py +0 -0
  343. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_cancellation.py +0 -0
  344. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_buffered.py +0 -0
  345. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_messages.py +0 -0
  346. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_streaming.py +0 -0
  347. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_strict.py +0 -0
  348. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_telemetry.py +0 -0
  349. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_asyncio_helpers.py +0 -0
  350. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/__init__.py +0 -0
  351. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/assertions.py +0 -0
  352. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/conftest.py +0 -0
  353. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/constants.py +0 -0
  354. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/models.py +0 -0
  355. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/__init__.py +0 -0
  356. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/conftest.py +0 -0
  357. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/constants.py +0 -0
  358. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/helpers.py +0 -0
  359. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_async_client_lifecycle.py +0 -0
  360. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_sync_client_lifecycle.py +0 -0
  361. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_sync_close_race.py +0 -0
  362. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_sync_close_waits.py +0 -0
  363. {foghttp-0.3.4/tests/client_proxy → foghttp-0.3.5/tests/client_multipart}/__init__.py +0 -0
  364. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_options/__init__.py +0 -0
  365. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_options/test_numeric_validation.py +0 -0
  366. {foghttp-0.3.4/tests/client_resources → foghttp-0.3.5/tests/client_proxy}/__init__.py +0 -0
  367. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/client_options.py +0 -0
  368. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/conftest.py +0 -0
  369. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/connect_proxy_server.py +0 -0
  370. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/environment.py +0 -0
  371. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/http_proxy_server.py +0 -0
  372. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_client_config.py +0 -0
  373. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_environment.py +0 -0
  374. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_no_proxy.py +0 -0
  375. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_proxy_models.py +0 -0
  376. {foghttp-0.3.4/tests/client_telemetry → foghttp-0.3.5/tests/client_resources}/__init__.py +0 -0
  377. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/conftest.py +0 -0
  378. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/constants.py +0 -0
  379. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/helpers.py +0 -0
  380. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_global_limits.py +0 -0
  381. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_origin_limits.py +0 -0
  382. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_pool_diagnostics.py +0 -0
  383. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_response_body_limits.py +0 -0
  384. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_transport_state.py +0 -0
  385. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_diagnostic_snapshot_contract.py +0 -0
  386. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_global_limits.py +0 -0
  387. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_origin_limits.py +0 -0
  388. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_pool_diagnostics.py +0 -0
  389. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_response_body_limits.py +0 -0
  390. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_transport_state.py +0 -0
  391. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/__init__.py +0 -0
  392. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/conftest.py +0 -0
  393. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/constants.py +0 -0
  394. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/server.py +0 -0
  395. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/stream_readers.py +0 -0
  396. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_async_streaming.py +0 -0
  397. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_async_streaming_text_lines.py +0 -0
  398. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_streaming_text_decoding.py +0 -0
  399. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/text_decoding_sources.py +0 -0
  400. {foghttp-0.3.4/tests/client_timeouts → foghttp-0.3.5/tests/client_telemetry}/__init__.py +0 -0
  401. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/assertions.py +0 -0
  402. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/conftest.py +0 -0
  403. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/constants.py +0 -0
  404. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/models.py +0 -0
  405. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_async_stream_hooks.py +0 -0
  406. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_async_stream_telemetry.py +0 -0
  407. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_async_telemetry.py +0 -0
  408. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_concurrent_delivery.py +0 -0
  409. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_event_contract.py +0 -0
  410. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_sync_stream_telemetry.py +0 -0
  411. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_sync_telemetry.py +0 -0
  412. {foghttp-0.3.4/tests/client_tls → foghttp-0.3.5/tests/client_timeouts}/__init__.py +0 -0
  413. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/helpers.py +0 -0
  414. {foghttp-0.3.4/tests/fault_injection → foghttp-0.3.5/tests/client_tls}/__init__.py +0 -0
  415. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/assertions.py +0 -0
  416. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/certificates.py +0 -0
  417. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/conftest.py +0 -0
  418. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/constants.py +0 -0
  419. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/handshake_server.py +0 -0
  420. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/models.py +0 -0
  421. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/server.py +0 -0
  422. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_async_tls.py +0 -0
  423. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_async_tls_redirects.py +0 -0
  424. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_sync_tls.py +0 -0
  425. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_sync_tls_redirects.py +0 -0
  426. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_tls_config.py +0 -0
  427. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_transport/__init__.py +0 -0
  428. {foghttp-0.3.4/tests/network_errors → foghttp-0.3.5/tests/client_upload}/__init__.py +0 -0
  429. {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_warning_actions.py +0 -0
  430. {foghttp-0.3.4 → foghttp-0.3.5}/tests/conftest.py +0 -0
  431. {foghttp-0.3.4/tests/request_builder → foghttp-0.3.5/tests/fault_injection}/__init__.py +0 -0
  432. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/conftest.py +0 -0
  433. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/constants.py +0 -0
  434. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/models.py +0 -0
  435. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/protocol.py +0 -0
  436. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/responses.py +0 -0
  437. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/server.py +0 -0
  438. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/state.py +0 -0
  439. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/state_assertions.py +0 -0
  440. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_async_fault_injection.py +0 -0
  441. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_async_socket_shutdown.py +0 -0
  442. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_sync_fault_injection.py +0 -0
  443. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_sync_socket_shutdown.py +0 -0
  444. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/timeout_assertions.py +0 -0
  445. {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/transport_waiters.py +0 -0
  446. {foghttp-0.3.4 → foghttp-0.3.5}/tests/http_body_scenarios.py +0 -0
  447. {foghttp-0.3.4/tests/response_decompression → foghttp-0.3.5/tests/network_errors}/__init__.py +0 -0
  448. {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/conftest.py +0 -0
  449. {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/constants.py +0 -0
  450. {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/helpers.py +0 -0
  451. {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/test_async_network_errors.py +0 -0
  452. {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/test_sync_network_errors.py +0 -0
  453. {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/__init__.py +0 -0
  454. {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/conftest.py +0 -0
  455. {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/constants.py +0 -0
  456. {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/gil_progress.py +0 -0
  457. {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/test_async_future_boundary.py +0 -0
  458. {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/test_sync_gil_boundary.py +0 -0
  459. {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/thread_worker.py +0 -0
  460. {foghttp-0.3.4 → foghttp-0.3.5}/tests/redirect_helpers.py +0 -0
  461. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/encoding_property_helpers.py +0 -0
  462. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_base_url.py +0 -0
  463. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_default_headers.py +0 -0
  464. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_default_params.py +0 -0
  465. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_encoding_properties.py +0 -0
  466. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_header_policy.py +0 -0
  467. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_headers.py +0 -0
  468. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_merge_contract.py +0 -0
  469. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_no_mutation.py +0 -0
  470. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_parity.py +0 -0
  471. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_query_params.py +0 -0
  472. {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_factories.py +0 -0
  473. {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/conftest.py +0 -0
  474. {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/constants.py +0 -0
  475. {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/helpers.py +0 -0
  476. {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/payloads.py +0 -0
  477. {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/server.py +0 -0
  478. {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/test_async_response_decompression.py +0 -0
  479. {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/test_sync_response_decompression.py +0 -0
  480. {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/__init__.py +0 -0
  481. {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/http_routes.py +0 -0
  482. {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/raw_responses.py +0 -0
  483. {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/timeout_diagnostics.py +0 -0
  484. {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/transport_stats.py +0 -0
  485. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_async_client.py +0 -0
  486. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_async_redirects.py +0 -0
  487. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_async_response.py +0 -0
  488. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_client_options.py +0 -0
  489. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_headers.py +0 -0
  490. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_public_api.py +0 -0
  491. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_query_params.py +0 -0
  492. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_request_model.py +0 -0
  493. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_response_encoding.py +0 -0
  494. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_response_flags.py +0 -0
  495. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_runtime_workers.py +0 -0
  496. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_sync_client.py +0 -0
  497. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_sync_redirects.py +0 -0
  498. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_sync_response.py +0 -0
  499. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_transport_stats.py +0 -0
  500. {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_url.py +0 -0
@@ -94,7 +94,7 @@ jobs:
94
94
  run: uv run --extra dev --with "maturin>=1.7,<2" maturin develop
95
95
 
96
96
  - name: Run tests with coverage
97
- run: uv run --extra dev coverage run -m pytest
97
+ run: uv run --extra dev coverage run -m pytest -vv
98
98
 
99
99
  - name: Report coverage
100
100
  run: uv run --extra dev coverage report -m
@@ -28,7 +28,7 @@ repos:
28
28
  - id: add-trailing-comma
29
29
 
30
30
  - repo: https://github.com/crate-ci/typos
31
- rev: v1.46.1
31
+ rev: v1.47.2
32
32
  hooks:
33
33
  - id: typos
34
34
 
@@ -38,12 +38,12 @@ repos:
38
38
  - id: detect-secrets
39
39
 
40
40
  - repo: https://github.com/astral-sh/uv-pre-commit
41
- rev: 0.11.14
41
+ rev: 0.11.25
42
42
  hooks:
43
43
  - id: uv-lock
44
44
 
45
45
  - repo: https://github.com/astral-sh/ruff-pre-commit
46
- rev: v0.15.12
46
+ rev: v0.15.20
47
47
  hooks:
48
48
  - id: ruff-format
49
49
  - id: ruff-check
@@ -66,4 +66,4 @@ repos:
66
66
  - orjson>=3.11,<4
67
67
  - typing-extensions>=4.3.0,<5
68
68
  args: [--config-file=pyproject.toml, --install-types, --non-interactive]
69
- files: ^foghttp/.*\.pyi?$
69
+ files: ^(foghttp|tests/types)/.*\.pyi?$
@@ -110,7 +110,7 @@ dependencies = [
110
110
 
111
111
  [[package]]
112
112
  name = "foghttp"
113
- version = "0.3.4"
113
+ version = "0.3.5"
114
114
  dependencies = [
115
115
  "brotli",
116
116
  "bytes",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "foghttp"
3
- version = "0.3.4"
3
+ version = "0.3.5"
4
4
  edition = "2021"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: foghttp
3
- Version: 0.3.4
3
+ Version: 0.3.5
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Framework :: AsyncIO
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -15,6 +15,7 @@ Requires-Dist: mypy>=2.1,<3 ; extra == 'dev'
15
15
  Requires-Dist: pre-commit>=4,<5 ; extra == 'dev'
16
16
  Requires-Dist: pytest>=8 ; extra == 'dev'
17
17
  Requires-Dist: pytest-asyncio>=0.23 ; extra == 'dev'
18
+ Requires-Dist: pytest-timeout>=2,<3 ; extra == 'dev'
18
19
  Requires-Dist: ruff>=0.15,<0.16 ; extra == 'dev'
19
20
  Requires-Dist: trustme>=1.2 ; extra == 'dev'
20
21
  Provides-Extra: dev
@@ -69,8 +70,8 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
69
70
  diagnostic dump APIs
70
71
  - opt-in async lifecycle debug snapshots for staging and tests
71
72
  - advanced per-client Tokio runtime worker tuning
72
- - focused buffered HTTP surface for JSON and form APIs, internal services,
73
- workers, and benchmarks
73
+ - focused HTTP surface for JSON, form, streaming upload, and multipart API
74
+ workloads in internal services, workers, and benchmarks
74
75
 
75
76
  ## Install
76
77
 
@@ -124,8 +125,11 @@ async with foghttp.AsyncClient() as client:
124
125
  - `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE`
125
126
  - `base_url` for reusable API clients and relative request paths
126
127
  - default client headers and query params for reusable API clients
127
- - query params with repeated keys, JSON, form-urlencoded data, and buffered
128
- bytes/text bodies
128
+ - query params with repeated keys, JSON, form-urlencoded data, buffered
129
+ bytes/text bodies, binary file-like request bodies, and streaming
130
+ bytes-like upload providers
131
+ - multipart `files=` uploads with bytes-like parts, binary file-like objects,
132
+ direct byte streams, and replayable byte-stream factories
129
133
  - buffered `Response` with status flags, charset-aware `text`, `json()`,
130
134
  `raise_for_status()`, and request metadata
131
135
  - transparent `gzip`, `deflate`, and `br` decoding for buffered responses
@@ -164,6 +168,7 @@ async with foghttp.AsyncClient() as client:
164
168
  - [Request builder compatibility](https://github.com/AmberFog/foghttp/blob/main/docs/request-builder.md)
165
169
  - [Client lifecycle](https://github.com/AmberFog/foghttp/blob/main/docs/lifecycle.md)
166
170
  - [Timeout model](https://github.com/AmberFog/foghttp/blob/main/docs/timeouts.md)
171
+ - [Upload typing contracts](https://github.com/AmberFog/foghttp/blob/main/docs/upload-types.md)
167
172
  - [Telemetry contract](https://github.com/AmberFog/foghttp/blob/main/docs/telemetry.md)
168
173
  - [Response streaming](https://github.com/AmberFog/foghttp/blob/main/docs/streaming.md)
169
174
  - [Proxy and trust_env](https://github.com/AmberFog/foghttp/blob/main/docs/proxies.md)
@@ -177,18 +182,19 @@ async with foghttp.AsyncClient() as client:
177
182
  ## Current Limitations
178
183
 
179
184
  FogHTTP is currently focused on controlled HTTP workloads. Buffered responses
180
- are the broadest supported path; sync and async response streaming are available
181
- as bytes/text/line context-managed APIs. HTTP proxy routing and HTTPS proxy
182
- `CONNECT` tunnelling are available through `proxy=` and `trust_env=True` when
183
- the proxy endpoint itself uses `http://`.
184
- Streaming uploads, cookies, auth helpers, multipart uploads,
185
- HTTP/2, automatic `Accept-Encoding` negotiation, streaming decompression,
186
- strict connection-level pool limits,
187
- per-request connect timeout reconfiguration, and request-body write timeout
188
- semantics are planned for later versions. Response body read timeout is
189
- available for buffered and streaming response bodies. Socket lifecycle telemetry
190
- is available for the current HTTP/1 path. Disabling TLS verification is
191
- intentionally not supported.
185
+ are the broadest supported response path; sync and async response streaming are
186
+ available as bytes/text/line context-managed APIs. Streaming `content=` uploads
187
+ and multipart `files=` uploads are available with explicit replayability and
188
+ cleanup rules. HTTP proxy routing and HTTPS proxy `CONNECT` tunnelling are
189
+ available through `proxy=` and `trust_env=True` when the proxy endpoint itself
190
+ uses `http://`.
191
+ Cookies, auth helpers, HTTP/2, automatic `Accept-Encoding` negotiation,
192
+ streaming decompression, strict connection-level pool limits, and per-request
193
+ connect timeout reconfiguration are planned for later versions.
194
+ Response body read timeout is available for buffered and streaming response
195
+ bodies; request body write timeout is available for buffered and streaming
196
+ request bodies. Socket lifecycle telemetry is available for the current HTTP/1
197
+ path. Disabling TLS verification is intentionally not supported.
192
198
 
193
199
  ## Development
194
200
 
@@ -33,8 +33,8 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
33
33
  diagnostic dump APIs
34
34
  - opt-in async lifecycle debug snapshots for staging and tests
35
35
  - advanced per-client Tokio runtime worker tuning
36
- - focused buffered HTTP surface for JSON and form APIs, internal services,
37
- workers, and benchmarks
36
+ - focused HTTP surface for JSON, form, streaming upload, and multipart API
37
+ workloads in internal services, workers, and benchmarks
38
38
 
39
39
  ## Install
40
40
 
@@ -88,8 +88,11 @@ async with foghttp.AsyncClient() as client:
88
88
  - `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE`
89
89
  - `base_url` for reusable API clients and relative request paths
90
90
  - default client headers and query params for reusable API clients
91
- - query params with repeated keys, JSON, form-urlencoded data, and buffered
92
- bytes/text bodies
91
+ - query params with repeated keys, JSON, form-urlencoded data, buffered
92
+ bytes/text bodies, binary file-like request bodies, and streaming
93
+ bytes-like upload providers
94
+ - multipart `files=` uploads with bytes-like parts, binary file-like objects,
95
+ direct byte streams, and replayable byte-stream factories
93
96
  - buffered `Response` with status flags, charset-aware `text`, `json()`,
94
97
  `raise_for_status()`, and request metadata
95
98
  - transparent `gzip`, `deflate`, and `br` decoding for buffered responses
@@ -128,6 +131,7 @@ async with foghttp.AsyncClient() as client:
128
131
  - [Request builder compatibility](https://github.com/AmberFog/foghttp/blob/main/docs/request-builder.md)
129
132
  - [Client lifecycle](https://github.com/AmberFog/foghttp/blob/main/docs/lifecycle.md)
130
133
  - [Timeout model](https://github.com/AmberFog/foghttp/blob/main/docs/timeouts.md)
134
+ - [Upload typing contracts](https://github.com/AmberFog/foghttp/blob/main/docs/upload-types.md)
131
135
  - [Telemetry contract](https://github.com/AmberFog/foghttp/blob/main/docs/telemetry.md)
132
136
  - [Response streaming](https://github.com/AmberFog/foghttp/blob/main/docs/streaming.md)
133
137
  - [Proxy and trust_env](https://github.com/AmberFog/foghttp/blob/main/docs/proxies.md)
@@ -141,18 +145,19 @@ async with foghttp.AsyncClient() as client:
141
145
  ## Current Limitations
142
146
 
143
147
  FogHTTP is currently focused on controlled HTTP workloads. Buffered responses
144
- are the broadest supported path; sync and async response streaming are available
145
- as bytes/text/line context-managed APIs. HTTP proxy routing and HTTPS proxy
146
- `CONNECT` tunnelling are available through `proxy=` and `trust_env=True` when
147
- the proxy endpoint itself uses `http://`.
148
- Streaming uploads, cookies, auth helpers, multipart uploads,
149
- HTTP/2, automatic `Accept-Encoding` negotiation, streaming decompression,
150
- strict connection-level pool limits,
151
- per-request connect timeout reconfiguration, and request-body write timeout
152
- semantics are planned for later versions. Response body read timeout is
153
- available for buffered and streaming response bodies. Socket lifecycle telemetry
154
- is available for the current HTTP/1 path. Disabling TLS verification is
155
- intentionally not supported.
148
+ are the broadest supported response path; sync and async response streaming are
149
+ available as bytes/text/line context-managed APIs. Streaming `content=` uploads
150
+ and multipart `files=` uploads are available with explicit replayability and
151
+ cleanup rules. HTTP proxy routing and HTTPS proxy `CONNECT` tunnelling are
152
+ available through `proxy=` and `trust_env=True` when the proxy endpoint itself
153
+ uses `http://`.
154
+ Cookies, auth helpers, HTTP/2, automatic `Accept-Encoding` negotiation,
155
+ streaming decompression, strict connection-level pool limits, and per-request
156
+ connect timeout reconfiguration are planned for later versions.
157
+ Response body read timeout is available for buffered and streaming response
158
+ bodies; request body write timeout is available for buffered and streaming
159
+ request bodies. Socket lifecycle telemetry is available for the current HTTP/1
160
+ path. Disabling TLS verification is intentionally not supported.
156
161
 
157
162
  ## Development
158
163
 
@@ -0,0 +1,206 @@
1
+ # Benchmarks
2
+
3
+ Benchmark harness and full benchmark reports live in a separate repository:
4
+ [github.com/AmberFog/FogHttpBenchmark](https://github.com/AmberFog/FogHttpBenchmark).
5
+
6
+ This page is a benchmark status snapshot, not a marketing scoreboard. Invalid
7
+ rows, compatibility gaps, resource-limit errors, and weak spots stay visible
8
+ because they are the inputs we use to improve FogHTTP.
9
+
10
+ Last updated: `2026-06-08`.
11
+
12
+ ## Methodology
13
+
14
+ - Server: local asyncio HTTP/1.1 loopback server, plus local HTTPS/proxy
15
+ fixtures for the proxy suite.
16
+ - Python: `3.14.0` on the primary benchmark host.
17
+ - Shuffle seed: `20260507`.
18
+ - Higher `ok/s`, `ops/s`, `req/s`, successful `streams/s`, `MiB/s`, or
19
+ `lines/s` is better.
20
+ - Lower `p95 ms`, `p99 ms`, threads, fds, and error counts are better.
21
+ - Throughput and latency comparisons are only meaningful for rows with `0`
22
+ measured errors and `0` warmup errors.
23
+ - Resource/backpressure suites intentionally trigger `PoolTimeout`,
24
+ `ResponseBodyTooLargeError`, and `ResponseBodyBudgetExceededError`; those are
25
+ expected resource-control outcomes, not benchmark harness failures.
26
+ - Reports with `needs-rerun` or `invalid` validity are diagnostic evidence. They
27
+ must not be used as strong performance baselines until the reason is
28
+ classified or rerun.
29
+
30
+ ## Benchmark Hosts
31
+
32
+ Primary benchmark data source for this page:
33
+
34
+ - Result directories:
35
+ `results/full-current-deps-foghttp-0.3.4-20260607-121844`,
36
+ `results/full-branch-opt-pipeline-20260607-230009`, and
37
+ `results/proxy-connect-0.3.4-isolated-full-20260607-213445`.
38
+ - Platform: `macOS-26.5.1-arm64-arm-64bit-Mach-O`.
39
+ - Python: `3.14.0`.
40
+ - Server: local asyncio HTTP/1.1 loopback server; proxy suite additionally uses
41
+ local HTTPS origin and local HTTP proxy fixtures.
42
+ - Package versions: FogHTTP `0.3.4`, aiohttp `3.14.0`, httpx `0.28.1`,
43
+ httpxyz `0.31.2`, zapros `0.13.0`.
44
+
45
+ Secondary diagnostic host:
46
+
47
+ - Result directory: `results/dvorkin-opt_pipeline-20260607-230859`.
48
+ - Platform: `macOS-15.7.7-x86_64-i386-64bit-Mach-O`.
49
+ - Python: `3.13.7`.
50
+ - Package versions match the primary host for the clients listed above.
51
+
52
+ Absolute throughput, latency, memory, thread, and fd values are compared only
53
+ within the same host/result lineage. The secondary host is used as a relative
54
+ sanity check: it can confirm whether broad client ranking patterns repeat, but
55
+ it is not mixed into release delta charts or absolute performance conclusions.
56
+
57
+ ## Current Source Snapshots
58
+
59
+ | Role | Result directory | Status | Use |
60
+ | --- | --- | --- | --- |
61
+ | Latest release comparison | `results/full-current-deps-foghttp-0.3.4-20260607-121844` | legacy report, before the new validity gate metadata | Release-to-release signal versus `0.3.2`; useful, but dependency and harness changes mean attribution is not perfect. |
62
+ | Primary branch evidence | `results/full-branch-opt-pipeline-20260607-230009` | mixed: valid/warning/needs-rerun by suite | Primary host execution evidence for the current benchmark harness. FogHTTP rows are clean in the local problematic suites, but some all-client reports need policy/rerun work before becoming strong baselines. |
63
+ | Secondary host diagnostic run | `results/dvorkin-opt_pipeline-20260607-230859` | diagnostic; some suites `needs-rerun` | Relative cross-host sanity check only. External-only failures are not treated as FogHTTP runtime regressions until targeted reruns classify them. |
64
+ | Valid proxy/CONNECT baseline | `results/proxy-connect-0.3.4-isolated-full-20260607-213445` | valid | Strong functional proxy/CONNECT baseline: `126` aggregate rows, `378` runs, `21` isolated child processes, `0` measured/warmup errors. |
65
+
66
+ ## Release-Level Read
67
+
68
+ FogHTTP `0.3.4` does not show a broad functional regression in the local release
69
+ baseline: normal request, client, compression, one-upstream, request-builder,
70
+ and response-streaming FogHTTP rows have no unexpected errors. The clear
71
+ engineering picture is performance drift in a few areas, not broken runtime
72
+ semantics.
73
+
74
+ | Suite | FogHTTP primary delta vs `0.3.2` | p95 delta vs `0.3.2` | Competitive result | Current judgement |
75
+ | --- | ---: | ---: | --- | --- |
76
+ | `requests` | `-2.8%` | `+4.3%` | wins `64/72` | Mild aggregate drift, but the primary branch run shows recovery; keep as watch suite. |
77
+ | `requests-delay-pool` | `-1.6%` | `+1.5%` | wins `11/16` | Mostly stable under delayed/constrained request workloads. |
78
+ | `client-creation` | `-14.4%` | `+24.3%` | wins `3/12` | Main confirmed regression candidate; short-lived client lifecycle got more expensive. |
79
+ | `compressed-response` | `-7.7%` | `+9.1%` | wins `34/36` | Still strong and error-free for FogHTTP, but buffered decompression throughput drift needs validation. |
80
+ | `one-upstream` | `-6.9%` | `+9.4%` | wins `48/48` | Still one of the strongest FogHTTP paths, but local drift needs a controlled rerun. |
81
+ | `request-builder` | `-1.9%` | `+4.7%` | wins `20/20` | Stable overall; prepared send path should be watched. |
82
+ | `response-streaming` | `-1.2%` | `+2.5%` | wins `37/60` | Competitive position improved, but async early-close remains a focused weak spot. |
83
+
84
+ ```mermaid
85
+ xychart-beta
86
+ title "FogHTTP 0.3.4 primary delta vs 0.3.2"
87
+ x-axis [requests, delay_pool, client_creation, compressed, one_upstream, builder, streaming]
88
+ y-axis "primary delta %" -20 --> 5
89
+ bar [-2.8, -1.6, -14.4, -7.7, -6.9, -1.9, -1.2]
90
+ ```
91
+
92
+ ```mermaid
93
+ xychart-beta
94
+ title "FogHTTP success-only wins by suite"
95
+ x-axis [requests, delay_pool, client_creation, compressed, one_upstream, builder, streaming]
96
+ y-axis "win %" 0 --> 100
97
+ bar [89, 69, 25, 94, 100, 100, 62]
98
+ ```
99
+
100
+ ## Primary Branch Evidence
101
+
102
+ The primary host branch run,
103
+ `results/full-branch-opt-pipeline-20260607-230009`, completed all local suites
104
+ with `0` failed isolated child processes. That is good execution evidence for
105
+ the harness and for FogHTTP's basic runtime stability.
106
+
107
+ It is not yet a strong comparison baseline:
108
+
109
+ - `compressed-response` is `needs-rerun` because `aiohttp` and `zapros` fail
110
+ `multi-gzip-deflate-64k`; FogHTTP rows have `0` measured and warmup errors.
111
+ - `requests` is `needs-rerun` because competitor/case rows fail, including
112
+ `zapros` redirects and `aiohttp` pool-contention rows; FogHTTP rows have `0`
113
+ measured and warmup errors.
114
+ - `response-streaming` is `needs-rerun` because `aiohttp` rejects
115
+ `long-line-1m`; FogHTTP rows have `0` measured and warmup errors.
116
+ - `client-creation` and `one-upstream` are `warning`, mostly from high
117
+ variation rows.
118
+ - `request-builder`, `resource-backpressure`, and `proxy-connect` are valid.
119
+
120
+ This means the primary branch run is healthy enough to guide investigation, but the
121
+ benchmark project still needs expected-compatibility policy and baseline-split
122
+ work before these all-client reports should drive hard regression gates.
123
+
124
+ ## Secondary Host Evidence
125
+
126
+ The external `dvorkin` run is a relative sanity check. It is not used for
127
+ absolute performance numbers on this page. It shows two important diagnostic
128
+ signals:
129
+
130
+ - External `one-upstream` is `needs-rerun` from FogHTTP `direct-get`
131
+ `RequestError` rows, including a high-error row around `99.97%`. The same
132
+ failure does not reproduce in the local loopback run, so this is an
133
+ external-host reproducibility problem until targeted reruns prove otherwise.
134
+ - External `proxy-connect` is `needs-rerun` from `httpx` HTTPS/proxy failures.
135
+ FogHTTP proxy rows are clean in that run, so this is not evidence of a
136
+ FogHTTP proxy regression.
137
+
138
+ The correct next step is targeted external reruns and error-family preservation
139
+ in aggregate reports, not optimization work based on the invalid secondary-host
140
+ summary.
141
+
142
+ ## Proxy And CONNECT
143
+
144
+ The valid isolated proxy baseline,
145
+ `results/proxy-connect-0.3.4-isolated-full-20260607-213445`, is the most
146
+ important new `0.3.4` validation signal:
147
+
148
+ - `126` aggregate rows and `378` measured runs.
149
+ - `21` isolated child processes.
150
+ - `0` measured errors and `0` warmup errors.
151
+ - Coverage includes direct HTTP, explicit HTTP proxy, `trust_env` HTTP proxy,
152
+ direct HTTPS, explicit HTTPS CONNECT, `trust_env` HTTPS CONNECT, and cold
153
+ CONNECT setup.
154
+
155
+ Median successful request throughput by client in the local proxy suite:
156
+
157
+ | Client | Median `req/s` across proxy suite rows |
158
+ | --- | ---: |
159
+ | FogHTTP | `4471.7` |
160
+ | httpxyz | `1578.5` |
161
+ | httpx | `1209.6` |
162
+
163
+ This is not only a speed result. The more important release signal is that the
164
+ new proxy/CONNECT paths are functionally stable under isolated all-client
165
+ execution. The known limitation remains that separate proxy-endpoint telemetry
166
+ is not exposed yet; current connection and pool diagnostics are target-origin
167
+ keyed.
168
+
169
+ ## Strong Areas
170
+
171
+ - Buffered local request workloads remain competitive, especially sync request
172
+ paths and high-concurrency rows.
173
+ - Client defaults and one-upstream ergonomics remain cheap: the release baseline
174
+ wins `48/48` one-upstream groups.
175
+ - Request building is still a strength: the release baseline wins `20/20`
176
+ groups.
177
+ - Buffered gzip/deflate/br decompression is functionally strong and keeps
178
+ stacked-encoding compatibility where some competitors fail.
179
+ - Proxy and HTTPS CONNECT are now covered by a valid isolated suite with clean
180
+ FogHTTP rows.
181
+ - Resource/backpressure behavior is explicit: bounded response-body and pool
182
+ pressure errors are expected outcomes and are visible in the reports.
183
+
184
+ ## Weak Spots And Follow-Ups
185
+
186
+ | Area | Signal | What to do next |
187
+ | --- | --- | --- |
188
+ | Client lifecycle | `client-creation` release baseline shows `-14.4%` primary delta and `+24.3%` p95 delta vs `0.3.2`. | Validate under the current validity-gated harness, then profile client/runtime setup and close paths. |
189
+ | Buffered/API throughput | `compressed-response` and `one-upstream` remain strong competitively but show release-level drift. | Rerun with controlled dependencies and split strong baseline rows from compatibility rows. |
190
+ | Streaming early close | Overall streaming improved, but async `first-chunk-close-1m` regressed in the release comparison. | Investigate early close/abort cleanup path separately from full-consume streaming. |
191
+ | External reproducibility | External `one-upstream` FogHTTP `direct-get` errors do not reproduce locally. | Add targeted external rerun workflow before calling this a FogHTTP runtime issue. |
192
+ | Benchmark reporting | Some aggregate reports lose enough error-family detail to classify expected competitor failures cleanly. | Preserve aggregate error metadata, then add expected-compatibility policy and regression gates. |
193
+
194
+ ## Current Engineering Conclusion
195
+
196
+ FogHTTP `0.3.4` added the adoption-critical proxy and HTTPS CONNECT surface, and
197
+ that path is now covered by a valid isolated benchmark. The core
198
+ request/streaming/resource behavior remains functionally clean in local FogHTTP
199
+ rows.
200
+
201
+ The honest caveat is performance validation. The project should not optimize
202
+ against invalid all-client summaries or external-host anomalies. The benchmark
203
+ work should first harden validity metadata, expected compatibility policy,
204
+ strong-baseline splitting, and targeted external reruns. After that, the real
205
+ runtime optimization targets are client lifecycle cost, buffered/API drift, and
206
+ streaming early-close overhead.
@@ -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, 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, sync and async APIs, redirects, custom CA certificates, cancellation, and observable request limits with pool diagnostics."
8
8
 
9
9
  features:
10
10
  - title: "Rust transport"
@@ -14,14 +14,14 @@ features:
14
14
  details: "Use Client in scripts and workers, or AsyncClient for high-concurrency asyncio workloads."
15
15
 
16
16
  - title: "Focused MVP"
17
- details: "FogHTTP is intentionally small today: buffered responses with gzip/deflate/br decoding, sync and async bytes/text/line streaming, JSON, form-urlencoded data, base URL clients, default headers and params, redirects, prepared requests, async cancellation, global and per-origin request limits, and request metadata."
17
+ details: "FogHTTP is intentionally small today: buffered responses with gzip/deflate/br decoding, sync and async bytes/text/line streaming, JSON, form-urlencoded data, streaming and multipart uploads, base URL clients, default headers and params, redirects, prepared requests, async cancellation, global and per-origin request limits, and request metadata."
18
18
  ---
19
19
 
20
20
  # FogHTTP Documentation
21
21
 
22
22
  FogHTTP is currently an MVP. It is already useful for controlled HTTP workloads
23
- that use buffered request/response bodies, JSON and form APIs, explicit client
24
- lifecycle, and predictable redirect behavior.
23
+ that use buffered request/response bodies, JSON and form APIs, streaming or
24
+ multipart uploads, explicit client lifecycle, and predictable redirect behavior.
25
25
 
26
26
  ## Positioning
27
27
 
@@ -71,6 +71,7 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
71
71
  - [Request builder compatibility](./request-builder.md)
72
72
  - [Client lifecycle](./lifecycle.md)
73
73
  - [Timeout model](./timeouts.md)
74
+ - [Upload typing contracts](./upload-types.md)
74
75
  - [Telemetry contract](./telemetry.md)
75
76
  - [Response streaming](./streaming.md)
76
77
  - [TLS trust](./tls.md)
@@ -98,12 +99,15 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
98
99
  - `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE`
99
100
  - `base_url` for reusable API clients and relative request paths
100
101
  - default client headers and query params for reusable API clients
101
- - query params with repeated keys, JSON, form-urlencoded data, and buffered
102
- bytes/text bodies
102
+ - query params with repeated keys, JSON, form-urlencoded data, buffered
103
+ bytes/text bodies, file-like bodies, streaming bytes-like iterables, and
104
+ multipart `files=` uploads
103
105
  - transparent `gzip`, `deflate`, and `br` decoding for buffered responses
104
106
  - sync and async bytes/text/line response streaming with context-managed cleanup
105
107
  - response status flags for success, redirects, and client/server errors
106
108
  - prepared `Request` objects with `build_request()` and `send()`
109
+ - public upload typing contracts for streaming request bodies and multipart
110
+ `files=` providers
107
111
  - case-insensitive `Headers` with repeated value support
108
112
  - safe policy for transport-managed request headers
109
113
  - redacted repr/error surfaces for sensitive headers, URL credentials,
@@ -132,9 +136,9 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
132
136
 
133
137
  ## Not Yet
134
138
 
135
- FogHTTP does not yet implement streaming uploads, cookies, multipart uploads,
136
- HTTP/2, automatic `Accept-Encoding` negotiation, streaming decompression, or
137
- advanced authentication helpers. `trust_env` supports HTTP proxy routing, HTTPS
139
+ FogHTTP does not yet implement cookies, HTTP/2, automatic `Accept-Encoding`
140
+ negotiation, streaming decompression, or advanced authentication helpers.
141
+ `trust_env` supports HTTP proxy routing, HTTPS
138
142
  `CONNECT` tunnelling through `http://` proxy endpoints, and `SSL_CERT_FILE`.
139
143
  Disabling TLS verification is intentionally not supported. See
140
144
  [Limitations](./limitations.md) for details.
@@ -420,9 +420,10 @@ if diagnostics["pending_requests"]:
420
420
 
421
421
  ## Current Boundaries
422
422
 
423
- The lifecycle contract currently applies to buffered requests/responses and
424
- sync/async streamed response bodies. Streaming uploads, cookies, proxies, and
425
- advanced auth helpers are planned later and may extend the lifecycle model.
423
+ The lifecycle contract currently applies to buffered requests/responses,
424
+ sync/async streamed response bodies, and streaming request bodies passed through
425
+ `content=`. Cookies and advanced auth helpers are planned later and may extend
426
+ the lifecycle model.
426
427
 
427
428
  FogHTTP exposes socket lifecycle telemetry for the current HTTP/1 path, but
428
429
  resource limits still describe request backpressure rather than strict raw TCP
@@ -22,7 +22,10 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
22
22
  - query parameters from mappings, repeated pairs, and raw query strings
23
23
  - JSON bodies through `json=`
24
24
  - form-urlencoded bodies through mapping or repeated-pair `data=`
25
- - raw bytes/text bodies through `content=`
25
+ - multipart file uploads through `files=`, optionally combined with mapping or
26
+ repeated-pair `data=` form fields
27
+ - raw bytes/text, binary file-like, sync bytes-like iterable, and async bytes-like iterable
28
+ bodies through `content=`
26
29
  - buffered responses
27
30
  - transparent `gzip`, `deflate`, and `br` decoding for buffered responses
28
31
  - sync response streaming through `Client.stream()`
@@ -53,8 +56,8 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
53
56
  - explicit `close()`/`aclose()` lifecycle for Rust runtime and pool resources;
54
57
  sync `close()` waits for in-flight sync requests, while async `aclose()`
55
58
  cancels in-flight async requests; see [Client lifecycle](./lifecycle.md)
56
- - documented current timeout model for client-level `connect`, per-request
57
- `pool`/`read`/`total`, and reserved `write`; see
59
+ - documented current timeout model for client-level `connect` and per-request
60
+ `pool`/`read`/`write`/`total`; see
58
61
  [Timeout model](./timeouts.md)
59
62
  - advanced `runtime_workers` tuning for the per-client Tokio runtime
60
63
  - reusable HTTP method constants through `foghttp.methods`
@@ -65,9 +68,11 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
65
68
  | Feature | Current behavior |
66
69
  |---|---|
67
70
  | Streaming response decompression | Not available; buffered responses support transparent decoding |
68
- | Streaming uploads | Not available; request bodies are buffered |
69
- | Multipart uploads | Not available |
70
- | `files=` | Reserved in the body matrix; not available yet |
71
+ | Multipart uploads | Available through `files=` for bytes-like parts, binary file-like objects, direct byte streams, and byte-stream factories |
72
+ | `files=` | Available; can be combined with mapping or repeated-pair `data=` form fields, but not with raw `data=`, `content=`, or `json=` |
73
+ | Multipart header values | Field names, filenames, and part content types are currently limited to printable ASCII; non-ASCII filenames need a later compatibility design |
74
+ | Streaming uploads | Available through `content=` for binary file-like objects, sync bytes-like iterables, zero-arg byte-stream factories, and async bytes-like iterables/factories on `AsyncClient`; direct stream/file bodies are non-replayable for method-preserving redirects, while factories can replay by returning a fresh stream |
75
+ | Upload typing contracts | Public provider/factory and multipart aliases are available for streaming `content=` and multipart `files=` APIs |
71
76
  | Cookie jar | `cookies=True` is rejected |
72
77
  | Plain HTTP proxy routing | Available for `http://` targets through explicit `proxy=` or `trust_env=True` environment config |
73
78
  | HTTPS proxy `CONNECT` | Available for `https://` targets through explicit `proxy=` or `trust_env=True` when the proxy endpoint itself uses `http://`; TLS is validated against the target host |
@@ -79,10 +84,10 @@ try to keep public interfaces stable and avoid unnecessary breaking changes.
79
84
  | HTTP/2 | Not available |
80
85
  | automatic `Accept-Encoding` negotiation | Not implemented; send `Accept-Encoding` manually when you want compressed responses |
81
86
  | transport-managed request headers | Safe API rejects manual `Host`, `Content-Length`, `Transfer-Encoding`, `TE`, `Trailer`, `Connection`, `Upgrade`, `Keep-Alive`, `Proxy-Connection`, and `Proxy-Authorization` |
82
- | request body source conflicts | Only one body source can be passed today: `json=`, `data=`, or `content=` |
87
+ | request body source conflicts | Use one body source among `json=`, `data=`, `content=`, and `files=`; `files=` can include form fields from mapping or repeated-pair `data=` |
83
88
  | true active connection-level limits | `max_active_requests_per_origin` limits buffered request slots; socket lifecycle telemetry is observable, but FogHTTP does not yet expose separate physical connection limits |
84
89
  | per-request connect timeout changes | `Timeouts.connect` configures the Rust connector from client-level settings when transport state is created; per-request `timeout.connect` does not reconfigure the connector |
85
- | separate read/write timeout semantics | `Timeouts.read` is implemented as a buffered and streamed response body progress timeout; `Timeouts.write` is reserved for later streaming upload/body work |
90
+ | separate read/write timeout semantics | `Timeouts.read` is implemented as a buffered and streamed response body progress timeout; `Timeouts.write` is implemented for buffered request body write progress and streaming upload chunk/write progress |
86
91
  | socket lifecycle telemetry granularity | `TransportStats` and `dump_transport_state()["origins"]` expose opened, open-failed, closed, reused, aborted, active, and idle tracked connection counters for the current HTTP/1 path; these are connector/lifecycle diagnostics, not a stable public view into Hyper's private pool internals |
87
92
  | telemetry hook granularity | `TelemetryConfig` currently dispatches Python-level request/response lifecycle events; lower-level Rust pool acquire and connection lifecycle event delivery is planned before Prometheus/OpenTelemetry exporters |
88
93
  | diagnostic snapshot transactionality | `stats()`, `dump_transport_state()`, and `dump_pool_diagnostics()` include `schema_version` and a monotonic `snapshot_sequence`, but the `dump_*` APIs remain diagnostic snapshots rather than lock-protected SLA transactions; use `stats()` for alert-oriented low-cardinality metrics |
@@ -95,7 +100,8 @@ Use FogHTTP today when:
95
100
  - responses are small enough to buffer in memory or can be consumed through the
96
101
  bytes/text/line streaming API; line streaming has a bounded per-line buffer by
97
102
  default
98
- - requests are JSON-heavy or use small form-urlencoded bodies
103
+ - requests are JSON-heavy, use small form-urlencoded bodies, multipart file
104
+ uploads, or explicit streaming upload bodies
99
105
  - redirects are simple and do not require cookie jar or auth helper integration
100
106
  - sync and async clients with explicit lifecycle are enough
101
107
  - async request cancellation and sync/async stream cleanup behavior are useful
@@ -107,12 +113,9 @@ Use FogHTTP today when:
107
113
  Wait before using FogHTTP when:
108
114
 
109
115
  - you need transparent streaming decompression
110
- - you upload large files
111
116
  - you need SOCKS, PAC, WPAD, or platform proxy discovery
112
117
  - you rely on cookies across requests
113
- - you need multipart form-data or large uploads
114
- - you need per-request connect timeout reconfiguration or request-body write
115
- timeout semantics
118
+ - you need per-request connect timeout reconfiguration
116
119
  - you need automatic compression negotiation instead of manual
117
120
  `Accept-Encoding`
118
121
  - you need strict active per-host connection limits
@@ -122,9 +125,10 @@ Wait before using FogHTTP when:
122
125
 
123
126
  Network and protocol failures map to `RequestError`. Pool acquire timeout and
124
127
  queue-full conditions map to `PoolTimeout`. Response body progress timeout maps
125
- to `ReadTimeout` for buffered responses and streamed body chunks. The broader
128
+ to `ReadTimeout` for buffered responses and streamed body chunks. Buffered and
129
+ streamed request body write progress timeout maps to `WriteTimeout`. The broader
126
130
  buffered transport deadline maps to the base `TimeoutError` with phase-aware
127
- diagnostics; for streaming it covers acquire, redirects, and response headers
128
- before the stream is returned. Dedicated connect/write timeout exception
129
- mappings are reserved for later timeout work. See
131
+ diagnostics; for streaming responses it covers acquire, redirects, and response
132
+ headers before the stream is returned. Dedicated connect timeout exception mapping is
133
+ reserved for later timeout work. See
130
134
  [Timeout model](./timeouts.md) for the current behavior.
@@ -364,7 +364,8 @@ body content and does not add `content-type` automatically.
364
364
 
365
365
  ## Raw Content
366
366
 
367
- Use `content=` for already encoded bytes or text.
367
+ Use `content=` for already encoded bytes, text, binary file-like objects, or
368
+ bytes-like iterables.
368
369
 
369
370
  ::: code-group
370
371
 
@@ -396,15 +397,25 @@ FogHTTP currently accepts one body source per request:
396
397
  |---|---|
397
398
  | `json=` | Encodes with `orjson` and adds `content-type: application/json` when no explicit content type is set |
398
399
  | `data=` | Encodes mappings and repeated pairs as `application/x-www-form-urlencoded`; raw `bytes` and `str` are sent as buffered body content |
399
- | `content=` | Accepts buffered `bytes` or `str`; strings are encoded as UTF-8 and no semantic content type is added |
400
- | `files=` | Reserved for future multipart uploads |
400
+ | `content=` | Accepts buffered `bytes` or `str`, binary file-like objects, sync bytes-like iterables, zero-arg byte-stream factories, and async bytes-like iterables/factories on `AsyncClient`; strings are encoded as UTF-8 and no semantic content type is added |
401
+ | `files=` | Builds multipart uploads from bytes-like parts, binary file-like objects, byte streams, or byte-stream factories; can be combined with mapping or repeated-pair `data=` form fields |
401
402
 
402
- Passing more than one body source raises `ValueError`. `Content-Length` and
403
+ Passing incompatible body sources raises `ValueError`; `files=` may be combined
404
+ with form-field `data=` mappings or repeated pairs. `Content-Length` and
403
405
  `Transfer-Encoding` are transport-managed framing headers and are not accepted
404
406
  in request headers; the Rust transport owns them. Buffered `json=`, `data=`,
405
- and `content=` bodies are replayable for the current redirect policy. Iterator,
406
- async iterator, and streaming request bodies are not accepted yet and will need
407
- an explicit non-replayable body contract later.
407
+ byte/string `content=`, and bytes-like multipart file parts are replayable for
408
+ the current redirect policy. File-like and direct streaming `content=` or
409
+ `files=` bodies are non-replayable, so method-preserving redirects fail closed
410
+ instead of replaying a consumed provider. Factory-backed streaming bodies are
411
+ replayable because the factory returns a fresh stream per send attempt. Public
412
+ provider and multipart type aliases are documented in
413
+ [Upload typing contracts](./upload-types.md).
414
+
415
+ `get()` and `head()` are bodyless convenience helpers. Use `post()`, `put()`,
416
+ `patch()`, `delete()`, `request()`, or `stream()` for body parameters. If you
417
+ intentionally need a non-standard GET or HEAD body, use the explicit
418
+ `request("GET", ..., content=...)` / `request("HEAD", ..., content=...)` form.
408
419
 
409
420
  ## Buffered Response Decoding
410
421
 
@@ -686,8 +697,8 @@ with foghttp.Client(telemetry=foghttp.TelemetryConfig(sink=Sink())) as client:
686
697
  ```
687
698
 
688
699
  `Timeouts.connect` is client-level connector configuration. Per-request
689
- `timeout=` currently affects `pool`, `read`, and `total`, not `connect` or
690
- `write`. See [Timeout model](./timeouts.md) for the detailed current contract
700
+ `timeout=` currently affects `pool`, `read`, `write`, and `total`, not
701
+ `connect`. See [Timeout model](./timeouts.md) for the detailed current contract
691
702
  and limitations.
692
703
 
693
704
  ## Runtime Workers