From e89f61c18c43862a3453b465d50e93e5b7eaba44 Mon Sep 17 00:00:00 2001 From: Oxygen <1391083091@qq.com> Date: Sat, 6 Jun 2026 02:10:09 +0800 Subject: [PATCH] fix: strip newlines from NO_PROXY env var values NO_PROXY values with embedded newlines (common in Docker/K8s) cause InvalidURL errors. Strip whitespace from each entry. Fixes #3303 --- src/openai/_base_client.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/openai/_base_client.py b/src/openai/_base_client.py index 216b36aabd..cfc823398e 100644 --- a/src/openai/_base_client.py +++ b/src/openai/_base_client.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os import sys import json import time @@ -93,6 +94,36 @@ log: logging.Logger = logging.getLogger(__name__) log.addFilter(SensitiveHeadersFilter()) + +def _sanitize_proxy_env() -> None: + """Strip whitespace/newlines from proxy-related environment variables. + + In Docker/Kubernetes environments, proxy env vars (especially ``NO_PROXY``) + can contain embedded newlines that cause httpx/urllib to raise + ``InvalidURL`` when parsing proxy URLs. + """ + # Comma-separated host lists: split, strip each entry, rejoin + for key in ("NO_PROXY", "no_proxy"): + val = os.environ.get(key) + if val and "\n" in val: + os.environ[key] = ",".join( + part.strip() for part in val.replace("\n", ",").split(",") if part.strip() + ) + + # Single-URL vars: just strip surrounding whitespace + for key in ( + "HTTP_PROXY", + "http_proxy", + "HTTPS_PROXY", + "https_proxy", + "ALL_PROXY", + "all_proxy", + ): + val = os.environ.get(key) + if val: + os.environ[key] = val.strip() + + # TODO: make base page type vars covariant SyncPageT = TypeVar("SyncPageT", bound="BaseSyncPage[Any]") AsyncPageT = TypeVar("AsyncPageT", bound="BaseAsyncPage[Any]") @@ -836,6 +867,7 @@ def __init__(self, **kwargs: Any) -> None: kwargs.setdefault("timeout", DEFAULT_TIMEOUT) kwargs.setdefault("limits", DEFAULT_CONNECTION_LIMITS) kwargs.setdefault("follow_redirects", True) + _sanitize_proxy_env() super().__init__(**kwargs) @@ -1423,6 +1455,7 @@ def __init__(self, **kwargs: Any) -> None: kwargs.setdefault("timeout", DEFAULT_TIMEOUT) kwargs.setdefault("limits", DEFAULT_CONNECTION_LIMITS) kwargs.setdefault("follow_redirects", True) + _sanitize_proxy_env() super().__init__(**kwargs)