httpclient

package
v0.21.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 26, 2026 License: MIT Imports: 12 Imported by: 0

Documentation

Overview

Package httpclient 提供 CP 与 Worker 共用的「每进程出站 HTTP 客户端工厂」(FR-174,见 ADR-037)。

所有出站下载(自更新 feed/二进制、JDK 归档、服务端 jar、CFR、未来 GitHub API)经本工厂 构造的 *http.Client 出站,统一受进程级代理配置约束:

  • 空配 → 回退 http.ProxyFromEnvironment(等价改造前行为,仍尊重 HTTP_PROXY/NO_PROXY 环境变量);
  • http(s) 代理 → Transport.Proxy 固定返回该代理,但遵守 no_proxy;
  • socks5 代理 → 经 golang.org/x/net/proxy 构造 SOCKS5 dialer,no_proxy 命中走直连;
  • 非法代理 URL → 返回 error,供启动时 fail-fast。

工厂只负责 proxy/transport,不写死请求超时(大文件下载的长超时由各调用方控制)。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func New

func New(cfg Config) (*http.Client, error)

New 按进程代理配置构造出站 *http.Client。

cfg.URL 留空时回退 ProxyFromEnvironment(行为同改造前 http.DefaultClient)。 非法/不支持 scheme 的 URL 返回 error(调用方应在启动时 fail-fast,不静默直连)。 返回的 client 不设 Timeout,由调用方按下载场景自行设置(避免掐断大文件下载)。

func ProxyGeneration

func ProxyGeneration(cfg Config) string

ProxyGeneration 返回代理配置的稳定哈希「代标识」(FR-185,见 ADR-043)。

用于心跳下发时的 generation 比较:CP 据期望代理算 generation 随心跳下发, Worker 仅当与本地已应用代不同时才重建 client(避免每拍重建)。 空配置(无显式代理)返回空串,便于与「期望直连」「未下发」语义对齐: 二者都应得空 generation,Worker 收到空 generation 时回退本地 yaml/env、不强制重建。 非空配置返回 url 与 no_proxy 的 FNV-1a 十六进制哈希(url 变化或 no_proxy 变化都改变哈希)。

func Sanitize

func Sanitize(raw string) string

Sanitize 脱敏代理 URL 中的 user:pass,仅保留 scheme://host:port(用于日志/错误信息)。 解析失败时返回原串去除明显凭据片段,避免泄露密码。

Types

type Config

type Config struct {
	// URL 代理地址,scheme 决定类型:http:// / https:// / socks5://。
	// 留空表示不显式配置,回退 ProxyFromEnvironment(尊重环境变量代理)。
	// 含凭据时经 ${ENV_VAR} 注入、不硬编码(config-files 规范)。
	URL string `mapstructure:"url"`
	// NoProxy 逗号分隔的免代理主机/域/CIDR(语义同 NO_PROXY 环境变量)。
	NoProxy string `mapstructure:"no_proxy"`
}

Config 是单个进程的出站代理配置(mapstructure 直接映射 yaml 的 proxy 段)。

type Provider

type Provider struct {
	// contains filtered or unexported fields
}

Provider 是「可运行时重建的出站 *http.Client 持有者」(FR-185,见 ADR-043)。

出站代理升级为运行时可热生效后,CP/Worker 不再只在启动时 httpclient.New 一次, 而是持有一个 Provider:各下载点每次取当前 client(Client()),保存/下发新代理后 经 Rebuild 原子替换持有的 client,对后续下载即时生效、无需重启。 内部用 atomic.Pointer 保证并发取用/替换无锁安全(多下载 goroutine 与设置保存并发)。

func NewProvider

func NewProvider(cfg Config) (*Provider, error)

NewProvider 按初始代理配置构造持有者。 cfg 非法(不支持 scheme / 不可解析)时返回 error(同 New,供启动时 fail-fast)。

func (*Provider) Client

func (p *Provider) Client() *http.Client

Client 返回当前持有的出站 *http.Client(并发安全)。 始终非 nil(NewProvider 保证初始化,Rebuild 仅在成功时替换)。

func (*Provider) Rebuild

func (p *Provider) Rebuild(cfg Config) error

Rebuild 按新代理配置重建并原子替换持有的 client。 cfg 非法时返回 error 且**不替换**原 client(避免半生效——保存非法配置不应让出站直连)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL