| """Local FCC transport must never escape through an outbound proxy.""" |
|
|
| import threading |
| from collections.abc import Iterator |
| from contextlib import contextmanager |
| from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer |
|
|
| import pytest |
|
|
| from free_claude_code.cli.launchers.common import preflight_proxy |
| from free_claude_code.cli.local_http import with_local_proxy_bypass |
|
|
|
|
| @contextmanager |
| def _status_server(status_code: int) -> Iterator[tuple[str, list[str]]]: |
| hits: list[str] = [] |
|
|
| class Handler(BaseHTTPRequestHandler): |
| def do_GET(self) -> None: |
| hits.append(self.path) |
| self.send_response(status_code) |
| self.end_headers() |
|
|
| def log_message(self, format: str, *args: object) -> None: |
| del format, args |
|
|
| server = ThreadingHTTPServer(("127.0.0.1", 0), Handler) |
| thread = threading.Thread(target=server.serve_forever, daemon=True) |
| thread.start() |
| try: |
| yield f"http://127.0.0.1:{server.server_port}", hits |
| finally: |
| server.shutdown() |
| server.server_close() |
| thread.join() |
|
|
|
|
| def test_proxy_preflight_connects_directly_when_http_proxy_is_configured( |
| monkeypatch: pytest.MonkeyPatch, |
| ) -> None: |
| with _status_server(502) as (forward_proxy_url, forward_proxy_hits): |
| monkeypatch.setenv("HTTP_PROXY", forward_proxy_url) |
| monkeypatch.setenv("http_proxy", forward_proxy_url) |
| monkeypatch.delenv("NO_PROXY", raising=False) |
| monkeypatch.delenv("no_proxy", raising=False) |
|
|
| with _status_server(200) as (fcc_url, fcc_hits): |
| assert preflight_proxy(fcc_url) is None |
|
|
| assert fcc_hits == ["/health"] |
| assert forward_proxy_hits == [] |
|
|
|
|
| def test_child_proxy_bypass_preserves_existing_proxy_policy() -> None: |
| base_env = { |
| "HTTP_PROXY": "http://proxy.example:3128", |
| "NO_PROXY": "example.com, localhost", |
| "no_proxy": "10.0.0.0/8,EXAMPLE.COM", |
| "KEEP_ME": "yes", |
| } |
|
|
| env = with_local_proxy_bypass( |
| base_env, |
| proxy_root_url="http://fcc.internal:8082", |
| ) |
|
|
| assert env["HTTP_PROXY"] == "http://proxy.example:3128" |
| assert env["KEEP_ME"] == "yes" |
| assert env["NO_PROXY"] == ( |
| "example.com,localhost,10.0.0.0/8,127.0.0.1,::1,fcc.internal" |
| ) |
| assert env["no_proxy"] == env["NO_PROXY"] |
| assert base_env["NO_PROXY"] == "example.com, localhost" |
| assert base_env["no_proxy"] == "10.0.0.0/8,EXAMPLE.COM" |
|
|
|
|
| def test_child_proxy_bypass_uses_all_loopback_spellings_without_duplicates() -> None: |
| env = with_local_proxy_bypass( |
| {"NO_PROXY": "127.0.0.1"}, |
| proxy_root_url="http://127.0.0.1:8082", |
| ) |
|
|
| assert env["NO_PROXY"] == "127.0.0.1,localhost,::1" |
| assert env["no_proxy"] == env["NO_PROXY"] |
|
|