eggfetch 0.2.2__tar.gz → 0.3.0__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.
- {eggfetch-0.2.2 → eggfetch-0.3.0}/Cargo.lock +48 -43
- {eggfetch-0.2.2 → eggfetch-0.3.0}/PKG-INFO +3 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/Cargo.toml +12 -4
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/auth.rs +2 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/body.rs +8 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client/routes.rs +119 -113
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client.rs +46 -5
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/compression.rs +58 -16
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/cookie.rs +34 -5
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/error.rs +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/headers.rs +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/http_origin.rs +123 -4
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/http_version.rs +134 -10
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/lib.rs +5 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/multipart.rs +4 -1
- eggfetch-0.3.0/crates/eggfetch-core/src/pipeline/custom_dialing.rs +225 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/finalize.rs +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/h3_dispatch.rs +8 -3
- eggfetch-0.3.0/crates/eggfetch-core/src/pipeline/hop.rs +563 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/hyper_dispatch.rs +47 -13
- eggfetch-0.3.0/crates/eggfetch-core/src/pipeline/lean.rs +94 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/mod.rs +126 -54
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/prepare.rs +31 -56
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/proxy_dispatch.rs +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/redirect.rs +118 -265
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/retry.rs +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pool.rs +314 -112
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy.rs +9 -10
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/redirect.rs +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/request.rs +11 -28
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/response.rs +12 -9
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/retry.rs +12 -3
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/timeout.rs +16 -11
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/tls.rs +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/connect.rs +44 -22
- eggfetch-0.3.0/crates/eggfetch-core/src/transport/datagram.rs +923 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/direct.rs +103 -18
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/direct_connector.rs +6 -5
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/http3.rs +389 -47
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/hyper_client.rs +24 -47
- eggfetch-0.3.0/crates/eggfetch-core/src/transport/mod.rs +274 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/proxy.rs +49 -28
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/socks.rs +2 -4
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/uds.rs +19 -9
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport_hints.rs +43 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/adverse_tests.rs +4 -0
- eggfetch-0.3.0/crates/eggfetch-core/tests/consolidation_evidence_tests.rs +392 -0
- eggfetch-0.3.0/crates/eggfetch-core/tests/cookie_policy_parity_tests.rs +541 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/custom_dialer_tests.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/direct_transport_tests.rs +17 -1
- eggfetch-0.3.0/crates/eggfetch-core/tests/h3_datagram_route.rs +1078 -0
- eggfetch-0.3.0/crates/eggfetch-core/tests/hop_equivalence_support.rs +210 -0
- eggfetch-0.3.0/crates/eggfetch-core/tests/http_version_capability_tests.rs +150 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/integration.rs +4 -0
- eggfetch-0.3.0/crates/eggfetch-core/tests/lean_path_equivalence.rs +68 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/lean_policy_tests.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/lean_route_tests.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_http_body_tests.rs +43 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_tower_service_tests.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/network_stream_tests.rs +15 -5
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/pool_tests.rs +1 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/proxy_tests.rs +46 -21
- eggfetch-0.3.0/crates/eggfetch-core/tests/public_api_contracts.rs +179 -0
- eggfetch-0.3.0/crates/eggfetch-core/tests/redirect_path_equivalence.rs +65 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/redirect_strict_tests.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/request_failure_tests.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/resolved_route_cache_tests.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/resource_stabilization.rs +1 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/retry_integration.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/streaming_decompression_tests.rs +10 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/timeout_tests.rs +122 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/tls_integration.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/tls_response_completeness.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/total_body_deadline_tests.rs +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/trailer_tests.rs +1 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/transport_metrics_tests.rs +22 -8
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/Cargo.toml +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/Cargo.toml +2 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/async_client.rs +61 -13
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/auth.rs +8 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/client.rs +61 -13
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/errors.rs +8 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/lib.rs +37 -8
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/network_stream.rs +16 -4
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/proxy.rs +63 -3
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/request_preparation.rs +26 -12
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/response.rs +17 -39
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/retry.rs +2 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/async_iterators.rs +20 -4
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/sync_iterators.rs +20 -4
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming.rs +2 -3
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/native_fixtures.py +10 -1
- eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_cookie_policy_parity.py +478 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_01_tls_and_proxy_trust_safety.py +17 -5
- eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_environment_isolation.py +367 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_h2_differential.py +5 -1
- eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_httpx2_origin_reachability.py +274 -0
- eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_httpx_transport_bridge.py +84 -0
- eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_httpx_transport_sdk_construction.py +128 -0
- eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_redirect_policy_parity.py +519 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_resource_assertions.py +4 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_ssl_context_network_proof.py +1 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_url_query.py +11 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/native_api_manifest.json +2 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_sync.py +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/pyproject.toml +4 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/_native.pyi +2 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_client.py +10 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_transports.py +10 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_urls.py +67 -19
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/__init__.py +4 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/__init__.pyi +8 -2
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_api.py +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_client.py +30 -0
- eggfetch-0.3.0/python/eggfetch/compat/httpx2/_request.py +67 -0
- eggfetch-0.3.0/python/eggfetch/compat/httpx2/_response.py +90 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_urls.py +60 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_api.py +1 -1
- eggfetch-0.3.0/python/eggfetch/integrations/__init__.py +2 -0
- eggfetch-0.3.0/python/eggfetch/integrations/httpx.py +197 -0
- eggfetch-0.2.2/crates/eggfetch-core/src/pipeline/lean.rs +0 -121
- eggfetch-0.2.2/crates/eggfetch-core/src/transport/mod.rs +0 -129
- eggfetch-0.2.2/crates/eggfetch-core/tests/public_api_contracts.rs +0 -90
- eggfetch-0.2.2/python/eggfetch/compat/httpx2/_request.py +0 -7
- eggfetch-0.2.2/python/eggfetch/compat/httpx2/_response.py +0 -7
- {eggfetch-0.2.2 → eggfetch-0.3.0}/Cargo.toml +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/README.md +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/README.md +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/examples/quickstart.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client/config.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client/connectors.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/h2_headers.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/limits.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/network_stream.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/route.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy/environment.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy/identity.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy/no_proxy.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/redact.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/response_decode.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/service.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/stream/body_timeout.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/stream/mod.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/stream/write_timeout.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/trace.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/alt_svc.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/connect_timeout.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/dialer.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/lifecycle.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/metrics.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/standard_resolver.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/cross_feature_tests.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_alt_svc_discovery.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_hardening.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_integration.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_interop_qualification.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/http2_tests.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/http3_tests.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_json.rs +1 -1
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_transport_failure_classification.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/proxy_env_tests.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/response_body_public_shape.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/test_server.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/tls_fixtures.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/README.md +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/error.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/lib.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/request.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/response.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/target.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/tests/wire.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/README.md +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/conversion.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/cookies.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/extensions.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/headers.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/limits.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/multipart.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/decoding.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/state.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/sync_bridge.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/timeout.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/tls.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/trace_bridge.rs +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/__init__.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/conftest.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/fixtures.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_asgi.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_auth.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_auth_input_normalization.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_auth_replay.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_backends.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_behavior_cases.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_client.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_client_mutability_and_state.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_client_stream_overrides.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_config_objects.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_cookie_scope_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_cookies.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_01_tls_network_proof.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_02_extensions_and_wire_metadata.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_03_network_stream_upgrade.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_kernel.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_downstream_portfolio.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_downstream_runner_negative.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_environment.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_exceptions.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_extensions.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_headers.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_hook_auth_ordering.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_hook_cookie_auth_ordering.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_hooks.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_api_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_behavior.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_sse.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_websocket.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx_extras.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx_reference_pinning.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx_required.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_imports.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_lifecycle.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_lossy_conversions.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_merge_lossless.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_merge_matrix.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_mock_transport.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_mounts.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_multihop_cleanup.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_native_proxy_tls.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_native_timeout_classification.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_no_proxy_differential.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_oracle_negative.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_protocol_and_unsupported_options.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_proxy_differential.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_proxy_phase05_tracks.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_raw_stream_httpx_differential.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_raw_stream_lifecycle.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_redirect_state_machine_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request_construction_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request_stream_state.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request_streaming.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_encoding_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_metadata_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_status_and_redirect_state.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_stream_state_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_streaming.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_shutdown.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_soak.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_socks_transport.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_ssl_context_translation.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_stream_resources.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_timeout_integration.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_timeout_proxysis.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_timeout_reference_differential.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_top_level_helpers_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_trace_detection.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_transports.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_uds_transport.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_wsgi.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/conftest.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_async.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_auth.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_close_races.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_cookie_auth.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_cookies.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_differential.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_http2.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_interpreter_shutdown.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_native_api.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_parity.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_proxy.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_python_typing_surface.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_redirects.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_response_compat.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_retry.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_streaming.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/compat_consumer.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/consumer.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/negative_sync_async_body.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/negative_verify_and_return.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/__init__.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/__init__.pyi +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/_ssl_context.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/__init__.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/__init__.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/__init__.pyi +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_asgi.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_auth.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_cookies.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_diagnostics.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_exceptions.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_headers.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_limits.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_mock.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_proxy.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_request.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_response.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_ssl_context.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_status_codes.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_stream.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_timeout.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_wsgi.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_alias.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_asgi.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_auth.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_config.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_cookies.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_exceptions.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_headers.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_mock.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_sse.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_status_codes.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_stream.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_transports.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_wsgi.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/__init__.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_exceptions.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_ping.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_transport.py +0 -0
- {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/py.typed +0 -0
|
@@ -19,15 +19,15 @@ dependencies = [
|
|
|
19
19
|
|
|
20
20
|
[[package]]
|
|
21
21
|
name = "alloc-no-stdlib"
|
|
22
|
-
version = "
|
|
22
|
+
version = "3.0.0"
|
|
23
23
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
24
|
-
checksum = "
|
|
24
|
+
checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a"
|
|
25
25
|
|
|
26
26
|
[[package]]
|
|
27
27
|
name = "alloc-stdlib"
|
|
28
|
-
version = "0.
|
|
28
|
+
version = "0.3.0"
|
|
29
29
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
30
|
-
checksum = "
|
|
30
|
+
checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1"
|
|
31
31
|
dependencies = [
|
|
32
32
|
"alloc-no-stdlib",
|
|
33
33
|
]
|
|
@@ -96,9 +96,9 @@ checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
|
|
96
96
|
|
|
97
97
|
[[package]]
|
|
98
98
|
name = "async-compression"
|
|
99
|
-
version = "0.4.
|
|
99
|
+
version = "0.4.51"
|
|
100
100
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
101
|
-
checksum = "
|
|
101
|
+
checksum = "9d5755640120b24961f8231e05892e4a4f7e0d04e8aeca161508c9c397946970"
|
|
102
102
|
dependencies = [
|
|
103
103
|
"compression-codecs",
|
|
104
104
|
"compression-core",
|
|
@@ -159,9 +159,9 @@ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
|
|
|
159
159
|
|
|
160
160
|
[[package]]
|
|
161
161
|
name = "brotli"
|
|
162
|
-
version = "
|
|
162
|
+
version = "9.1.1"
|
|
163
163
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
164
|
-
checksum = "
|
|
164
|
+
checksum = "627b7cfb0578f0eafce087a90fcd40add1231900b69e4d4de2d456260a4f5d81"
|
|
165
165
|
dependencies = [
|
|
166
166
|
"alloc-no-stdlib",
|
|
167
167
|
"alloc-stdlib",
|
|
@@ -170,9 +170,9 @@ dependencies = [
|
|
|
170
170
|
|
|
171
171
|
[[package]]
|
|
172
172
|
name = "brotli-decompressor"
|
|
173
|
-
version = "
|
|
173
|
+
version = "6.2.0"
|
|
174
174
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
175
|
-
checksum = "
|
|
175
|
+
checksum = "34c6783f42c21c952ad7112b354f0ba2f10760e9decea5b1b60523d6e270faaf"
|
|
176
176
|
dependencies = [
|
|
177
177
|
"alloc-no-stdlib",
|
|
178
178
|
"alloc-stdlib",
|
|
@@ -316,9 +316,9 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
|
|
316
316
|
|
|
317
317
|
[[package]]
|
|
318
318
|
name = "compression-codecs"
|
|
319
|
-
version = "0.4.
|
|
319
|
+
version = "0.4.46"
|
|
320
320
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
321
|
-
checksum = "
|
|
321
|
+
checksum = "cae36683101b2899f48bd31f8db9839437356188e3b1ff23096e73dab09ba8fe"
|
|
322
322
|
dependencies = [
|
|
323
323
|
"brotli",
|
|
324
324
|
"compression-core",
|
|
@@ -330,9 +330,9 @@ dependencies = [
|
|
|
330
330
|
|
|
331
331
|
[[package]]
|
|
332
332
|
name = "compression-core"
|
|
333
|
-
version = "0.4.
|
|
333
|
+
version = "0.4.34"
|
|
334
334
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
335
|
-
checksum = "
|
|
335
|
+
checksum = "2ebdda89edc534bf8d5dd2857562633b6495557e5846552ade994b99ed13c36a"
|
|
336
336
|
|
|
337
337
|
[[package]]
|
|
338
338
|
name = "convert_case"
|
|
@@ -505,7 +505,7 @@ dependencies = [
|
|
|
505
505
|
|
|
506
506
|
[[package]]
|
|
507
507
|
name = "eggfetch-cli"
|
|
508
|
-
version = "0.
|
|
508
|
+
version = "0.3.0"
|
|
509
509
|
dependencies = [
|
|
510
510
|
"anyhow",
|
|
511
511
|
"bytes",
|
|
@@ -514,15 +514,20 @@ dependencies = [
|
|
|
514
514
|
"eggfetch-core",
|
|
515
515
|
"flate2",
|
|
516
516
|
"futures-util",
|
|
517
|
+
"h2",
|
|
517
518
|
"http",
|
|
519
|
+
"rcgen",
|
|
520
|
+
"rustls",
|
|
518
521
|
"serde_json",
|
|
519
522
|
"tempfile",
|
|
520
523
|
"tokio",
|
|
524
|
+
"tokio-rustls",
|
|
525
|
+
"tracing",
|
|
521
526
|
]
|
|
522
527
|
|
|
523
528
|
[[package]]
|
|
524
529
|
name = "eggfetch-core"
|
|
525
|
-
version = "0.
|
|
530
|
+
version = "0.3.0"
|
|
526
531
|
dependencies = [
|
|
527
532
|
"async-compression",
|
|
528
533
|
"base64 0.23.1",
|
|
@@ -568,7 +573,7 @@ dependencies = [
|
|
|
568
573
|
|
|
569
574
|
[[package]]
|
|
570
575
|
name = "eggfetch-ffi"
|
|
571
|
-
version = "0.
|
|
576
|
+
version = "0.3.0"
|
|
572
577
|
dependencies = [
|
|
573
578
|
"bytes",
|
|
574
579
|
"eggfetch-core",
|
|
@@ -580,7 +585,7 @@ dependencies = [
|
|
|
580
585
|
|
|
581
586
|
[[package]]
|
|
582
587
|
name = "eggfetch-http-connect"
|
|
583
|
-
version = "0.
|
|
588
|
+
version = "0.3.0"
|
|
584
589
|
dependencies = [
|
|
585
590
|
"base64 0.23.1",
|
|
586
591
|
"thiserror",
|
|
@@ -589,7 +594,7 @@ dependencies = [
|
|
|
589
594
|
|
|
590
595
|
[[package]]
|
|
591
596
|
name = "eggfetch-node"
|
|
592
|
-
version = "0.
|
|
597
|
+
version = "0.3.0"
|
|
593
598
|
dependencies = [
|
|
594
599
|
"eggfetch-ffi",
|
|
595
600
|
"napi",
|
|
@@ -601,7 +606,7 @@ dependencies = [
|
|
|
601
606
|
|
|
602
607
|
[[package]]
|
|
603
608
|
name = "eggfetch-python"
|
|
604
|
-
version = "0.
|
|
609
|
+
version = "0.3.0"
|
|
605
610
|
dependencies = [
|
|
606
611
|
"bytes",
|
|
607
612
|
"eggfetch-core",
|
|
@@ -642,7 +647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
|
642
647
|
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
|
643
648
|
dependencies = [
|
|
644
649
|
"libc",
|
|
645
|
-
"windows-sys 0.
|
|
650
|
+
"windows-sys 0.52.0",
|
|
646
651
|
]
|
|
647
652
|
|
|
648
653
|
[[package]]
|
|
@@ -1097,7 +1102,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
|
|
|
1097
1102
|
dependencies = [
|
|
1098
1103
|
"hermit-abi",
|
|
1099
1104
|
"libc",
|
|
1100
|
-
"windows-sys 0.
|
|
1105
|
+
"windows-sys 0.52.0",
|
|
1101
1106
|
]
|
|
1102
1107
|
|
|
1103
1108
|
[[package]]
|
|
@@ -1545,9 +1550,9 @@ dependencies = [
|
|
|
1545
1550
|
|
|
1546
1551
|
[[package]]
|
|
1547
1552
|
name = "quinn-proto"
|
|
1548
|
-
version = "0.11.
|
|
1553
|
+
version = "0.11.18"
|
|
1549
1554
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1550
|
-
checksum = "
|
|
1555
|
+
checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc"
|
|
1551
1556
|
dependencies = [
|
|
1552
1557
|
"bytes",
|
|
1553
1558
|
"getrandom 0.4.3",
|
|
@@ -1576,7 +1581,7 @@ dependencies = [
|
|
|
1576
1581
|
"once_cell",
|
|
1577
1582
|
"socket2",
|
|
1578
1583
|
"tracing",
|
|
1579
|
-
"windows-sys 0.
|
|
1584
|
+
"windows-sys 0.52.0",
|
|
1580
1585
|
]
|
|
1581
1586
|
|
|
1582
1587
|
[[package]]
|
|
@@ -1751,14 +1756,14 @@ dependencies = [
|
|
|
1751
1756
|
"errno",
|
|
1752
1757
|
"libc",
|
|
1753
1758
|
"linux-raw-sys",
|
|
1754
|
-
"windows-sys 0.
|
|
1759
|
+
"windows-sys 0.52.0",
|
|
1755
1760
|
]
|
|
1756
1761
|
|
|
1757
1762
|
[[package]]
|
|
1758
1763
|
name = "rustls"
|
|
1759
|
-
version = "0.23.
|
|
1764
|
+
version = "0.23.46"
|
|
1760
1765
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1761
|
-
checksum = "
|
|
1766
|
+
checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf"
|
|
1762
1767
|
dependencies = [
|
|
1763
1768
|
"log",
|
|
1764
1769
|
"once_cell",
|
|
@@ -1793,9 +1798,9 @@ dependencies = [
|
|
|
1793
1798
|
|
|
1794
1799
|
[[package]]
|
|
1795
1800
|
name = "rustls-webpki"
|
|
1796
|
-
version = "0.103.
|
|
1801
|
+
version = "0.103.16"
|
|
1797
1802
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1798
|
-
checksum = "
|
|
1803
|
+
checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281"
|
|
1799
1804
|
dependencies = [
|
|
1800
1805
|
"ring",
|
|
1801
1806
|
"rustls-pki-types",
|
|
@@ -2010,7 +2015,7 @@ dependencies = [
|
|
|
2010
2015
|
"getrandom 0.4.3",
|
|
2011
2016
|
"once_cell",
|
|
2012
2017
|
"rustix",
|
|
2013
|
-
"windows-sys 0.
|
|
2018
|
+
"windows-sys 0.52.0",
|
|
2014
2019
|
]
|
|
2015
2020
|
|
|
2016
2021
|
[[package]]
|
|
@@ -2110,9 +2115,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
|
|
2110
2115
|
|
|
2111
2116
|
[[package]]
|
|
2112
2117
|
name = "tokio"
|
|
2113
|
-
version = "1.
|
|
2118
|
+
version = "1.53.3"
|
|
2114
2119
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2115
|
-
checksum = "
|
|
2120
|
+
checksum = "ce3335fa71841cda333a58d7615b03901380ecf09d59b3296d21f8bbac0dde4e"
|
|
2116
2121
|
dependencies = [
|
|
2117
2122
|
"bytes",
|
|
2118
2123
|
"libc",
|
|
@@ -2360,14 +2365,14 @@ version = "0.26.11"
|
|
|
2360
2365
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2361
2366
|
checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
|
|
2362
2367
|
dependencies = [
|
|
2363
|
-
"webpki-roots 1.0.
|
|
2368
|
+
"webpki-roots 1.0.10",
|
|
2364
2369
|
]
|
|
2365
2370
|
|
|
2366
2371
|
[[package]]
|
|
2367
2372
|
name = "webpki-roots"
|
|
2368
|
-
version = "1.0.
|
|
2373
|
+
version = "1.0.10"
|
|
2369
2374
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2370
|
-
checksum = "
|
|
2375
|
+
checksum = "1c1c8e20c8a38fc7d65abfe74eb7280e4aa667e8eec8bc84996d2874810748d9"
|
|
2371
2376
|
dependencies = [
|
|
2372
2377
|
"rustls-pki-types",
|
|
2373
2378
|
]
|
|
@@ -2378,7 +2383,7 @@ version = "0.1.11"
|
|
|
2378
2383
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2379
2384
|
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
|
2380
2385
|
dependencies = [
|
|
2381
|
-
"windows-sys 0.
|
|
2386
|
+
"windows-sys 0.52.0",
|
|
2382
2387
|
]
|
|
2383
2388
|
|
|
2384
2389
|
[[package]]
|
|
@@ -2595,27 +2600,27 @@ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
|
|
2595
2600
|
|
|
2596
2601
|
[[package]]
|
|
2597
2602
|
name = "zstd"
|
|
2598
|
-
version = "0.
|
|
2603
|
+
version = "0.14.3"
|
|
2599
2604
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2600
|
-
checksum = "
|
|
2605
|
+
checksum = "db3ae9bf90af6e40197bef767eeefc46ad6397420fe873830bd85e5fbbfb3c70"
|
|
2601
2606
|
dependencies = [
|
|
2602
2607
|
"zstd-safe",
|
|
2603
2608
|
]
|
|
2604
2609
|
|
|
2605
2610
|
[[package]]
|
|
2606
2611
|
name = "zstd-safe"
|
|
2607
|
-
version = "
|
|
2612
|
+
version = "8.2.0"
|
|
2608
2613
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2609
|
-
checksum = "
|
|
2614
|
+
checksum = "ded520f16b29e1a9b771c722221b2b0a0398c2316d9bb3c42b458a5414d7434b"
|
|
2610
2615
|
dependencies = [
|
|
2611
2616
|
"zstd-sys",
|
|
2612
2617
|
]
|
|
2613
2618
|
|
|
2614
2619
|
[[package]]
|
|
2615
2620
|
name = "zstd-sys"
|
|
2616
|
-
version = "2.
|
|
2621
|
+
version = "2.1.2+zstd.1.5.7"
|
|
2617
2622
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2618
|
-
checksum = "
|
|
2623
|
+
checksum = "481ada9c543b2323cbb7bbdbb5249177fbf0188ed959ed2c15e4b22421c84ed3"
|
|
2619
2624
|
dependencies = [
|
|
2620
2625
|
"cc",
|
|
2621
2626
|
"pkg-config",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eggfetch
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Programming Language :: Python :: 3
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -11,8 +11,10 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.15
|
|
12
12
|
Classifier: Programming Language :: Rust
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Requires-Dist: httpx>=0.28,<0.29 ; extra == 'httpx-transport'
|
|
14
15
|
Requires-Dist: pytest>=8.4 ; extra == 'test'
|
|
15
16
|
Requires-Dist: pytest-asyncio>=1.0 ; extra == 'test'
|
|
17
|
+
Provides-Extra: httpx-transport
|
|
16
18
|
Provides-Extra: test
|
|
17
19
|
Summary: Python bindings for eggfetch
|
|
18
20
|
Keywords: http,client,httpx,async,rust
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "eggfetch-core"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.3.0"
|
|
4
4
|
edition.workspace = true
|
|
5
5
|
rust-version.workspace = true
|
|
6
6
|
license.workspace = true
|
|
@@ -82,7 +82,7 @@ test-util = ["tokio/test-util"]
|
|
|
82
82
|
|
|
83
83
|
[dependencies]
|
|
84
84
|
bytes = "1"
|
|
85
|
-
eggfetch-http-connect = { version = "0.
|
|
85
|
+
eggfetch-http-connect = { version = "0.3.0", path = "../eggfetch-http-connect", optional = true }
|
|
86
86
|
futures-core = "0.3"
|
|
87
87
|
futures-util = { version = "0.3", default-features = false, features = ["alloc"] }
|
|
88
88
|
http = "1"
|
|
@@ -109,8 +109,8 @@ cookie = { version = "0.18", default-features = false, features = ["percent-enco
|
|
|
109
109
|
async-compression = { version = "0.4", default-features = false, features = ["tokio"], optional = true }
|
|
110
110
|
tokio-util = { version = "0.7", features = ["io"], optional = true }
|
|
111
111
|
flate2 = { version = "1", optional = true }
|
|
112
|
-
brotli = { version = "
|
|
113
|
-
zstd = { version = "0.
|
|
112
|
+
brotli = { version = "9", optional = true, default-features = false, features = ["std"] }
|
|
113
|
+
zstd = { version = "0.14", optional = true }
|
|
114
114
|
tracing = { version = "0.1", optional = true }
|
|
115
115
|
getrandom = { version = "0.2", optional = true }
|
|
116
116
|
httpdate = { version = "1", optional = true }
|
|
@@ -131,3 +131,11 @@ proptest = "=1.5.0"
|
|
|
131
131
|
rcgen = "0.13"
|
|
132
132
|
tempfile = "3"
|
|
133
133
|
tokio = { version = "1", features = ["io-util", "net", "macros", "sync", "time", "rt-multi-thread"] }
|
|
134
|
+
|
|
135
|
+
# The quickstart example exercises redirect following and basic auth, which
|
|
136
|
+
# are compiled out of the lean profiles. Declaring the requirement keeps the
|
|
137
|
+
# example out of the lean-profile `--all-targets` compile instead of failing
|
|
138
|
+
# it, so the whole-suite lean gate can be green.
|
|
139
|
+
[[example]]
|
|
140
|
+
name = "quickstart"
|
|
141
|
+
required-features = ["redirects", "basic-auth"]
|
|
@@ -621,6 +621,7 @@ mod tests {
|
|
|
621
621
|
}
|
|
622
622
|
|
|
623
623
|
#[test]
|
|
624
|
+
#[cfg(feature = "high-level-url")]
|
|
624
625
|
fn request_builder_without_auth_sets_disabled_and_clears_auth() {
|
|
625
626
|
let client = crate::client::Client::builder().build();
|
|
626
627
|
let req = client
|
|
@@ -636,6 +637,7 @@ mod tests {
|
|
|
636
637
|
}
|
|
637
638
|
|
|
638
639
|
#[test]
|
|
640
|
+
#[cfg(feature = "high-level-url")]
|
|
639
641
|
fn request_builder_auth_clears_disabled() {
|
|
640
642
|
let client = crate::client::Client::builder().build();
|
|
641
643
|
let req = client
|
|
@@ -267,7 +267,10 @@ impl RequestBody {
|
|
|
267
267
|
/// piped through to the transport incrementally. Bytes and empty
|
|
268
268
|
/// bodies are wrapped as `Full` and `Empty` respectively. No eager
|
|
269
269
|
/// buffering is performed.
|
|
270
|
-
#[allow(
|
|
270
|
+
#[allow(
|
|
271
|
+
clippy::type_complexity,
|
|
272
|
+
reason = "the Hyper body type is fixed by the `http-body-util` API and cannot be named more simply without changing the transport contract"
|
|
273
|
+
)]
|
|
271
274
|
pub(crate) fn into_http_body(
|
|
272
275
|
self,
|
|
273
276
|
) -> http_body_util::combinators::UnsyncBoxBody<Bytes, Box<dyn std::error::Error + Send + Sync>>
|
|
@@ -877,7 +880,10 @@ impl ResponseBody {
|
|
|
877
880
|
|
|
878
881
|
/// Create a streaming response body with an attached pool permit.
|
|
879
882
|
/// The permit is released when the body is dropped.
|
|
880
|
-
#[allow(
|
|
883
|
+
#[allow(
|
|
884
|
+
dead_code,
|
|
885
|
+
reason = "the lease-carrying constructor is only called by the pool-lease test; production bodies attach their lease through `attach_lease`"
|
|
886
|
+
)]
|
|
881
887
|
pub(crate) fn streaming_with_lease(stream: BoxBytesStream, lease: PoolGuardArc) -> Self {
|
|
882
888
|
Self::Streaming {
|
|
883
889
|
stream,
|
|
@@ -78,7 +78,10 @@ impl ResolvedRouteKey {
|
|
|
78
78
|
/// `HttpOrigin::from_url` + `from_origin` so pool and route identity
|
|
79
79
|
/// share one canonical constructor.
|
|
80
80
|
#[cfg(all(feature = "high-level-url", any(test, feature = "test-util")))]
|
|
81
|
-
#[allow(
|
|
81
|
+
#[allow(
|
|
82
|
+
dead_code,
|
|
83
|
+
reason = "the high-level adapter is retained as the test-util entry point for the canonical origin form; the current tree has no caller for it, so the allow keeps the retained constructor warning-free"
|
|
84
|
+
)]
|
|
82
85
|
pub(crate) fn new(
|
|
83
86
|
origin_url: &url::Url,
|
|
84
87
|
target: &crate::transport_hints::ResolvedTarget,
|
|
@@ -97,6 +100,105 @@ impl ResolvedRouteKey {
|
|
|
97
100
|
}
|
|
98
101
|
}
|
|
99
102
|
|
|
103
|
+
/// How a direct Hyper client binds its logical destination.
|
|
104
|
+
///
|
|
105
|
+
/// The resolved-target route pins the physical addresses and may additionally
|
|
106
|
+
/// override the TLS identity; the SNI route leaves DNS and TCP to the URL
|
|
107
|
+
/// host and only overrides the TLS identity. Everything else — TLS
|
|
108
|
+
/// materialization, connect timeout, metrics, idle-pool policy, and lifecycle
|
|
109
|
+
/// policy — is identical for both.
|
|
110
|
+
#[cfg(feature = "advanced-routing")]
|
|
111
|
+
#[derive(Debug, Clone, Copy)]
|
|
112
|
+
enum DirectRouteBinding<'a> {
|
|
113
|
+
/// Bind a caller-supplied resolved address snapshot, with an optional SNI
|
|
114
|
+
/// override on top of it.
|
|
115
|
+
Resolved {
|
|
116
|
+
/// The pinned destination addresses.
|
|
117
|
+
target: &'a crate::transport_hints::ResolvedTarget,
|
|
118
|
+
/// The TLS identity override, when the route carries one.
|
|
119
|
+
sni_hostname: Option<&'a str>,
|
|
120
|
+
},
|
|
121
|
+
/// Bind a logical SNI hostname; DNS and TCP still resolve the URL host.
|
|
122
|
+
Sni {
|
|
123
|
+
/// The TLS identity override.
|
|
124
|
+
sni_hostname: &'a str,
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/// Build a direct Hyper client for one cached route, without touching the
|
|
129
|
+
/// route cache.
|
|
130
|
+
///
|
|
131
|
+
/// CPU/local configuration only (connector + TLS policy + Hyper builder);
|
|
132
|
+
/// performs no network I/O, so callers may hold the route-cache mutex while
|
|
133
|
+
/// building, matching the documented route-cache locking contract.
|
|
134
|
+
/// Construction failures return before insert and never poison the cache.
|
|
135
|
+
#[cfg(feature = "advanced-routing")]
|
|
136
|
+
fn build_direct_client(
|
|
137
|
+
config: &ClientConfig,
|
|
138
|
+
direct_connector_config: Option<&crate::transport::direct_connector::DirectConnectorConfig>,
|
|
139
|
+
transport_metrics: &Arc<crate::transport::metrics::TransportMetrics>,
|
|
140
|
+
pool: &Pool,
|
|
141
|
+
lifecycle: &Arc<LifecycleConfig>,
|
|
142
|
+
binding: DirectRouteBinding<'_>,
|
|
143
|
+
) -> Result<crate::transport::TimeoutDirectClient> {
|
|
144
|
+
let connect_timeout = config.timeout.as_ref().and_then(|t| t.connect);
|
|
145
|
+
let enabler =
|
|
146
|
+
crate::http_version::HttpVersionPolicyEnabler::from_policy(config.http_version_policy);
|
|
147
|
+
#[cfg(feature = "tls-rustls")]
|
|
148
|
+
let tls_connector = {
|
|
149
|
+
let tls_config = config.tls_config.clone().unwrap_or_default();
|
|
150
|
+
let rustls_config = tls_config
|
|
151
|
+
.build_rustls_config()
|
|
152
|
+
.map_err(|e| Error::Tls(format!("failed to build TLS config: {e}")))?;
|
|
153
|
+
let rustls_config = configure_tls_alpn(rustls_config, enabler);
|
|
154
|
+
Some(tokio_rustls::TlsConnector::from(Arc::new(rustls_config)))
|
|
155
|
+
};
|
|
156
|
+
#[cfg(not(feature = "tls-rustls"))]
|
|
157
|
+
let tls_connector = None;
|
|
158
|
+
|
|
159
|
+
let base_config = direct_connector_config.cloned().unwrap_or(
|
|
160
|
+
crate::transport::direct_connector::DirectConnectorConfig {
|
|
161
|
+
local_address: None,
|
|
162
|
+
socket_options: Vec::new(),
|
|
163
|
+
},
|
|
164
|
+
);
|
|
165
|
+
let mut connector = crate::transport::direct_connector::DirectConnector::with_metrics(
|
|
166
|
+
base_config,
|
|
167
|
+
tls_connector,
|
|
168
|
+
transport_metrics.clone(),
|
|
169
|
+
);
|
|
170
|
+
let sni_hostname = match binding {
|
|
171
|
+
DirectRouteBinding::Resolved {
|
|
172
|
+
target,
|
|
173
|
+
sni_hostname,
|
|
174
|
+
} => {
|
|
175
|
+
connector = connector.with_resolved_target(target);
|
|
176
|
+
sni_hostname
|
|
177
|
+
}
|
|
178
|
+
DirectRouteBinding::Sni { sni_hostname } => Some(sni_hostname),
|
|
179
|
+
};
|
|
180
|
+
if let Some(sni_hostname) = sni_hostname {
|
|
181
|
+
connector = connector.with_sni(sni_hostname.to_owned());
|
|
182
|
+
}
|
|
183
|
+
// Idle-connection lifetime comes from the pool configuration
|
|
184
|
+
// (`Limits::keepalive_expiry`), matching the standard, direct,
|
|
185
|
+
// and UDS paths. `Timeout.pool`/`total` are acquisition budgets
|
|
186
|
+
// and must not close idle connections early. The effective
|
|
187
|
+
// per-host idle cap is shared as well; see `Pool::max_idle_per_host`.
|
|
188
|
+
let policy = HyperClientPolicy::new(
|
|
189
|
+
config.retry_canceled_requests,
|
|
190
|
+
pool.idle_timeout(),
|
|
191
|
+
pool.max_idle_per_host(),
|
|
192
|
+
enabler,
|
|
193
|
+
);
|
|
194
|
+
Ok(build_hyper_client(
|
|
195
|
+
connector,
|
|
196
|
+
&policy,
|
|
197
|
+
connect_timeout,
|
|
198
|
+
lifecycle,
|
|
199
|
+
))
|
|
200
|
+
}
|
|
201
|
+
|
|
100
202
|
impl ClientInner {
|
|
101
203
|
/// Get or create a cached Hyper client for one direct resolved-target
|
|
102
204
|
/// route.
|
|
@@ -119,84 +221,21 @@ impl ClientInner {
|
|
|
119
221
|
if let Some(client) = clients.get(&key) {
|
|
120
222
|
return Ok(client.clone());
|
|
121
223
|
}
|
|
122
|
-
let client =
|
|
224
|
+
let client = build_direct_client(
|
|
123
225
|
&self.config,
|
|
124
226
|
self.direct_connector_config.as_ref(),
|
|
125
227
|
&self.transport_metrics,
|
|
126
228
|
&self.pool,
|
|
127
229
|
&self.lifecycle,
|
|
128
|
-
|
|
129
|
-
|
|
230
|
+
DirectRouteBinding::Resolved {
|
|
231
|
+
target,
|
|
232
|
+
sni_hostname,
|
|
233
|
+
},
|
|
130
234
|
)?;
|
|
131
235
|
clients.insert(key, client.clone());
|
|
132
236
|
Ok(client)
|
|
133
237
|
}
|
|
134
238
|
|
|
135
|
-
/// Build a configured resolved-route Hyper client without touching the
|
|
136
|
-
/// route cache.
|
|
137
|
-
///
|
|
138
|
-
/// CPU/local configuration only (connector + TLS policy + Hyper builder);
|
|
139
|
-
/// performs no network I/O, so callers may hold the route-cache mutex
|
|
140
|
-
/// while building, matching the documented route-cache locking contract.
|
|
141
|
-
/// Construction failures return before insert and never poison the cache.
|
|
142
|
-
#[cfg(feature = "advanced-routing")]
|
|
143
|
-
#[allow(clippy::too_many_arguments)]
|
|
144
|
-
fn build_resolved_client(
|
|
145
|
-
config: &ClientConfig,
|
|
146
|
-
direct_connector_config: Option<&crate::transport::direct_connector::DirectConnectorConfig>,
|
|
147
|
-
transport_metrics: &Arc<crate::transport::metrics::TransportMetrics>,
|
|
148
|
-
pool: &Pool,
|
|
149
|
-
lifecycle: &Arc<LifecycleConfig>,
|
|
150
|
-
target: &crate::transport_hints::ResolvedTarget,
|
|
151
|
-
sni_hostname: Option<&str>,
|
|
152
|
-
) -> Result<crate::transport::TimeoutDirectClient> {
|
|
153
|
-
let connect_timeout = config.timeout.as_ref().and_then(|t| t.connect);
|
|
154
|
-
#[cfg(feature = "tls-rustls")]
|
|
155
|
-
let tls_connector = {
|
|
156
|
-
let tls_config = config.tls_config.clone().unwrap_or_default();
|
|
157
|
-
let rustls_config = tls_config
|
|
158
|
-
.build_rustls_config()
|
|
159
|
-
.map_err(|e| Error::Tls(format!("failed to build TLS config: {e}")))?;
|
|
160
|
-
let rustls_config = configure_tls_alpn(
|
|
161
|
-
rustls_config,
|
|
162
|
-
crate::http_version::HttpVersionPolicyEnabler::from_policy(
|
|
163
|
-
config.http_version_policy,
|
|
164
|
-
),
|
|
165
|
-
);
|
|
166
|
-
Some(tokio_rustls::TlsConnector::from(Arc::new(rustls_config)))
|
|
167
|
-
};
|
|
168
|
-
#[cfg(not(feature = "tls-rustls"))]
|
|
169
|
-
let tls_connector = None;
|
|
170
|
-
|
|
171
|
-
let base_config = direct_connector_config.cloned().unwrap_or(
|
|
172
|
-
crate::transport::direct_connector::DirectConnectorConfig {
|
|
173
|
-
local_address: None,
|
|
174
|
-
socket_options: Vec::new(),
|
|
175
|
-
},
|
|
176
|
-
);
|
|
177
|
-
let mut connector = crate::transport::direct_connector::DirectConnector::with_metrics(
|
|
178
|
-
base_config,
|
|
179
|
-
tls_connector,
|
|
180
|
-
transport_metrics.clone(),
|
|
181
|
-
)
|
|
182
|
-
.with_resolved_target(target);
|
|
183
|
-
if let Some(sni_hostname) = sni_hostname {
|
|
184
|
-
connector = connector.with_sni(sni_hostname.to_owned());
|
|
185
|
-
}
|
|
186
|
-
let policy = HyperClientPolicy::cached_route(
|
|
187
|
-
config.retry_canceled_requests,
|
|
188
|
-
pool.idle_timeout(),
|
|
189
|
-
pool.max_idle_per_host(),
|
|
190
|
-
crate::http_version::HttpVersionPolicyEnabler::from_policy(config.http_version_policy),
|
|
191
|
-
);
|
|
192
|
-
Ok(build_hyper_client(
|
|
193
|
-
connector,
|
|
194
|
-
&policy,
|
|
195
|
-
connect_timeout,
|
|
196
|
-
lifecycle,
|
|
197
|
-
))
|
|
198
|
-
}
|
|
199
|
-
|
|
200
239
|
/// Get or create a cached hyper client with TLS SNI hostname override.
|
|
201
240
|
///
|
|
202
241
|
/// The returned client uses a [`DirectConnector`](crate::transport::direct_connector::DirectConnector)
|
|
@@ -213,47 +252,14 @@ impl ClientInner {
|
|
|
213
252
|
return Ok(client.clone());
|
|
214
253
|
}
|
|
215
254
|
|
|
216
|
-
let
|
|
217
|
-
|
|
218
|
-
self.
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
let rc = tls_config
|
|
225
|
-
.build_rustls_config()
|
|
226
|
-
.map_err(|e| Error::Tls(format!("failed to build TLS config: {e}")))?;
|
|
227
|
-
let rc = configure_tls_alpn(rc, enabler);
|
|
228
|
-
Some(tokio_rustls::TlsConnector::from(Arc::new(rc)))
|
|
229
|
-
};
|
|
230
|
-
#[cfg(not(feature = "tls-rustls"))]
|
|
231
|
-
let tls_connector = None;
|
|
232
|
-
|
|
233
|
-
let base_config = self.direct_connector_config.clone().unwrap_or(
|
|
234
|
-
crate::transport::direct_connector::DirectConnectorConfig {
|
|
235
|
-
local_address: None,
|
|
236
|
-
socket_options: Vec::new(),
|
|
237
|
-
},
|
|
238
|
-
);
|
|
239
|
-
let base_connector = crate::transport::direct_connector::DirectConnector::with_metrics(
|
|
240
|
-
base_config,
|
|
241
|
-
tls_connector,
|
|
242
|
-
self.transport_metrics.clone(),
|
|
243
|
-
);
|
|
244
|
-
let sni_connector = base_connector.with_sni(sni_hostname.to_owned());
|
|
245
|
-
// Idle-connection lifetime comes from the pool configuration
|
|
246
|
-
// (`Limits::keepalive_expiry`), matching the standard, direct,
|
|
247
|
-
// and UDS paths. `Timeout.pool`/`total` are acquisition budgets
|
|
248
|
-
// and must not close idle connections early. The effective
|
|
249
|
-
// per-host idle cap is shared as well; see `Pool::max_idle_per_host`.
|
|
250
|
-
let policy = HyperClientPolicy::cached_route(
|
|
251
|
-
self.config.retry_canceled_requests,
|
|
252
|
-
self.pool.idle_timeout(),
|
|
253
|
-
self.pool.max_idle_per_host(),
|
|
254
|
-
enabler,
|
|
255
|
-
);
|
|
256
|
-
let client = build_hyper_client(sni_connector, &policy, connect_timeout, &self.lifecycle);
|
|
255
|
+
let client = build_direct_client(
|
|
256
|
+
&self.config,
|
|
257
|
+
self.direct_connector_config.as_ref(),
|
|
258
|
+
&self.transport_metrics,
|
|
259
|
+
&self.pool,
|
|
260
|
+
&self.lifecycle,
|
|
261
|
+
DirectRouteBinding::Sni { sni_hostname },
|
|
262
|
+
)?;
|
|
257
263
|
clients.insert(sni_hostname.to_owned(), client.clone());
|
|
258
264
|
Ok(client)
|
|
259
265
|
}
|
|
@@ -291,7 +297,7 @@ impl ClientInner {
|
|
|
291
297
|
),
|
|
292
298
|
Some(sni_hostname),
|
|
293
299
|
)?;
|
|
294
|
-
let policy = HyperClientPolicy::
|
|
300
|
+
let policy = HyperClientPolicy::new(
|
|
295
301
|
self.config.retry_canceled_requests,
|
|
296
302
|
self.pool.idle_timeout(),
|
|
297
303
|
self.pool.max_idle_per_host(),
|
|
@@ -350,7 +356,7 @@ impl ClientInner {
|
|
|
350
356
|
// (timeout plus effective per-host cap) with every other persistent
|
|
351
357
|
// Hyper family. `HyperClientPolicy::apply` installs the pool timer
|
|
352
358
|
// the timeout requires.
|
|
353
|
-
let policy = HyperClientPolicy::
|
|
359
|
+
let policy = HyperClientPolicy::new(
|
|
354
360
|
self.config.retry_canceled_requests,
|
|
355
361
|
self.pool.idle_timeout(),
|
|
356
362
|
self.pool.max_idle_per_host(),
|
|
@@ -447,7 +453,7 @@ impl ClientInner {
|
|
|
447
453
|
self.config.http_version_policy,
|
|
448
454
|
self.transport_metrics.clone(),
|
|
449
455
|
);
|
|
450
|
-
let policy = HyperClientPolicy::
|
|
456
|
+
let policy = HyperClientPolicy::new(
|
|
451
457
|
self.config.retry_canceled_requests,
|
|
452
458
|
self.pool.idle_timeout(),
|
|
453
459
|
self.pool.max_idle_per_host(),
|