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.
Files changed (321) hide show
  1. {eggfetch-0.2.2 → eggfetch-0.3.0}/Cargo.lock +48 -43
  2. {eggfetch-0.2.2 → eggfetch-0.3.0}/PKG-INFO +3 -1
  3. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/Cargo.toml +12 -4
  4. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/auth.rs +2 -0
  5. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/body.rs +8 -2
  6. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client/routes.rs +119 -113
  7. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client.rs +46 -5
  8. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/compression.rs +58 -16
  9. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/cookie.rs +34 -5
  10. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/error.rs +4 -1
  11. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/headers.rs +4 -1
  12. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/http_origin.rs +123 -4
  13. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/http_version.rs +134 -10
  14. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/lib.rs +5 -0
  15. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/multipart.rs +4 -1
  16. eggfetch-0.3.0/crates/eggfetch-core/src/pipeline/custom_dialing.rs +225 -0
  17. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/finalize.rs +4 -1
  18. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/h3_dispatch.rs +8 -3
  19. eggfetch-0.3.0/crates/eggfetch-core/src/pipeline/hop.rs +563 -0
  20. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/hyper_dispatch.rs +47 -13
  21. eggfetch-0.3.0/crates/eggfetch-core/src/pipeline/lean.rs +94 -0
  22. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/mod.rs +126 -54
  23. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/prepare.rs +31 -56
  24. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/proxy_dispatch.rs +4 -1
  25. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/redirect.rs +118 -265
  26. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/retry.rs +4 -1
  27. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pool.rs +314 -112
  28. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy.rs +9 -10
  29. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/redirect.rs +4 -1
  30. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/request.rs +11 -28
  31. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/response.rs +12 -9
  32. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/retry.rs +12 -3
  33. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/timeout.rs +16 -11
  34. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/tls.rs +4 -1
  35. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/connect.rs +44 -22
  36. eggfetch-0.3.0/crates/eggfetch-core/src/transport/datagram.rs +923 -0
  37. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/direct.rs +103 -18
  38. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/direct_connector.rs +6 -5
  39. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/http3.rs +389 -47
  40. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/hyper_client.rs +24 -47
  41. eggfetch-0.3.0/crates/eggfetch-core/src/transport/mod.rs +274 -0
  42. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/proxy.rs +49 -28
  43. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/socks.rs +2 -4
  44. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/uds.rs +19 -9
  45. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport_hints.rs +43 -0
  46. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/adverse_tests.rs +4 -0
  47. eggfetch-0.3.0/crates/eggfetch-core/tests/consolidation_evidence_tests.rs +392 -0
  48. eggfetch-0.3.0/crates/eggfetch-core/tests/cookie_policy_parity_tests.rs +541 -0
  49. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/custom_dialer_tests.rs +4 -0
  50. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/direct_transport_tests.rs +17 -1
  51. eggfetch-0.3.0/crates/eggfetch-core/tests/h3_datagram_route.rs +1078 -0
  52. eggfetch-0.3.0/crates/eggfetch-core/tests/hop_equivalence_support.rs +210 -0
  53. eggfetch-0.3.0/crates/eggfetch-core/tests/http_version_capability_tests.rs +150 -0
  54. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/integration.rs +4 -0
  55. eggfetch-0.3.0/crates/eggfetch-core/tests/lean_path_equivalence.rs +68 -0
  56. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/lean_policy_tests.rs +1 -1
  57. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/lean_route_tests.rs +1 -1
  58. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_http_body_tests.rs +43 -1
  59. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_tower_service_tests.rs +4 -0
  60. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/network_stream_tests.rs +15 -5
  61. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/pool_tests.rs +1 -0
  62. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/proxy_tests.rs +46 -21
  63. eggfetch-0.3.0/crates/eggfetch-core/tests/public_api_contracts.rs +179 -0
  64. eggfetch-0.3.0/crates/eggfetch-core/tests/redirect_path_equivalence.rs +65 -0
  65. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/redirect_strict_tests.rs +4 -0
  66. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/request_failure_tests.rs +4 -0
  67. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/resolved_route_cache_tests.rs +4 -0
  68. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/resource_stabilization.rs +1 -0
  69. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/retry_integration.rs +4 -0
  70. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/streaming_decompression_tests.rs +10 -0
  71. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/timeout_tests.rs +122 -1
  72. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/tls_integration.rs +4 -0
  73. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/tls_response_completeness.rs +4 -0
  74. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/total_body_deadline_tests.rs +4 -0
  75. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/trailer_tests.rs +1 -0
  76. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/transport_metrics_tests.rs +22 -8
  77. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/Cargo.toml +1 -1
  78. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/Cargo.toml +2 -2
  79. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/async_client.rs +61 -13
  80. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/auth.rs +8 -2
  81. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/client.rs +61 -13
  82. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/errors.rs +8 -2
  83. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/lib.rs +37 -8
  84. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/network_stream.rs +16 -4
  85. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/proxy.rs +63 -3
  86. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/request_preparation.rs +26 -12
  87. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/response.rs +17 -39
  88. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/retry.rs +2 -1
  89. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/async_iterators.rs +20 -4
  90. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/sync_iterators.rs +20 -4
  91. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming.rs +2 -3
  92. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/native_fixtures.py +10 -1
  93. eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_cookie_policy_parity.py +478 -0
  94. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_01_tls_and_proxy_trust_safety.py +17 -5
  95. eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_environment_isolation.py +367 -0
  96. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_h2_differential.py +5 -1
  97. eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_httpx2_origin_reachability.py +274 -0
  98. eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_httpx_transport_bridge.py +84 -0
  99. eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_httpx_transport_sdk_construction.py +128 -0
  100. eggfetch-0.3.0/crates/eggfetch-python/tests/compat/test_redirect_policy_parity.py +519 -0
  101. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_resource_assertions.py +4 -0
  102. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_ssl_context_network_proof.py +1 -0
  103. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_url_query.py +11 -0
  104. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/native_api_manifest.json +2 -2
  105. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_sync.py +1 -1
  106. {eggfetch-0.2.2 → eggfetch-0.3.0}/pyproject.toml +4 -1
  107. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/_native.pyi +2 -2
  108. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_client.py +10 -0
  109. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_transports.py +10 -0
  110. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_urls.py +67 -19
  111. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/__init__.py +4 -2
  112. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/__init__.pyi +8 -2
  113. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_api.py +1 -1
  114. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_client.py +30 -0
  115. eggfetch-0.3.0/python/eggfetch/compat/httpx2/_request.py +67 -0
  116. eggfetch-0.3.0/python/eggfetch/compat/httpx2/_response.py +90 -0
  117. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_urls.py +60 -0
  118. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_api.py +1 -1
  119. eggfetch-0.3.0/python/eggfetch/integrations/__init__.py +2 -0
  120. eggfetch-0.3.0/python/eggfetch/integrations/httpx.py +197 -0
  121. eggfetch-0.2.2/crates/eggfetch-core/src/pipeline/lean.rs +0 -121
  122. eggfetch-0.2.2/crates/eggfetch-core/src/transport/mod.rs +0 -129
  123. eggfetch-0.2.2/crates/eggfetch-core/tests/public_api_contracts.rs +0 -90
  124. eggfetch-0.2.2/python/eggfetch/compat/httpx2/_request.py +0 -7
  125. eggfetch-0.2.2/python/eggfetch/compat/httpx2/_response.py +0 -7
  126. {eggfetch-0.2.2 → eggfetch-0.3.0}/Cargo.toml +0 -0
  127. {eggfetch-0.2.2 → eggfetch-0.3.0}/README.md +0 -0
  128. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/README.md +0 -0
  129. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/examples/quickstart.rs +0 -0
  130. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client/config.rs +0 -0
  131. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/client/connectors.rs +0 -0
  132. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/h2_headers.rs +0 -0
  133. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/limits.rs +0 -0
  134. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/network_stream.rs +0 -0
  135. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/pipeline/route.rs +0 -0
  136. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy/environment.rs +0 -0
  137. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy/identity.rs +0 -0
  138. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/proxy/no_proxy.rs +0 -0
  139. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/redact.rs +0 -0
  140. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/response_decode.rs +0 -0
  141. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/service.rs +0 -0
  142. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/stream/body_timeout.rs +0 -0
  143. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/stream/mod.rs +0 -0
  144. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/stream/write_timeout.rs +0 -0
  145. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/trace.rs +0 -0
  146. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/alt_svc.rs +0 -0
  147. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/connect_timeout.rs +0 -0
  148. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/dialer.rs +0 -0
  149. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/lifecycle.rs +0 -0
  150. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/metrics.rs +0 -0
  151. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/src/transport/standard_resolver.rs +0 -0
  152. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/cross_feature_tests.rs +1 -1
  153. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_alt_svc_discovery.rs +0 -0
  154. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_hardening.rs +1 -1
  155. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_integration.rs +1 -1
  156. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/h3_interop_qualification.rs +1 -1
  157. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/http2_tests.rs +1 -1
  158. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/http3_tests.rs +0 -0
  159. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_json.rs +1 -1
  160. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/native_transport_failure_classification.rs +0 -0
  161. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/proxy_env_tests.rs +0 -0
  162. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/response_body_public_shape.rs +0 -0
  163. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/test_server.rs +0 -0
  164. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-core/tests/tls_fixtures.rs +0 -0
  165. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/README.md +0 -0
  166. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/error.rs +0 -0
  167. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/lib.rs +0 -0
  168. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/request.rs +0 -0
  169. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/response.rs +0 -0
  170. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/src/target.rs +0 -0
  171. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-http-connect/tests/wire.rs +0 -0
  172. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/README.md +0 -0
  173. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/conversion.rs +0 -0
  174. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/cookies.rs +0 -0
  175. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/extensions.rs +0 -0
  176. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/headers.rs +0 -0
  177. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/limits.rs +0 -0
  178. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/multipart.rs +0 -0
  179. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/decoding.rs +0 -0
  180. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/state.rs +0 -0
  181. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/streaming/sync_bridge.rs +0 -0
  182. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/timeout.rs +0 -0
  183. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/tls.rs +0 -0
  184. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/src/trace_bridge.rs +0 -0
  185. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/__init__.py +0 -0
  186. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/conftest.py +0 -0
  187. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/fixtures.py +0 -0
  188. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_asgi.py +0 -0
  189. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_auth.py +0 -0
  190. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_auth_input_normalization.py +0 -0
  191. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_auth_replay.py +0 -0
  192. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_backends.py +0 -0
  193. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_behavior_cases.py +0 -0
  194. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_client.py +0 -0
  195. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_client_mutability_and_state.py +0 -0
  196. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_client_stream_overrides.py +0 -0
  197. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_config_objects.py +0 -0
  198. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_cookie_scope_parity.py +0 -0
  199. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_cookies.py +0 -0
  200. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_01_tls_network_proof.py +0 -0
  201. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_02_extensions_and_wire_metadata.py +0 -0
  202. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_03_network_stream_upgrade.py +0 -0
  203. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_corrective_kernel.py +0 -0
  204. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_downstream_portfolio.py +0 -0
  205. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_downstream_runner_negative.py +0 -0
  206. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_environment.py +0 -0
  207. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_exceptions.py +0 -0
  208. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_extensions.py +0 -0
  209. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_headers.py +0 -0
  210. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_hook_auth_ordering.py +0 -0
  211. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_hook_cookie_auth_ordering.py +0 -0
  212. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_hooks.py +0 -0
  213. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_api_parity.py +0 -0
  214. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_behavior.py +0 -0
  215. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_sse.py +0 -0
  216. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx2_websocket.py +0 -0
  217. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx_extras.py +0 -0
  218. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx_reference_pinning.py +0 -0
  219. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_httpx_required.py +0 -0
  220. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_imports.py +0 -0
  221. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_lifecycle.py +0 -0
  222. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_lossy_conversions.py +0 -0
  223. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_merge_lossless.py +0 -0
  224. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_merge_matrix.py +0 -0
  225. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_mock_transport.py +0 -0
  226. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_mounts.py +0 -0
  227. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_multihop_cleanup.py +0 -0
  228. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_native_proxy_tls.py +0 -0
  229. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_native_timeout_classification.py +0 -0
  230. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_no_proxy_differential.py +0 -0
  231. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_oracle_negative.py +0 -0
  232. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_protocol_and_unsupported_options.py +0 -0
  233. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_proxy_differential.py +0 -0
  234. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_proxy_phase05_tracks.py +0 -0
  235. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_raw_stream_httpx_differential.py +0 -0
  236. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_raw_stream_lifecycle.py +0 -0
  237. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_redirect_state_machine_parity.py +0 -0
  238. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request.py +0 -0
  239. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request_construction_parity.py +0 -0
  240. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request_stream_state.py +0 -0
  241. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_request_streaming.py +0 -0
  242. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response.py +0 -0
  243. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_encoding_parity.py +0 -0
  244. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_metadata_parity.py +0 -0
  245. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_status_and_redirect_state.py +0 -0
  246. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_stream_state_parity.py +0 -0
  247. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_response_streaming.py +0 -0
  248. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_shutdown.py +0 -0
  249. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_soak.py +0 -0
  250. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_socks_transport.py +0 -0
  251. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_ssl_context_translation.py +0 -0
  252. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_stream_resources.py +0 -0
  253. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_timeout_integration.py +0 -0
  254. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_timeout_proxysis.py +0 -0
  255. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_timeout_reference_differential.py +0 -0
  256. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_top_level_helpers_parity.py +0 -0
  257. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_trace_detection.py +0 -0
  258. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_transports.py +0 -0
  259. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_uds_transport.py +0 -0
  260. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/compat/test_wsgi.py +0 -0
  261. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/conftest.py +0 -0
  262. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_async.py +0 -0
  263. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_auth.py +0 -0
  264. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_close_races.py +0 -0
  265. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_cookie_auth.py +0 -0
  266. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_cookies.py +0 -0
  267. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_differential.py +0 -0
  268. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_http2.py +0 -0
  269. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_interpreter_shutdown.py +0 -0
  270. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_native_api.py +0 -0
  271. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_parity.py +0 -0
  272. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_proxy.py +0 -0
  273. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_python_typing_surface.py +0 -0
  274. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_redirects.py +0 -0
  275. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_response_compat.py +0 -0
  276. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_retry.py +0 -0
  277. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/test_streaming.py +0 -0
  278. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/compat_consumer.py +0 -0
  279. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/consumer.py +0 -0
  280. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/negative_sync_async_body.py +0 -0
  281. {eggfetch-0.2.2 → eggfetch-0.3.0}/crates/eggfetch-python/tests/typing/negative_verify_and_return.py +0 -0
  282. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/__init__.py +0 -0
  283. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/__init__.pyi +0 -0
  284. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/_ssl_context.py +0 -0
  285. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/__init__.py +0 -0
  286. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/__init__.py +0 -0
  287. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/__init__.pyi +0 -0
  288. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_asgi.py +0 -0
  289. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_auth.py +0 -0
  290. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_cookies.py +0 -0
  291. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_diagnostics.py +0 -0
  292. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_exceptions.py +0 -0
  293. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_headers.py +0 -0
  294. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_limits.py +0 -0
  295. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_mock.py +0 -0
  296. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_proxy.py +0 -0
  297. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_request.py +0 -0
  298. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_response.py +0 -0
  299. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_ssl_context.py +0 -0
  300. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_status_codes.py +0 -0
  301. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_stream.py +0 -0
  302. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_timeout.py +0 -0
  303. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx/_wsgi.py +0 -0
  304. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_alias.py +0 -0
  305. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_asgi.py +0 -0
  306. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_auth.py +0 -0
  307. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_config.py +0 -0
  308. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_cookies.py +0 -0
  309. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_exceptions.py +0 -0
  310. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_headers.py +0 -0
  311. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_mock.py +0 -0
  312. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_sse.py +0 -0
  313. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_status_codes.py +0 -0
  314. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_stream.py +0 -0
  315. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_transports.py +0 -0
  316. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/_wsgi.py +0 -0
  317. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/__init__.py +0 -0
  318. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_exceptions.py +0 -0
  319. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_ping.py +0 -0
  320. {eggfetch-0.2.2 → eggfetch-0.3.0}/python/eggfetch/compat/httpx2/websockets/_transport.py +0 -0
  321. {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 = "2.0.4"
22
+ version = "3.0.0"
23
23
  source = "registry+https://github.com/rust-lang/crates.io-index"
24
- checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
24
+ checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a"
25
25
 
26
26
  [[package]]
27
27
  name = "alloc-stdlib"
28
- version = "0.2.4"
28
+ version = "0.3.0"
29
29
  source = "registry+https://github.com/rust-lang/crates.io-index"
30
- checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195"
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.42"
99
+ version = "0.4.51"
100
100
  source = "registry+https://github.com/rust-lang/crates.io-index"
101
- checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac"
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 = "8.0.4"
162
+ version = "9.1.1"
163
163
  source = "registry+https://github.com/rust-lang/crates.io-index"
164
- checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3"
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 = "5.0.3"
173
+ version = "6.2.0"
174
174
  source = "registry+https://github.com/rust-lang/crates.io-index"
175
- checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583"
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.38"
319
+ version = "0.4.46"
320
320
  source = "registry+https://github.com/rust-lang/crates.io-index"
321
- checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf"
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.32"
333
+ version = "0.4.34"
334
334
  source = "registry+https://github.com/rust-lang/crates.io-index"
335
- checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789"
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.2.2"
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.2.2"
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.2.2"
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.2.2"
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.2.2"
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.2.2"
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.61.2",
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.61.2",
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.16"
1553
+ version = "0.11.18"
1549
1554
  source = "registry+https://github.com/rust-lang/crates.io-index"
1550
- checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560"
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.61.2",
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.61.2",
1759
+ "windows-sys 0.52.0",
1755
1760
  ]
1756
1761
 
1757
1762
  [[package]]
1758
1763
  name = "rustls"
1759
- version = "0.23.45"
1764
+ version = "0.23.46"
1760
1765
  source = "registry+https://github.com/rust-lang/crates.io-index"
1761
- checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
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.15"
1801
+ version = "0.103.16"
1797
1802
  source = "registry+https://github.com/rust-lang/crates.io-index"
1798
- checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
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.61.2",
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.52.3"
2118
+ version = "1.53.3"
2114
2119
  source = "registry+https://github.com/rust-lang/crates.io-index"
2115
- checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
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.8",
2368
+ "webpki-roots 1.0.10",
2364
2369
  ]
2365
2370
 
2366
2371
  [[package]]
2367
2372
  name = "webpki-roots"
2368
- version = "1.0.8"
2373
+ version = "1.0.10"
2369
2374
  source = "registry+https://github.com/rust-lang/crates.io-index"
2370
- checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf"
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.61.2",
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.13.3"
2603
+ version = "0.14.3"
2599
2604
  source = "registry+https://github.com/rust-lang/crates.io-index"
2600
- checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
2605
+ checksum = "db3ae9bf90af6e40197bef767eeefc46ad6397420fe873830bd85e5fbbfb3c70"
2601
2606
  dependencies = [
2602
2607
  "zstd-safe",
2603
2608
  ]
2604
2609
 
2605
2610
  [[package]]
2606
2611
  name = "zstd-safe"
2607
- version = "7.2.4"
2612
+ version = "8.2.0"
2608
2613
  source = "registry+https://github.com/rust-lang/crates.io-index"
2609
- checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
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.0.16+zstd.1.5.7"
2621
+ version = "2.1.2+zstd.1.5.7"
2617
2622
  source = "registry+https://github.com/rust-lang/crates.io-index"
2618
- checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748"
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.2.2
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.2.2"
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.2.2", path = "../eggfetch-http-connect", optional = true }
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 = "8", optional = true, default-features = false, features = ["std"] }
113
- zstd = { version = "0.13", optional = true }
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(clippy::type_complexity)]
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(dead_code)]
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(dead_code)]
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 = Self::build_resolved_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
- target,
129
- sni_hostname,
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 connect_timeout = self.config.timeout.as_ref().and_then(|t| t.connect);
217
- let enabler = crate::http_version::HttpVersionPolicyEnabler::from_policy(
218
- self.config.http_version_policy,
219
- );
220
-
221
- #[cfg(feature = "tls-rustls")]
222
- let tls_connector = {
223
- let tls_config = self.config.tls_config.clone().unwrap_or_default();
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::cached_route(
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::cached_route(
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::cached_route(
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(),