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.
- {foghttp-0.3.4 → foghttp-0.3.5}/.github/workflows/ci.yml +1 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/.pre-commit-config.yaml +4 -4
- {foghttp-0.3.4 → foghttp-0.3.5}/Cargo.lock +1 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/Cargo.toml +1 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/PKG-INFO +23 -17
- {foghttp-0.3.4 → foghttp-0.3.5}/README.md +21 -16
- foghttp-0.3.5/docs/benchmarks.md +206 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/index.md +13 -9
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/lifecycle.md +4 -3
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/limitations.md +21 -17
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/quickstart.md +20 -9
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/request-builder.md +74 -17
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/streaming.md +4 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/timeouts.md +52 -35
- foghttp-0.3.5/docs/upload-types.md +92 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/use-cases.md +10 -7
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/README.md +6 -3
- foghttp-0.3.5/examples/multipart_uploads.py +51 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/__init__.py +2 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/core.py +5 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/errors.py +4 -10
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/requests.py +31 -10
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/timeout_errors.py +2 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/builder.py +5 -3
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/models.py +4 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/transport_requests.py +1 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_foghttp.pyi +25 -0
- foghttp-0.3.5/foghttp/_multipart/__init__.py +3 -0
- foghttp-0.3.5/foghttp/_multipart/constants.py +8 -0
- foghttp-0.3.5/foghttp/_multipart/content_type.py +92 -0
- foghttp-0.3.5/foghttp/_multipart/encoding.py +62 -0
- foghttp-0.3.5/foghttp/_multipart/fields.py +48 -0
- foghttp-0.3.5/foghttp/_multipart/file_parts.py +115 -0
- foghttp-0.3.5/foghttp/_multipart/iterators.py +49 -0
- foghttp-0.3.5/foghttp/_multipart/length.py +29 -0
- foghttp-0.3.5/foghttp/_multipart/models.py +43 -0
- foghttp-0.3.5/foghttp/_multipart/normalize.py +54 -0
- foghttp-0.3.5/foghttp/_multipart/parts.py +25 -0
- foghttp-0.3.5/foghttp/_multipart/stream.py +107 -0
- foghttp-0.3.5/foghttp/_multipart/values.py +45 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_redaction.py +34 -2
- foghttp-0.3.5/foghttp/_request_body.py +58 -0
- foghttp-0.3.5/foghttp/_upload_body/__init__.py +13 -0
- foghttp-0.3.5/foghttp/_upload_body/async_sending.py +38 -0
- foghttp-0.3.5/foghttp/_upload_body/chunks.py +11 -0
- foghttp-0.3.5/foghttp/_upload_body/feeders.py +106 -0
- foghttp-0.3.5/foghttp/_upload_body/file_source.py +80 -0
- foghttp-0.3.5/foghttp/_upload_body/models.py +39 -0
- foghttp-0.3.5/foghttp/_upload_body/normalize.py +39 -0
- foghttp-0.3.5/foghttp/_upload_body/predicates.py +17 -0
- foghttp-0.3.5/foghttp/_upload_body/runtime.py +205 -0
- foghttp-0.3.5/foghttp/_upload_body/thread_bridge.py +67 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/async_client.py +20 -19
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/body.py +25 -18
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/client.py +20 -19
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/__init__.py +2 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/timeout.py +5 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/messages.py +27 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/request.py +3 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/timeout_diagnostics.py +1 -0
- foghttp-0.3.5/foghttp/types/__init__.py +59 -0
- foghttp-0.3.5/foghttp/types/multipart.py +39 -0
- foghttp-0.3.5/foghttp/types/streams.py +29 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/pyproject.toml +5 -5
- foghttp-0.3.5/src/core/client/body.rs +345 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/mod.rs +34 -5
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/telemetry/mod.rs +96 -5
- foghttp-0.3.5/src/core/client/telemetry/tests.rs +317 -0
- foghttp-0.3.5/src/core/client/write_timeout.rs +179 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/request.rs +20 -5
- {foghttp-0.3.4 → foghttp-0.3.5}/src/errors.rs +5 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/messages.rs +1 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/body.rs +0 -8
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/mod.rs +46 -11
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/options.rs +2 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/timeout_diagnostics.rs +18 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/buffered.rs +8 -5
- foghttp-0.3.5/src/py/client/transport/client.rs +50 -0
- foghttp-0.3.5/src/py/client/transport/errors.rs +12 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/mod.rs +1 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/request.rs +91 -11
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/streaming.rs +8 -5
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/tests.rs +31 -4
- foghttp-0.3.5/src/py/client/upload_body.rs +203 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/mod.rs +2 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/server.py +38 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/test_async_keepalive.py +16 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/test_sync_keepalive.py +16 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_raw_client_lifecycle.py +2 -2
- foghttp-0.3.5/tests/client_multipart/assertions.py +50 -0
- foghttp-0.3.5/tests/client_multipart/models.py +9 -0
- foghttp-0.3.5/tests/client_multipart/sources.py +163 -0
- foghttp-0.3.5/tests/client_multipart/test_async_multipart.py +323 -0
- foghttp-0.3.5/tests/client_multipart/test_multipart_internals.py +346 -0
- foghttp-0.3.5/tests/client_multipart/test_request_builder.py +326 -0
- foghttp-0.3.5/tests/client_multipart/test_sync_multipart.py +326 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_options/test_raw_numeric_boundary.py +32 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_http_proxy_transport.py +66 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_https_proxy_connect.py +33 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_sync_streaming.py +2 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_sync_streaming_text_lines.py +5 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/conftest.py +44 -3
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/constants.py +12 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/test_async_timeouts.py +53 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/test_sync_timeouts.py +30 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_transport/models.py +30 -4
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_transport/test_transport_adapter.py +53 -4
- foghttp-0.3.5/tests/client_upload/helpers.py +110 -0
- foghttp-0.3.5/tests/client_upload/test_streaming_upload.py +588 -0
- foghttp-0.3.5/tests/client_upload/test_upload_helpers.py +174 -0
- foghttp-0.3.5/tests/request_builder/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_body.py +28 -3
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_shortcuts.py +106 -0
- foghttp-0.3.5/tests/response_decompression/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/async_http_server.py +26 -1
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/sync_http_server.py +24 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_raw_client.py +10 -4
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_raw_client_errors.py +40 -2
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_redaction.py +64 -0
- foghttp-0.3.5/tests/types/__init__.py +0 -0
- foghttp-0.3.5/tests/types/test_upload_contracts.py +138 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/uv.lock +15 -1
- foghttp-0.3.4/docs/benchmarks.md +0 -356
- foghttp-0.3.4/foghttp/_request_body.py +0 -30
- foghttp-0.3.4/foghttp/types/__init__.py +0 -24
- foghttp-0.3.4/src/core/client/telemetry/tests.rs +0 -70
- foghttp-0.3.4/src/py/client/transport/client.rs +0 -24
- {foghttp-0.3.4 → foghttp-0.3.5}/.flake8 +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/.github/workflows/release.yml +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/.gitignore +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/CODE_OF_CONDUCT.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/CONTRIBUTING.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/LICENSE +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/SECURITY.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/proxies.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/pyo3-boundary.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/redirects.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/telemetry.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/docs/tls.md +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_json_fanout.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_lifecycle_debug.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_resource_limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/async_streaming.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/compressed_response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/http_proxy.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/prepared_requests.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/redirects.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/request_builder_compatibility.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/sync_json_api.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/sync_streaming.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/examples/telemetry_hooks.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/asyncio_futures.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/config.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/lifecycle_debug.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/options.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/auth.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/environment.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/models.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/no_proxy.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/no_proxy_rule.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/no_proxy_tokens.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/resolver.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/transport_policy.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/proxy/url_parsing.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/raw/lifecycle.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/defaults.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/header_policy.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/request_builder/merge.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/runtime/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/runtime/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/runtime/workers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/stats.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/stream_context.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/clock.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/dispatcher.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/emission.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/request_context.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/request_events.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/responses.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/telemetry/url.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/tls.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_client/transport.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_response/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_response/encoding.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_response/status.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/async_chunks.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/iterators.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/lines.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_streaming/text/sync_chunks.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_telemetry.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_validation/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/_validation/numeric.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/base.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/lifecycle.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/errors/response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/headers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/lifecycle_debug.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/methods.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/models.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/pool_diagnostics.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/py.typed +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/request_info.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stats.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/client_error.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/redirect.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/server_error.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/status_codes/success.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/async_response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/base.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/bindings.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/lifecycle_debug.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/status.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/sync_response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/stream_response/telemetry.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/config.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/errors.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/events.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/telemetry/sinks.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/timeouts.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/tls.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/transport_state.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/transport_stats.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/types/http.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/types/request.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/foghttp/url.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/logo.png +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/ruff.toml +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/scripts/check_all_position.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/scripts/install_wheel_smoke.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/authorization.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/endpoint.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/http.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/client/proxy/tunnel.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/request.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/response.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/headers/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/method.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/atomic.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/buffered.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/counters.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/lifecycle.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/blocking.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/metrics.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/registry.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/snapshots.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/origin/waiters.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/snapshots.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/telemetry.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/metrics/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/numeric/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/numeric/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/body.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/budget.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/decompression.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/response/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/tls/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/tls/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/constants.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/origin.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/scheme.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/core/url/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/lib.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/diagnostics.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/gate.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/origin.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/pending.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/permit.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/telemetry.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/acquire/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/active.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/callback.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/registry.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/spawn.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/async_requests/stream_spawn.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/future.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/lifecycle/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/lifecycle/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/action.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/headers.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/method.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/policy.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/status.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/redirects/utils.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/constants.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/runtime/workers.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/callback.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/constants.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/mod.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/parts.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/read.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/registry.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/response.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/state.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/streams/state_tests.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/body.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/context.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/proxy.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/client/transport/response.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/pool_diagnostics.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/response.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/stats.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/transport_state.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/src/py/url.rs +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_actions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_assertions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_data.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/lifecycle_debug_predicates.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_cancellation.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_buffered.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_messages.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_streaming.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_lifecycle_debug_strict.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_async_telemetry.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_cancellation/test_asyncio_helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/assertions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_keepalive/models.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_async_client_lifecycle.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_sync_client_lifecycle.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_sync_close_race.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_lifecycle/test_sync_close_waits.py +0 -0
- {foghttp-0.3.4/tests/client_proxy → foghttp-0.3.5/tests/client_multipart}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_options/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_options/test_numeric_validation.py +0 -0
- {foghttp-0.3.4/tests/client_resources → foghttp-0.3.5/tests/client_proxy}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/client_options.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/connect_proxy_server.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/environment.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/http_proxy_server.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_client_config.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_environment.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_no_proxy.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_proxy/test_proxy_models.py +0 -0
- {foghttp-0.3.4/tests/client_telemetry → foghttp-0.3.5/tests/client_resources}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_global_limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_origin_limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_pool_diagnostics.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_response_body_limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_async_transport_state.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_diagnostic_snapshot_contract.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_global_limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_origin_limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_pool_diagnostics.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_response_body_limits.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_resources/test_sync_transport_state.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/server.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/stream_readers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_async_streaming.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_async_streaming_text_lines.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/test_streaming_text_decoding.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_streaming/text_decoding_sources.py +0 -0
- {foghttp-0.3.4/tests/client_timeouts → foghttp-0.3.5/tests/client_telemetry}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/assertions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/models.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_async_stream_hooks.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_async_stream_telemetry.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_async_telemetry.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_concurrent_delivery.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_event_contract.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_sync_stream_telemetry.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_telemetry/test_sync_telemetry.py +0 -0
- {foghttp-0.3.4/tests/client_tls → foghttp-0.3.5/tests/client_timeouts}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_timeouts/helpers.py +0 -0
- {foghttp-0.3.4/tests/fault_injection → foghttp-0.3.5/tests/client_tls}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/assertions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/certificates.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/handshake_server.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/models.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/server.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_async_tls.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_async_tls_redirects.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_sync_tls.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_sync_tls_redirects.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_tls/test_tls_config.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_transport/__init__.py +0 -0
- {foghttp-0.3.4/tests/network_errors → foghttp-0.3.5/tests/client_upload}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/client_warning_actions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/conftest.py +0 -0
- {foghttp-0.3.4/tests/request_builder → foghttp-0.3.5/tests/fault_injection}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/models.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/protocol.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/responses.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/server.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/state.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/state_assertions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_async_fault_injection.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_async_socket_shutdown.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_sync_fault_injection.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/test_sync_socket_shutdown.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/timeout_assertions.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/fault_injection/transport_waiters.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/http_body_scenarios.py +0 -0
- {foghttp-0.3.4/tests/response_decompression → foghttp-0.3.5/tests/network_errors}/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/test_async_network_errors.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/network_errors/test_sync_network_errors.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/gil_progress.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/test_async_future_boundary.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/test_sync_gil_boundary.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/pyo3_boundary/thread_worker.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/redirect_helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/encoding_property_helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_base_url.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_default_headers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_default_params.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_encoding_properties.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_header_policy.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_headers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_merge_contract.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_no_mutation.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_parity.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_builder/test_query_params.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/request_factories.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/conftest.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/constants.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/helpers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/payloads.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/server.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/test_async_response_decompression.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/response_decompression/test_sync_response_decompression.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/__init__.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/http_routes.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/raw_responses.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/timeout_diagnostics.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/support/transport_stats.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_async_client.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_async_redirects.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_async_response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_client_options.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_headers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_public_api.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_query_params.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_request_model.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_response_encoding.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_response_flags.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_runtime_workers.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_sync_client.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_sync_redirects.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_sync_response.py +0 -0
- {foghttp-0.3.4 → foghttp-0.3.5}/tests/test_transport_stats.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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?$
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: foghttp
|
|
3
|
-
Version: 0.3.
|
|
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
|
|
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,
|
|
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
|
|
181
|
-
as bytes/text/line context-managed APIs.
|
|
182
|
-
`
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
available for buffered and streaming response
|
|
190
|
-
|
|
191
|
-
|
|
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
|
|
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,
|
|
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
|
|
145
|
-
as bytes/text/line context-managed APIs.
|
|
146
|
-
`
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
available for buffered and streaming response
|
|
154
|
-
|
|
155
|
-
|
|
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,
|
|
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,
|
|
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
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
424
|
-
sync/async streamed response bodies
|
|
425
|
-
advanced auth helpers are planned later and may extend
|
|
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
|
-
-
|
|
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
|
|
57
|
-
`pool`/`read`/`total
|
|
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
|
-
|
|
|
69
|
-
|
|
|
70
|
-
|
|
|
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 |
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
128
|
-
before the stream is returned. Dedicated connect
|
|
129
|
-
|
|
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
|
|
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=` |
|
|
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
|
|
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
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
|
690
|
-
`
|
|
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
|