Files
ttstd-infinite-canvas/backend/internal/app/outbound_alias.go
dxiaom d13e1dcaa3 fix(admin): 渠道代理 - 校验代理地址并拒绝无效出口
PR: #717
PR 标题: feat(admin): 渠道管理 - 模型供应商支持渠道级 SOCKS5/HTTP 代理

校验渠道级代理地址并在历史无效配置下拒绝出站请求,保留空代理回退全局代理的行为,同时补充管理端和出站层回归测试。

Co-authored-by: ddcat666 <26564566+ddcat666@users.noreply.github.com>
2026-10-10 05:44:48 +08:00

91 lines
2.5 KiB
Go

package app
import (
"net/http"
"net/url"
"time"
"yingce/backend/internal/outbound"
)
// Outbound 符号从 internal/outbound 再导出,保持 service/handler 调用面稳定。
type OutboundHeader = outbound.OutboundHeader
const (
CustomRelayHeadersHeader = outbound.CustomRelayHeadersHeader
DefaultOutboundUserAgent = outbound.DefaultOutboundUserAgent
)
func ValidateOutboundURL(rawURL string) (*url.URL, error) {
parsed, err := outbound.ValidateOutboundURL(rawURL)
return parsed, mapOutboundError(err)
}
func ValidateCustomRelayURL(rawURL string) (*url.URL, error) {
parsed, err := outbound.ValidateCustomRelayURL(rawURL)
return parsed, mapOutboundError(err)
}
func ValidateProxyURL(rawURL string) (*url.URL, error) {
parsed, err := outbound.ValidateProxyURL(rawURL)
return parsed, mapOutboundError(err)
}
func OutboundHTTPClient(timeout time.Duration) *http.Client {
return outbound.OutboundHTTPClient(timeout)
}
func OutboundHTTPClientWithProxy(timeout time.Duration, proxyURL string) *http.Client {
return outbound.OutboundHTTPClientWithProxy(timeout, proxyURL)
}
func ApplyDefaultOutboundHeaders(req *http.Request) {
outbound.ApplyDefaultOutboundHeaders(req)
}
func NormalizeOutboundHeaders(headers []OutboundHeader) ([]OutboundHeader, error) {
normalized, err := outbound.NormalizeOutboundHeaders(headers)
return normalized, mapOutboundError(err)
}
func ApplyOutboundHeaders(req *http.Request, headers []OutboundHeader) {
outbound.ApplyOutboundHeaders(req, headers)
}
func EncodeOutboundHeadersJSON(headers []OutboundHeader) (string, error) {
encoded, err := outbound.EncodeOutboundHeadersJSON(headers)
return encoded, mapOutboundError(err)
}
func ParseOutboundHeadersJSON(raw string) ([]OutboundHeader, error) {
decoded, err := outbound.ParseOutboundHeadersJSON(raw)
return decoded, mapOutboundError(err)
}
func DecodeRelayOutboundHeaders(encoded string) ([]OutboundHeader, error) {
decoded, err := outbound.DecodeRelayOutboundHeaders(encoded)
return decoded, mapOutboundError(err)
}
func CustomRelayHTTPClient(timeout time.Duration) *http.Client {
return outbound.CustomRelayHTTPClient(timeout)
}
func ValidateOutboundHost(host string) error {
return mapOutboundError(outbound.ValidateOutboundHost(host))
}
func AllowedPrivateUpstreamHost(host string) bool {
return outbound.AllowedPrivateUpstreamHost(host)
}
func mapOutboundError(err error) error {
if err == nil {
return nil
}
if req, ok := err.(*outbound.BadRequestError); ok {
return BadAuthRequest(req.Message)
}
return err
}