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