eggfetch 0.1.4__tar.gz → 0.1.8__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.1.4 → eggfetch-0.1.8}/Cargo.lock +58 -133
- {eggfetch-0.1.4 → eggfetch-0.1.8}/Cargo.toml +3 -3
- {eggfetch-0.1.4 → eggfetch-0.1.8}/PKG-INFO +29 -16
- {eggfetch-0.1.4/crates/eggfetch-core → eggfetch-0.1.8}/README.md +26 -15
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/Cargo.toml +51 -13
- {eggfetch-0.1.4/crates/eggfetch-python → eggfetch-0.1.8/crates/eggfetch-core}/README.md +26 -15
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/auth.rs +53 -12
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/body.rs +431 -35
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/client.rs +1258 -235
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/compression.rs +20 -7
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/cookie.rs +2 -12
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/error.rs +233 -2
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/headers.rs +2 -2
- eggfetch-0.1.8/crates/eggfetch-core/src/http_origin.rs +393 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/http_version.rs +8 -8
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/lib.rs +37 -9
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/limits.rs +8 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/multipart.rs +33 -11
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/network_stream.rs +12 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/finalize.rs +129 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/h3_dispatch.rs +350 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/hyper_dispatch.rs +283 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/lean.rs +121 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/mod.rs +798 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/prepare.rs +622 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/proxy_dispatch.rs +132 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/redirect.rs +830 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/retry.rs +527 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/pipeline/route.rs +169 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/pool.rs +543 -79
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/proxy.rs +754 -20
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/redact.rs +24 -3
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/redirect.rs +347 -4
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/request.rs +220 -116
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/response.rs +12 -2
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/response_decode.rs +5 -5
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/retry.rs +29 -1
- eggfetch-0.1.8/crates/eggfetch-core/src/service.rs +84 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/stream/body_timeout.rs +371 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/stream/mod.rs +13 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/timeout.rs +81 -6
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/tls.rs +421 -68
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/alt_svc.rs +119 -58
- eggfetch-0.1.8/crates/eggfetch-core/src/transport/connect.rs +1213 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/transport/dialer.rs +347 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/direct.rs +262 -37
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/direct_connector.rs +129 -12
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/http3.rs +108 -47
- eggfetch-0.1.8/crates/eggfetch-core/src/transport/hyper_client.rs +461 -0
- eggfetch-0.1.8/crates/eggfetch-core/src/transport/lifecycle.rs +893 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/metrics.rs +88 -4
- eggfetch-0.1.8/crates/eggfetch-core/src/transport/mod.rs +129 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/proxy.rs +453 -42
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/socks.rs +259 -32
- eggfetch-0.1.8/crates/eggfetch-core/src/transport/standard_resolver.rs +196 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/uds.rs +7 -1
- eggfetch-0.1.8/crates/eggfetch-core/src/transport_hints.rs +165 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/adverse_tests.rs +1 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/cross_feature_tests.rs +5 -1
- eggfetch-0.1.8/crates/eggfetch-core/tests/custom_dialer_tests.rs +677 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/lean_policy_tests.rs +229 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/lean_route_tests.rs +278 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/native_http_body_tests.rs +558 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/native_tower_service_tests.rs +279 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/pool_tests.rs +164 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/proxy_env_tests.rs +150 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/proxy_tests.rs +1111 -8
- eggfetch-0.1.8/crates/eggfetch-core/tests/redirect_strict_tests.rs +253 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/request_failure_tests.rs +104 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/resolved_route_cache_tests.rs +680 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/response_body_public_shape.rs +38 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/retry_integration.rs +359 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/test_server.rs +22 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/tls_fixtures.rs +23 -10
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/tls_integration.rs +37 -0
- eggfetch-0.1.8/crates/eggfetch-core/tests/total_body_deadline_tests.rs +856 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/transport_metrics_tests.rs +126 -0
- eggfetch-0.1.8/crates/eggfetch-http-connect/Cargo.toml +24 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8/crates/eggfetch-http-connect}/README.md +26 -15
- eggfetch-0.1.8/crates/eggfetch-http-connect/src/error.rs +86 -0
- eggfetch-0.1.8/crates/eggfetch-http-connect/src/lib.rs +66 -0
- eggfetch-0.1.8/crates/eggfetch-http-connect/src/request.rs +248 -0
- eggfetch-0.1.8/crates/eggfetch-http-connect/src/response.rs +245 -0
- eggfetch-0.1.8/crates/eggfetch-http-connect/src/target.rs +112 -0
- eggfetch-0.1.8/crates/eggfetch-http-connect/tests/wire.rs +394 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/Cargo.toml +4 -10
- eggfetch-0.1.8/crates/eggfetch-python/README.md +226 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/async_client.rs +90 -443
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/auth.rs +5 -4
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/client.rs +92 -448
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/conversion.rs +101 -68
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/cookies.rs +6 -6
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/errors.rs +8 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/extensions.rs +1 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/headers.rs +1 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/lib.rs +46 -195
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/limits.rs +1 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/multipart.rs +5 -5
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/network_stream.rs +7 -7
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/proxy.rs +66 -3
- eggfetch-0.1.8/crates/eggfetch-python/src/request_preparation.rs +487 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/response.rs +8 -8
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/retry.rs +1 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/streaming.rs +18 -18
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/timeout.rs +13 -7
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/tls.rs +6 -6
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/src/trace_bridge.rs +1 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/native_fixtures.py +26 -4
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_auth.py +2 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_corrective_kernel.py +18 -0
- eggfetch-0.1.8/crates/eggfetch-python/tests/native_api_manifest.json +343 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_async.py +137 -2
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_auth.py +2 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_http2.py +38 -0
- eggfetch-0.1.8/crates/eggfetch-python/tests/test_native_api.py +56 -0
- eggfetch-0.1.8/crates/eggfetch-python/tests/test_python_typing_surface.py +73 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_sync.py +11 -1
- eggfetch-0.1.8/crates/eggfetch-python/tests/typing/compat_consumer.py +15 -0
- eggfetch-0.1.8/crates/eggfetch-python/tests/typing/consumer.py +85 -0
- eggfetch-0.1.8/crates/eggfetch-python/tests/typing/negative_sync_async_body.py +14 -0
- eggfetch-0.1.8/crates/eggfetch-python/tests/typing/negative_verify_and_return.py +16 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/pyproject.toml +3 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/__init__.py +14 -0
- eggfetch-0.1.8/python/eggfetch/__init__.pyi +89 -0
- eggfetch-0.1.8/python/eggfetch/_native.pyi +341 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/__init__.py +1 -3
- eggfetch-0.1.8/python/eggfetch/compat/httpx/__init__.pyi +119 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_auth.py +1 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_client.py +31 -15
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_diagnostics.py +1 -1
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_proxy.py +10 -2
- eggfetch-0.1.8/python/eggfetch/compat/httpx/_ssl_context.py +17 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/__init__.py +1 -1
- eggfetch-0.1.8/python/eggfetch/compat/httpx2/__init__.pyi +100 -0
- eggfetch-0.1.8/python/eggfetch/py.typed +1 -0
- eggfetch-0.1.4/crates/eggfetch-core/src/config.rs +0 -15
- eggfetch-0.1.4/crates/eggfetch-core/src/pipeline.rs +0 -2476
- eggfetch-0.1.4/crates/eggfetch-core/src/stream/mod.rs +0 -7
- eggfetch-0.1.4/crates/eggfetch-core/src/stream/read_timeout.rs +0 -161
- eggfetch-0.1.4/crates/eggfetch-core/src/transport/connect.rs +0 -578
- eggfetch-0.1.4/crates/eggfetch-core/src/transport/mod.rs +0 -68
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/examples/quickstart.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/h2_headers.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/stream/write_timeout.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/trace.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/src/transport/connect_timeout.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/direct_transport_tests.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/h3_alt_svc_discovery.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/h3_hardening.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/h3_integration.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/h3_interop_qualification.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/http2_tests.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/http3_tests.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/integration.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/native_json.rs +2 -2
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/network_stream_tests.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/resource_stabilization.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/timeout_tests.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-core/tests/trailer_tests.rs +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/__init__.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/conftest.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/fixtures.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_asgi.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_auth_input_normalization.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_auth_replay.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_backends.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_behavior_cases.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_client.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_client_mutability_and_state.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_client_stream_overrides.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_config_objects.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_cookie_scope_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_cookies.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_corrective_01_tls_and_proxy_trust_safety.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_corrective_01_tls_network_proof.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_corrective_02_extensions_and_wire_metadata.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_corrective_03_network_stream_upgrade.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_downstream_portfolio.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_downstream_runner_negative.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_environment.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_exceptions.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_extensions.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_h2_differential.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_headers.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_hook_auth_ordering.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_hook_cookie_auth_ordering.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_hooks.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_httpx2_api_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_httpx2_behavior.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_httpx2_sse.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_httpx2_websocket.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_httpx_extras.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_httpx_reference_pinning.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_httpx_required.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_imports.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_lifecycle.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_lossy_conversions.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_merge_lossless.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_merge_matrix.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_mock_transport.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_mounts.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_multihop_cleanup.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_native_proxy_tls.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_native_timeout_classification.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_no_proxy_differential.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_oracle_negative.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_protocol_and_unsupported_options.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_proxy_differential.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_proxy_phase05_tracks.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_raw_stream_httpx_differential.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_raw_stream_lifecycle.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_redirect_state_machine_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_request.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_request_construction_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_request_stream_state.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_request_streaming.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_resource_assertions.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_response.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_response_encoding_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_response_metadata_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_response_status_and_redirect_state.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_response_stream_state_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_response_streaming.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_shutdown.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_soak.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_socks_transport.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_ssl_context_network_proof.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_ssl_context_translation.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_stream_resources.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_timeout_integration.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_timeout_proxysis.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_timeout_reference_differential.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_top_level_helpers_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_trace_detection.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_transports.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_uds_transport.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_url_query.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/compat/test_wsgi.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/conftest.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_close_races.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_cookie_auth.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_cookies.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_differential.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_interpreter_shutdown.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_parity.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_proxy.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_redirects.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_response_compat.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_retry.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/crates/eggfetch-python/tests/test_streaming.py +0 -0
- {eggfetch-0.1.4/python/eggfetch/compat/httpx → eggfetch-0.1.8/python/eggfetch}/_ssl_context.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/__init__.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_asgi.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_cookies.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_exceptions.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_headers.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_limits.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_mock.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_request.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_response.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_status_codes.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_stream.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_timeout.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_transports.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_urls.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx/_wsgi.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_alias.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_api.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_asgi.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_auth.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_client.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_config.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_cookies.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_exceptions.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_headers.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_mock.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_request.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_response.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_sse.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_status_codes.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_stream.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_transports.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_urls.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/_wsgi.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/websockets/__init__.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/websockets/_api.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/websockets/_exceptions.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/websockets/_ping.py +0 -0
- {eggfetch-0.1.4 → eggfetch-0.1.8}/python/eggfetch/compat/httpx2/websockets/_transport.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is automatically @generated by Cargo.
|
|
2
2
|
# It is not intended for manual editing.
|
|
3
|
-
version =
|
|
3
|
+
version = 4
|
|
4
4
|
|
|
5
5
|
[[package]]
|
|
6
6
|
name = "adler2"
|
|
@@ -120,9 +120,15 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
|
|
120
120
|
|
|
121
121
|
[[package]]
|
|
122
122
|
name = "base64"
|
|
123
|
-
version = "0.
|
|
123
|
+
version = "0.21.7"
|
|
124
124
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
125
|
-
checksum = "
|
|
125
|
+
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
|
|
126
|
+
|
|
127
|
+
[[package]]
|
|
128
|
+
name = "base64"
|
|
129
|
+
version = "0.23.1"
|
|
130
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
131
|
+
checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
|
|
126
132
|
|
|
127
133
|
[[package]]
|
|
128
134
|
name = "base64ct"
|
|
@@ -216,9 +222,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
|
|
216
222
|
|
|
217
223
|
[[package]]
|
|
218
224
|
name = "chacha20"
|
|
219
|
-
version = "0.10.
|
|
225
|
+
version = "0.10.2"
|
|
220
226
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
221
|
-
checksum = "
|
|
227
|
+
checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06"
|
|
222
228
|
dependencies = [
|
|
223
229
|
"cfg-if",
|
|
224
230
|
"cpufeatures",
|
|
@@ -461,20 +467,6 @@ dependencies = [
|
|
|
461
467
|
"syn",
|
|
462
468
|
]
|
|
463
469
|
|
|
464
|
-
[[package]]
|
|
465
|
-
name = "dashmap"
|
|
466
|
-
version = "6.2.1"
|
|
467
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
468
|
-
checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c"
|
|
469
|
-
dependencies = [
|
|
470
|
-
"cfg-if",
|
|
471
|
-
"crossbeam-utils",
|
|
472
|
-
"hashbrown 0.14.5",
|
|
473
|
-
"lock_api",
|
|
474
|
-
"once_cell",
|
|
475
|
-
"parking_lot_core",
|
|
476
|
-
]
|
|
477
|
-
|
|
478
470
|
[[package]]
|
|
479
471
|
name = "deranged"
|
|
480
472
|
version = "0.5.8"
|
|
@@ -509,7 +501,7 @@ dependencies = [
|
|
|
509
501
|
|
|
510
502
|
[[package]]
|
|
511
503
|
name = "eggfetch-cli"
|
|
512
|
-
version = "0.1.
|
|
504
|
+
version = "0.1.8"
|
|
513
505
|
dependencies = [
|
|
514
506
|
"anyhow",
|
|
515
507
|
"bytes",
|
|
@@ -526,14 +518,14 @@ dependencies = [
|
|
|
526
518
|
|
|
527
519
|
[[package]]
|
|
528
520
|
name = "eggfetch-core"
|
|
529
|
-
version = "0.1.
|
|
521
|
+
version = "0.1.8"
|
|
530
522
|
dependencies = [
|
|
531
523
|
"async-compression",
|
|
532
|
-
"base64",
|
|
524
|
+
"base64 0.23.1",
|
|
533
525
|
"brotli",
|
|
534
526
|
"bytes",
|
|
535
527
|
"cookie",
|
|
536
|
-
"
|
|
528
|
+
"eggfetch-http-connect",
|
|
537
529
|
"flate2",
|
|
538
530
|
"futures-core",
|
|
539
531
|
"futures-util",
|
|
@@ -572,7 +564,7 @@ dependencies = [
|
|
|
572
564
|
|
|
573
565
|
[[package]]
|
|
574
566
|
name = "eggfetch-ffi"
|
|
575
|
-
version = "0.1.
|
|
567
|
+
version = "0.1.8"
|
|
576
568
|
dependencies = [
|
|
577
569
|
"bytes",
|
|
578
570
|
"eggfetch-core",
|
|
@@ -582,9 +574,18 @@ dependencies = [
|
|
|
582
574
|
"url",
|
|
583
575
|
]
|
|
584
576
|
|
|
577
|
+
[[package]]
|
|
578
|
+
name = "eggfetch-http-connect"
|
|
579
|
+
version = "0.1.8"
|
|
580
|
+
dependencies = [
|
|
581
|
+
"base64 0.23.1",
|
|
582
|
+
"thiserror",
|
|
583
|
+
"tokio",
|
|
584
|
+
]
|
|
585
|
+
|
|
585
586
|
[[package]]
|
|
586
587
|
name = "eggfetch-node"
|
|
587
|
-
version = "0.1.
|
|
588
|
+
version = "0.1.8"
|
|
588
589
|
dependencies = [
|
|
589
590
|
"eggfetch-ffi",
|
|
590
591
|
"napi",
|
|
@@ -596,7 +597,7 @@ dependencies = [
|
|
|
596
597
|
|
|
597
598
|
[[package]]
|
|
598
599
|
name = "eggfetch-python"
|
|
599
|
-
version = "0.1.
|
|
600
|
+
version = "0.1.8"
|
|
600
601
|
dependencies = [
|
|
601
602
|
"bytes",
|
|
602
603
|
"eggfetch-core",
|
|
@@ -605,12 +606,8 @@ dependencies = [
|
|
|
605
606
|
"http",
|
|
606
607
|
"pyo3",
|
|
607
608
|
"pyo3-async-runtimes",
|
|
608
|
-
"pyo3-build-config",
|
|
609
|
-
"rustls",
|
|
610
609
|
"tokio",
|
|
611
|
-
"tokio-rustls",
|
|
612
610
|
"url",
|
|
613
|
-
"webpki-roots 0.26.11",
|
|
614
611
|
]
|
|
615
612
|
|
|
616
613
|
[[package]]
|
|
@@ -641,7 +638,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
|
641
638
|
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
|
642
639
|
dependencies = [
|
|
643
640
|
"libc",
|
|
644
|
-
"windows-sys 0.
|
|
641
|
+
"windows-sys 0.61.2",
|
|
645
642
|
]
|
|
646
643
|
|
|
647
644
|
[[package]]
|
|
@@ -854,12 +851,6 @@ dependencies = [
|
|
|
854
851
|
"zerocopy",
|
|
855
852
|
]
|
|
856
853
|
|
|
857
|
-
[[package]]
|
|
858
|
-
name = "hashbrown"
|
|
859
|
-
version = "0.14.5"
|
|
860
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
861
|
-
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
|
862
|
-
|
|
863
854
|
[[package]]
|
|
864
855
|
name = "hashbrown"
|
|
865
856
|
version = "0.17.1"
|
|
@@ -1090,16 +1081,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
|
1090
1081
|
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
|
1091
1082
|
dependencies = [
|
|
1092
1083
|
"equivalent",
|
|
1093
|
-
"hashbrown
|
|
1094
|
-
]
|
|
1095
|
-
|
|
1096
|
-
[[package]]
|
|
1097
|
-
name = "indoc"
|
|
1098
|
-
version = "2.0.7"
|
|
1099
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1100
|
-
checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
|
|
1101
|
-
dependencies = [
|
|
1102
|
-
"rustversion",
|
|
1084
|
+
"hashbrown",
|
|
1103
1085
|
]
|
|
1104
1086
|
|
|
1105
1087
|
[[package]]
|
|
@@ -1110,7 +1092,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
|
|
|
1110
1092
|
dependencies = [
|
|
1111
1093
|
"hermit-abi",
|
|
1112
1094
|
"libc",
|
|
1113
|
-
"windows-sys 0.
|
|
1095
|
+
"windows-sys 0.61.2",
|
|
1114
1096
|
]
|
|
1115
1097
|
|
|
1116
1098
|
[[package]]
|
|
@@ -1195,15 +1177,6 @@ version = "0.8.2"
|
|
|
1195
1177
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1196
1178
|
checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
|
|
1197
1179
|
|
|
1198
|
-
[[package]]
|
|
1199
|
-
name = "lock_api"
|
|
1200
|
-
version = "0.4.14"
|
|
1201
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1202
|
-
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
|
|
1203
|
-
dependencies = [
|
|
1204
|
-
"scopeguard",
|
|
1205
|
-
]
|
|
1206
|
-
|
|
1207
1180
|
[[package]]
|
|
1208
1181
|
name = "log"
|
|
1209
1182
|
version = "0.4.33"
|
|
@@ -1222,15 +1195,6 @@ version = "2.8.3"
|
|
|
1222
1195
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1223
1196
|
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
|
1224
1197
|
|
|
1225
|
-
[[package]]
|
|
1226
|
-
name = "memoffset"
|
|
1227
|
-
version = "0.9.1"
|
|
1228
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1229
|
-
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
|
1230
|
-
dependencies = [
|
|
1231
|
-
"autocfg",
|
|
1232
|
-
]
|
|
1233
|
-
|
|
1234
1198
|
[[package]]
|
|
1235
1199
|
name = "miniz_oxide"
|
|
1236
1200
|
version = "0.8.9"
|
|
@@ -1352,27 +1316,14 @@ version = "0.2.1"
|
|
|
1352
1316
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1353
1317
|
checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
|
|
1354
1318
|
|
|
1355
|
-
[[package]]
|
|
1356
|
-
name = "parking_lot_core"
|
|
1357
|
-
version = "0.9.12"
|
|
1358
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1359
|
-
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
|
|
1360
|
-
dependencies = [
|
|
1361
|
-
"cfg-if",
|
|
1362
|
-
"libc",
|
|
1363
|
-
"redox_syscall",
|
|
1364
|
-
"smallvec",
|
|
1365
|
-
"windows-link",
|
|
1366
|
-
]
|
|
1367
|
-
|
|
1368
1319
|
[[package]]
|
|
1369
1320
|
name = "pem"
|
|
1370
|
-
version = "3.0.
|
|
1321
|
+
version = "3.0.3"
|
|
1371
1322
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1372
|
-
checksum = "
|
|
1323
|
+
checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310"
|
|
1373
1324
|
dependencies = [
|
|
1374
|
-
"base64",
|
|
1375
|
-
"
|
|
1325
|
+
"base64 0.21.7",
|
|
1326
|
+
"serde",
|
|
1376
1327
|
]
|
|
1377
1328
|
|
|
1378
1329
|
[[package]]
|
|
@@ -1491,29 +1442,26 @@ dependencies = [
|
|
|
1491
1442
|
|
|
1492
1443
|
[[package]]
|
|
1493
1444
|
name = "pyo3"
|
|
1494
|
-
version = "0.
|
|
1445
|
+
version = "0.29.2"
|
|
1495
1446
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1496
|
-
checksum = "
|
|
1447
|
+
checksum = "4688ddedf473e32662b9b067670129a8afb8c18e351482c70d62ba4a88171e8b"
|
|
1497
1448
|
dependencies = [
|
|
1498
|
-
"cfg-if",
|
|
1499
|
-
"indoc",
|
|
1500
1449
|
"libc",
|
|
1501
|
-
"memoffset",
|
|
1502
1450
|
"once_cell",
|
|
1503
1451
|
"portable-atomic",
|
|
1504
1452
|
"pyo3-build-config",
|
|
1505
1453
|
"pyo3-ffi",
|
|
1506
1454
|
"pyo3-macros",
|
|
1507
|
-
"unindent",
|
|
1508
1455
|
]
|
|
1509
1456
|
|
|
1510
1457
|
[[package]]
|
|
1511
1458
|
name = "pyo3-async-runtimes"
|
|
1512
|
-
version = "0.
|
|
1459
|
+
version = "0.29.0"
|
|
1513
1460
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1514
|
-
checksum = "
|
|
1461
|
+
checksum = "b3ef68daa7316a3fac65e5e18b2203f010346de1c1c53456811a2624673ab046"
|
|
1515
1462
|
dependencies = [
|
|
1516
|
-
"futures",
|
|
1463
|
+
"futures-channel",
|
|
1464
|
+
"futures-util",
|
|
1517
1465
|
"once_cell",
|
|
1518
1466
|
"pin-project-lite",
|
|
1519
1467
|
"pyo3",
|
|
@@ -1522,19 +1470,18 @@ dependencies = [
|
|
|
1522
1470
|
|
|
1523
1471
|
[[package]]
|
|
1524
1472
|
name = "pyo3-build-config"
|
|
1525
|
-
version = "0.
|
|
1473
|
+
version = "0.29.2"
|
|
1526
1474
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1527
|
-
checksum = "
|
|
1475
|
+
checksum = "f41027e41b4bd03f6e60f9f417fe24a6341a6bb744edd62b6f709f2a52ea30e9"
|
|
1528
1476
|
dependencies = [
|
|
1529
|
-
"once_cell",
|
|
1530
1477
|
"target-lexicon",
|
|
1531
1478
|
]
|
|
1532
1479
|
|
|
1533
1480
|
[[package]]
|
|
1534
1481
|
name = "pyo3-ffi"
|
|
1535
|
-
version = "0.
|
|
1482
|
+
version = "0.29.2"
|
|
1536
1483
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1537
|
-
checksum = "
|
|
1484
|
+
checksum = "e591a95526fead067432c3b3a33fc74770b87b1e04e73671090d9c2055a2b327"
|
|
1538
1485
|
dependencies = [
|
|
1539
1486
|
"libc",
|
|
1540
1487
|
"pyo3-build-config",
|
|
@@ -1542,9 +1489,9 @@ dependencies = [
|
|
|
1542
1489
|
|
|
1543
1490
|
[[package]]
|
|
1544
1491
|
name = "pyo3-macros"
|
|
1545
|
-
version = "0.
|
|
1492
|
+
version = "0.29.2"
|
|
1546
1493
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1547
|
-
checksum = "
|
|
1494
|
+
checksum = "73225868fc1cd84eef2c3c230ddb91273bf1de46aeb8a4248da76d32a0924a1c"
|
|
1548
1495
|
dependencies = [
|
|
1549
1496
|
"proc-macro2",
|
|
1550
1497
|
"pyo3-macros-backend",
|
|
@@ -1554,13 +1501,12 @@ dependencies = [
|
|
|
1554
1501
|
|
|
1555
1502
|
[[package]]
|
|
1556
1503
|
name = "pyo3-macros-backend"
|
|
1557
|
-
version = "0.
|
|
1504
|
+
version = "0.29.2"
|
|
1558
1505
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1559
|
-
checksum = "
|
|
1506
|
+
checksum = "571575aa3749fa6216757dd47d2a3e7ef360f329a40f0666a9fbd14889024952"
|
|
1560
1507
|
dependencies = [
|
|
1561
1508
|
"heck",
|
|
1562
1509
|
"proc-macro2",
|
|
1563
|
-
"pyo3-build-config",
|
|
1564
1510
|
"quote",
|
|
1565
1511
|
"syn",
|
|
1566
1512
|
]
|
|
@@ -1625,7 +1571,7 @@ dependencies = [
|
|
|
1625
1571
|
"once_cell",
|
|
1626
1572
|
"socket2",
|
|
1627
1573
|
"tracing",
|
|
1628
|
-
"windows-sys 0.
|
|
1574
|
+
"windows-sys 0.61.2",
|
|
1629
1575
|
]
|
|
1630
1576
|
|
|
1631
1577
|
[[package]]
|
|
@@ -1741,15 +1687,6 @@ dependencies = [
|
|
|
1741
1687
|
"yasna",
|
|
1742
1688
|
]
|
|
1743
1689
|
|
|
1744
|
-
[[package]]
|
|
1745
|
-
name = "redox_syscall"
|
|
1746
|
-
version = "0.5.18"
|
|
1747
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1748
|
-
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
|
|
1749
|
-
dependencies = [
|
|
1750
|
-
"bitflags",
|
|
1751
|
-
]
|
|
1752
|
-
|
|
1753
1690
|
[[package]]
|
|
1754
1691
|
name = "regex"
|
|
1755
1692
|
version = "1.13.0"
|
|
@@ -1809,14 +1746,14 @@ dependencies = [
|
|
|
1809
1746
|
"errno",
|
|
1810
1747
|
"libc",
|
|
1811
1748
|
"linux-raw-sys",
|
|
1812
|
-
"windows-sys 0.
|
|
1749
|
+
"windows-sys 0.61.2",
|
|
1813
1750
|
]
|
|
1814
1751
|
|
|
1815
1752
|
[[package]]
|
|
1816
1753
|
name = "rustls"
|
|
1817
|
-
version = "0.23.
|
|
1754
|
+
version = "0.23.45"
|
|
1818
1755
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1819
|
-
checksum = "
|
|
1756
|
+
checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
|
|
1820
1757
|
dependencies = [
|
|
1821
1758
|
"log",
|
|
1822
1759
|
"once_cell",
|
|
@@ -1851,9 +1788,9 @@ dependencies = [
|
|
|
1851
1788
|
|
|
1852
1789
|
[[package]]
|
|
1853
1790
|
name = "rustls-webpki"
|
|
1854
|
-
version = "0.103.
|
|
1791
|
+
version = "0.103.15"
|
|
1855
1792
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1856
|
-
checksum = "
|
|
1793
|
+
checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
|
|
1857
1794
|
dependencies = [
|
|
1858
1795
|
"ring",
|
|
1859
1796
|
"rustls-pki-types",
|
|
@@ -1896,12 +1833,6 @@ dependencies = [
|
|
|
1896
1833
|
"windows-sys 0.61.2",
|
|
1897
1834
|
]
|
|
1898
1835
|
|
|
1899
|
-
[[package]]
|
|
1900
|
-
name = "scopeguard"
|
|
1901
|
-
version = "1.2.0"
|
|
1902
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1903
|
-
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
|
1904
|
-
|
|
1905
1836
|
[[package]]
|
|
1906
1837
|
name = "security-framework"
|
|
1907
1838
|
version = "3.7.0"
|
|
@@ -2060,9 +1991,9 @@ dependencies = [
|
|
|
2060
1991
|
|
|
2061
1992
|
[[package]]
|
|
2062
1993
|
name = "target-lexicon"
|
|
2063
|
-
version = "0.
|
|
1994
|
+
version = "0.13.5"
|
|
2064
1995
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2065
|
-
checksum = "
|
|
1996
|
+
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
2066
1997
|
|
|
2067
1998
|
[[package]]
|
|
2068
1999
|
name = "tempfile"
|
|
@@ -2074,7 +2005,7 @@ dependencies = [
|
|
|
2074
2005
|
"getrandom 0.4.3",
|
|
2075
2006
|
"once_cell",
|
|
2076
2007
|
"rustix",
|
|
2077
|
-
"windows-sys 0.
|
|
2008
|
+
"windows-sys 0.61.2",
|
|
2078
2009
|
]
|
|
2079
2010
|
|
|
2080
2011
|
[[package]]
|
|
@@ -2283,12 +2214,6 @@ version = "1.13.3"
|
|
|
2283
2214
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2284
2215
|
checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
|
|
2285
2216
|
|
|
2286
|
-
[[package]]
|
|
2287
|
-
name = "unindent"
|
|
2288
|
-
version = "0.2.4"
|
|
2289
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2290
|
-
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
2291
|
-
|
|
2292
2217
|
[[package]]
|
|
2293
2218
|
name = "untrusted"
|
|
2294
2219
|
version = "0.9.0"
|
|
@@ -2448,7 +2373,7 @@ version = "0.1.11"
|
|
|
2448
2373
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2449
2374
|
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
|
2450
2375
|
dependencies = [
|
|
2451
|
-
"windows-sys 0.
|
|
2376
|
+
"windows-sys 0.61.2",
|
|
2452
2377
|
]
|
|
2453
2378
|
|
|
2454
2379
|
[[package]]
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[workspace]
|
|
2
|
-
resolver = "
|
|
3
|
-
members = ["crates/eggfetch-core", "crates/eggfetch-python"]
|
|
2
|
+
resolver = "3"
|
|
3
|
+
members = ["crates/eggfetch-http-connect", "crates/eggfetch-core", "crates/eggfetch-python"]
|
|
4
4
|
|
|
5
5
|
[workspace.package]
|
|
6
6
|
edition = "2021"
|
|
7
|
-
rust-version = "1.
|
|
7
|
+
rust-version = "1.89"
|
|
8
8
|
license = "MIT"
|
|
9
9
|
repository = "https://github.com/eggstack/eggfetch"
|
|
10
10
|
homepage = "https://github.com/eggstack/eggfetch"
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eggfetch
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Programming Language :: Python :: 3
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.10
|
|
7
7
|
Classifier: Programming Language :: Python :: 3.11
|
|
8
8
|
Classifier: Programming Language :: Python :: 3.12
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.13
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
10
12
|
Classifier: Programming Language :: Rust
|
|
11
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
12
14
|
Requires-Dist: pytest>=8.4 ; extra == 'test'
|
|
@@ -31,20 +33,20 @@ Project-URL: Repository, https://github.com/eggstack/eggfetch
|
|
|
31
33
|
[](https://pepy.tech/projects/eggfetch)
|
|
32
34
|
[](LICENSE-MIT)
|
|
33
35
|
|
|
34
|
-
eggfetch is a Rust-native async HTTP client engine (tokio + hyper) with Python bindings and a CLI. There is exactly one networking implementation, living entirely in `eggfetch-core
|
|
36
|
+
eggfetch is a Rust-native async HTTP client engine (tokio + hyper) with Python bindings and a CLI. There is exactly one networking implementation, living entirely in `eggfetch-core` plus the small `eggfetch-http-connect` CONNECT wire primitive it owns; the Python sync API blocks on the async engine while releasing the GIL, and the async API integrates with asyncio.
|
|
35
37
|
|
|
36
38
|
## Features
|
|
37
39
|
|
|
38
|
-
- **HTTP/1.1, HTTP/2, HTTP/3** — ALPN negotiation; HTTP/3 over QUIC
|
|
39
|
-
- **Streaming** —
|
|
40
|
-
- **Pooling
|
|
41
|
-
- **TLS** — rustls with custom CA
|
|
42
|
-
- **Proxy** — HTTP forwarding, HTTPS CONNECT, proxy auth, per-request override, `NO_PROXY
|
|
40
|
+
- **HTTP/1.1, HTTP/2, HTTP/3** — ALPN negotiation; HTTP/3 over QUIC is experimental ([guide](docs/rust/guide.md))
|
|
41
|
+
- **Streaming** — response bodies stream without eager buffering (`bytes_stream()`, `text_lines()`), with trailers after EOF ([guide](docs/rust/guide.md))
|
|
42
|
+
- **Pooling and timeouts** — per-origin connection pools, phase-aware timeouts (pool/connect/write/read/total), and transport metrics ([pool/timeouts](docs/architecture/core-timeout-pool.md))
|
|
43
|
+
- **TLS** — rustls with per-client crypto providers, custom or additive CA roots, mTLS client certs, version policy, and verification toggle ([TLS](docs/concepts/tls.md))
|
|
44
|
+
- **Proxy** — HTTP forwarding, HTTPS CONNECT, proxy auth, per-request override, `NO_PROXY`, SOCKS5, and UDS routes ([proxy](docs/concepts/proxy.md)). CONNECT wire bytes live in the small `eggfetch-http-connect` crate (no sockets/TLS/retry) consumed by `eggfetch-core` via the `proxy` feature.
|
|
43
45
|
- **Cookies, auth, multipart** — RFC 6265 jar, Basic/Bearer with redaction, streaming multipart uploads ([cookies](docs/concepts/cookies.md))
|
|
44
|
-
- **Retries and
|
|
46
|
+
- **Retries, redirects, and routing** — policy-driven backoff with `Retry-After`, replayable-body redirect handling ([retry](docs/concepts/retry.md)). Retry/redirect/Basic are coarse Cargo capabilities (`logical-retry`, `redirects`, `basic-auth`); advanced routing (custom Dialer, resolved-target/SNI, socket options, UDS) is `advanced-routing`: the lean `standard-http1` + `tls-rustls` profile omits both for Bearer-only single-attempt standard-route clients while `http1`/`http2`/default retain current behavior.
|
|
45
47
|
- **Compression** — feature-gated streaming gzip/brotli/zstd/deflate with zip-bomb limits ([compression](docs/concepts/compression.md))
|
|
46
|
-
- **Native Rust JSON (opt-in)** —
|
|
47
|
-
- **Python API** — requests/HTTPX-compatible sync and async interfaces ([guide](docs/python/guide.md)), plus versioned `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0) facades ([compatibility](#httpx-compatibility))
|
|
48
|
+
- **Native Rust JSON (opt-in)** — `RequestBuilder::json()` / `Response::json()` via the `json` feature ([guide](docs/rust/guide.md))
|
|
49
|
+
- **Python API** — requests/HTTPX-compatible sync and async interfaces ([guide](docs/python/guide.md)), lazy request bodies, PEP 561 typing, plus versioned `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0) facades ([compatibility](#httpx-compatibility))
|
|
48
50
|
- **Upgrades** — 101 responses expose an owned `network_stream` (WebSocket/SSE building blocks); CONNECT tunnels stay body-iterator only
|
|
49
51
|
- **CLI** — streaming output, machine-readable formats, shell completions ([guide](docs/cli/guide.md))
|
|
50
52
|
- **C ABI and Node.js prototype** — opaque-handle FFI plus an experimental N-API wrapper ([ffi-and-node](docs/architecture/ffi-and-node.md))
|
|
@@ -61,10 +63,10 @@ pip install eggfetch
|
|
|
61
63
|
|
|
62
64
|
```toml
|
|
63
65
|
[dependencies]
|
|
64
|
-
eggfetch-core =
|
|
66
|
+
eggfetch-core = "0.1"
|
|
65
67
|
```
|
|
66
68
|
|
|
67
|
-
See the [feature profile matrix](docs/architecture/feature-flags.md#supported-core-profiles) for minimal, deterministic, and embedded recipes.
|
|
69
|
+
The default features are the secure HTTP/1.1 client with Rustls and native roots. See the [feature profile matrix](docs/architecture/feature-flags.md#supported-core-profiles) for minimal, deterministic, and embedded recipes. Low-level embedding without the `url`/`idna`/ICU closure selects `native-http1` (or `native-http2`) without `high-level-url` and uses `Client::execute_http_body` with a caller-owned `http::Uri` (callers own IDNA/punycode conversion). The lean high-level recipe (`standard-http1` + `tls-rustls`, without `advanced-routing` or the `logical-retry`/`redirects`/`basic-auth` policy bundle) keeps the URL/request/response conveniences, Bearer auth, timeouts, body bounds, pooling, TLS, and typed failures while dispatching once over the standard route and returning 3xx without following.
|
|
68
70
|
|
|
69
71
|
**CLI:**
|
|
70
72
|
|
|
@@ -139,6 +141,8 @@ from eggfetch.compat.httpx2 import Client as H2Client # httpx2 2.12.0 surface
|
|
|
139
141
|
|
|
140
142
|
See [`docs/python/guide.md`](docs/python/guide.md) for the full Python API reference.
|
|
141
143
|
|
|
144
|
+
The native package supports Python 3.10–3.15 and ships `py.typed` stubs for its public API. `Client` and the top-level sync helpers accept lazy sync `content=` iterables (async-only iterables are rejected before dispatch); `AsyncClient` additionally accepts lazy async iterables, pulled only as the transport asks for them. `eggfetch._native` is a private implementation module — import from `eggfetch`.
|
|
145
|
+
|
|
142
146
|
## Usage -- Rust
|
|
143
147
|
|
|
144
148
|
```rust
|
|
@@ -168,7 +172,16 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
168
172
|
}
|
|
169
173
|
```
|
|
170
174
|
|
|
171
|
-
The opt-in `json` feature adds `RequestBuilder::json()` / `Response::json()` Serde helpers
|
|
175
|
+
The opt-in `json` feature adds `RequestBuilder::json()` / `Response::json()` Serde helpers. For a private CA in addition to the selected native or WebPKI roots, use the additive TLS methods:
|
|
176
|
+
|
|
177
|
+
```rust
|
|
178
|
+
let tls = eggfetch_core::TlsConfig::builder()
|
|
179
|
+
.additional_ca_certificate_path("/path/to/private-ca.pem")?
|
|
180
|
+
.build();
|
|
181
|
+
let client = eggfetch_core::Client::builder().tls_config(tls).build();
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
`additional_ca_certificate_*` augments the base trust store; `ca_certificate_*` replaces it. Advanced embedding — custom dialers, direct/proxy address pinning, detailed failure introspection, frame-level bodies, the Tower service adapter, and physical-connection guards — is covered in [`docs/rust/guide.md`](docs/rust/guide.md).
|
|
172
185
|
|
|
173
186
|
## Usage -- CLI
|
|
174
187
|
|
|
@@ -203,7 +216,7 @@ More patterns are in [`docs/cookbook/`](docs/cookbook/).
|
|
|
203
216
|
|
|
204
217
|
## HTTPX Compatibility
|
|
205
218
|
|
|
206
|
-
Two versioned, independent facades over the single Rust engine — `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0, adds `FunctionAuth`, `Origin`/`URL.origin`, `QUERY`, SSE, optional WebSocket).
|
|
219
|
+
Two versioned, independent facades over the single Rust engine — `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0, adds `FunctionAuth`, `Origin`/`URL.origin`, `QUERY`, SSE, optional WebSocket).
|
|
207
220
|
|
|
208
221
|
See [`docs/reference/compatibility.md`](docs/reference/compatibility.md) for the full feature matrix and retained differences.
|
|
209
222
|
|
|
@@ -225,7 +238,7 @@ See [`docs/reference/compatibility.md`](docs/reference/compatibility.md) for the
|
|
|
225
238
|
|
|
226
239
|
## Security
|
|
227
240
|
|
|
228
|
-
- **Dependency auditing:**
|
|
241
|
+
- **Dependency auditing:** run the live preflight with `./scripts/check_security.sh` before publication
|
|
229
242
|
- **Secret redaction:** all `Debug`/`Display`/error output redacts credentials, cookies, bearer tokens, and proxy passwords
|
|
230
243
|
- **Threat model:** see [docs/architecture/threat-model.md](docs/architecture/threat-model.md)
|
|
231
244
|
- **Vulnerability reporting:** see [SECURITY.md](SECURITY.md)
|
|
@@ -236,5 +249,5 @@ eggfetch is licensed under the [MIT License](LICENSE-MIT).
|
|
|
236
249
|
|
|
237
250
|
## MSRV
|
|
238
251
|
|
|
239
|
-
The minimum supported Rust version is **1.
|
|
252
|
+
The minimum supported Rust version is **1.89**, declared in `workspace.package.rust-version` and checked in extended validation with the exact 1.89.0 toolchain. `rust-toolchain.toml` pins the stable channel for normal development.
|
|
240
253
|
|
|
@@ -7,20 +7,20 @@
|
|
|
7
7
|
[](https://pepy.tech/projects/eggfetch)
|
|
8
8
|
[](LICENSE-MIT)
|
|
9
9
|
|
|
10
|
-
eggfetch is a Rust-native async HTTP client engine (tokio + hyper) with Python bindings and a CLI. There is exactly one networking implementation, living entirely in `eggfetch-core
|
|
10
|
+
eggfetch is a Rust-native async HTTP client engine (tokio + hyper) with Python bindings and a CLI. There is exactly one networking implementation, living entirely in `eggfetch-core` plus the small `eggfetch-http-connect` CONNECT wire primitive it owns; the Python sync API blocks on the async engine while releasing the GIL, and the async API integrates with asyncio.
|
|
11
11
|
|
|
12
12
|
## Features
|
|
13
13
|
|
|
14
|
-
- **HTTP/1.1, HTTP/2, HTTP/3** — ALPN negotiation; HTTP/3 over QUIC
|
|
15
|
-
- **Streaming** —
|
|
16
|
-
- **Pooling
|
|
17
|
-
- **TLS** — rustls with custom CA
|
|
18
|
-
- **Proxy** — HTTP forwarding, HTTPS CONNECT, proxy auth, per-request override, `NO_PROXY
|
|
14
|
+
- **HTTP/1.1, HTTP/2, HTTP/3** — ALPN negotiation; HTTP/3 over QUIC is experimental ([guide](docs/rust/guide.md))
|
|
15
|
+
- **Streaming** — response bodies stream without eager buffering (`bytes_stream()`, `text_lines()`), with trailers after EOF ([guide](docs/rust/guide.md))
|
|
16
|
+
- **Pooling and timeouts** — per-origin connection pools, phase-aware timeouts (pool/connect/write/read/total), and transport metrics ([pool/timeouts](docs/architecture/core-timeout-pool.md))
|
|
17
|
+
- **TLS** — rustls with per-client crypto providers, custom or additive CA roots, mTLS client certs, version policy, and verification toggle ([TLS](docs/concepts/tls.md))
|
|
18
|
+
- **Proxy** — HTTP forwarding, HTTPS CONNECT, proxy auth, per-request override, `NO_PROXY`, SOCKS5, and UDS routes ([proxy](docs/concepts/proxy.md)). CONNECT wire bytes live in the small `eggfetch-http-connect` crate (no sockets/TLS/retry) consumed by `eggfetch-core` via the `proxy` feature.
|
|
19
19
|
- **Cookies, auth, multipart** — RFC 6265 jar, Basic/Bearer with redaction, streaming multipart uploads ([cookies](docs/concepts/cookies.md))
|
|
20
|
-
- **Retries and
|
|
20
|
+
- **Retries, redirects, and routing** — policy-driven backoff with `Retry-After`, replayable-body redirect handling ([retry](docs/concepts/retry.md)). Retry/redirect/Basic are coarse Cargo capabilities (`logical-retry`, `redirects`, `basic-auth`); advanced routing (custom Dialer, resolved-target/SNI, socket options, UDS) is `advanced-routing`: the lean `standard-http1` + `tls-rustls` profile omits both for Bearer-only single-attempt standard-route clients while `http1`/`http2`/default retain current behavior.
|
|
21
21
|
- **Compression** — feature-gated streaming gzip/brotli/zstd/deflate with zip-bomb limits ([compression](docs/concepts/compression.md))
|
|
22
|
-
- **Native Rust JSON (opt-in)** —
|
|
23
|
-
- **Python API** — requests/HTTPX-compatible sync and async interfaces ([guide](docs/python/guide.md)), plus versioned `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0) facades ([compatibility](#httpx-compatibility))
|
|
22
|
+
- **Native Rust JSON (opt-in)** — `RequestBuilder::json()` / `Response::json()` via the `json` feature ([guide](docs/rust/guide.md))
|
|
23
|
+
- **Python API** — requests/HTTPX-compatible sync and async interfaces ([guide](docs/python/guide.md)), lazy request bodies, PEP 561 typing, plus versioned `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0) facades ([compatibility](#httpx-compatibility))
|
|
24
24
|
- **Upgrades** — 101 responses expose an owned `network_stream` (WebSocket/SSE building blocks); CONNECT tunnels stay body-iterator only
|
|
25
25
|
- **CLI** — streaming output, machine-readable formats, shell completions ([guide](docs/cli/guide.md))
|
|
26
26
|
- **C ABI and Node.js prototype** — opaque-handle FFI plus an experimental N-API wrapper ([ffi-and-node](docs/architecture/ffi-and-node.md))
|
|
@@ -37,10 +37,10 @@ pip install eggfetch
|
|
|
37
37
|
|
|
38
38
|
```toml
|
|
39
39
|
[dependencies]
|
|
40
|
-
eggfetch-core =
|
|
40
|
+
eggfetch-core = "0.1"
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
See the [feature profile matrix](docs/architecture/feature-flags.md#supported-core-profiles) for minimal, deterministic, and embedded recipes.
|
|
43
|
+
The default features are the secure HTTP/1.1 client with Rustls and native roots. See the [feature profile matrix](docs/architecture/feature-flags.md#supported-core-profiles) for minimal, deterministic, and embedded recipes. Low-level embedding without the `url`/`idna`/ICU closure selects `native-http1` (or `native-http2`) without `high-level-url` and uses `Client::execute_http_body` with a caller-owned `http::Uri` (callers own IDNA/punycode conversion). The lean high-level recipe (`standard-http1` + `tls-rustls`, without `advanced-routing` or the `logical-retry`/`redirects`/`basic-auth` policy bundle) keeps the URL/request/response conveniences, Bearer auth, timeouts, body bounds, pooling, TLS, and typed failures while dispatching once over the standard route and returning 3xx without following.
|
|
44
44
|
|
|
45
45
|
**CLI:**
|
|
46
46
|
|
|
@@ -115,6 +115,8 @@ from eggfetch.compat.httpx2 import Client as H2Client # httpx2 2.12.0 surface
|
|
|
115
115
|
|
|
116
116
|
See [`docs/python/guide.md`](docs/python/guide.md) for the full Python API reference.
|
|
117
117
|
|
|
118
|
+
The native package supports Python 3.10–3.15 and ships `py.typed` stubs for its public API. `Client` and the top-level sync helpers accept lazy sync `content=` iterables (async-only iterables are rejected before dispatch); `AsyncClient` additionally accepts lazy async iterables, pulled only as the transport asks for them. `eggfetch._native` is a private implementation module — import from `eggfetch`.
|
|
119
|
+
|
|
118
120
|
## Usage -- Rust
|
|
119
121
|
|
|
120
122
|
```rust
|
|
@@ -144,7 +146,16 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
144
146
|
}
|
|
145
147
|
```
|
|
146
148
|
|
|
147
|
-
The opt-in `json` feature adds `RequestBuilder::json()` / `Response::json()` Serde helpers
|
|
149
|
+
The opt-in `json` feature adds `RequestBuilder::json()` / `Response::json()` Serde helpers. For a private CA in addition to the selected native or WebPKI roots, use the additive TLS methods:
|
|
150
|
+
|
|
151
|
+
```rust
|
|
152
|
+
let tls = eggfetch_core::TlsConfig::builder()
|
|
153
|
+
.additional_ca_certificate_path("/path/to/private-ca.pem")?
|
|
154
|
+
.build();
|
|
155
|
+
let client = eggfetch_core::Client::builder().tls_config(tls).build();
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
`additional_ca_certificate_*` augments the base trust store; `ca_certificate_*` replaces it. Advanced embedding — custom dialers, direct/proxy address pinning, detailed failure introspection, frame-level bodies, the Tower service adapter, and physical-connection guards — is covered in [`docs/rust/guide.md`](docs/rust/guide.md).
|
|
148
159
|
|
|
149
160
|
## Usage -- CLI
|
|
150
161
|
|
|
@@ -179,7 +190,7 @@ More patterns are in [`docs/cookbook/`](docs/cookbook/).
|
|
|
179
190
|
|
|
180
191
|
## HTTPX Compatibility
|
|
181
192
|
|
|
182
|
-
Two versioned, independent facades over the single Rust engine — `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0, adds `FunctionAuth`, `Origin`/`URL.origin`, `QUERY`, SSE, optional WebSocket).
|
|
193
|
+
Two versioned, independent facades over the single Rust engine — `eggfetch.compat.httpx` (0.28.1) and `eggfetch.compat.httpx2` (2.12.0, adds `FunctionAuth`, `Origin`/`URL.origin`, `QUERY`, SSE, optional WebSocket).
|
|
183
194
|
|
|
184
195
|
See [`docs/reference/compatibility.md`](docs/reference/compatibility.md) for the full feature matrix and retained differences.
|
|
185
196
|
|
|
@@ -201,7 +212,7 @@ See [`docs/reference/compatibility.md`](docs/reference/compatibility.md) for the
|
|
|
201
212
|
|
|
202
213
|
## Security
|
|
203
214
|
|
|
204
|
-
- **Dependency auditing:**
|
|
215
|
+
- **Dependency auditing:** run the live preflight with `./scripts/check_security.sh` before publication
|
|
205
216
|
- **Secret redaction:** all `Debug`/`Display`/error output redacts credentials, cookies, bearer tokens, and proxy passwords
|
|
206
217
|
- **Threat model:** see [docs/architecture/threat-model.md](docs/architecture/threat-model.md)
|
|
207
218
|
- **Vulnerability reporting:** see [SECURITY.md](SECURITY.md)
|
|
@@ -212,4 +223,4 @@ eggfetch is licensed under the [MIT License](LICENSE-MIT).
|
|
|
212
223
|
|
|
213
224
|
## MSRV
|
|
214
225
|
|
|
215
|
-
The minimum supported Rust version is **1.
|
|
226
|
+
The minimum supported Rust version is **1.89**, declared in `workspace.package.rust-version` and checked in extended validation with the exact 1.89.0 toolchain. `rust-toolchain.toml` pins the stable channel for normal development.
|