mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-05-12 17:16:32 +08:00
- Updated all references from v6 to v7 for `github.com/router-for-me/CLIProxyAPI`. - Ensured consistency in imports within core libraries, tests, and integration tests. - Added missing tests for new features in Redis Protocol integration.
52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package cliproxy
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"sync"
|
|
|
|
coreauth "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/auth"
|
|
"github.com/router-for-me/CLIProxyAPI/v7/sdk/proxyutil"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// defaultRoundTripperProvider returns a per-auth HTTP RoundTripper based on
|
|
// the Auth.ProxyURL value. It caches transports per proxy URL string.
|
|
type defaultRoundTripperProvider struct {
|
|
mu sync.RWMutex
|
|
cache map[string]http.RoundTripper
|
|
}
|
|
|
|
func newDefaultRoundTripperProvider() *defaultRoundTripperProvider {
|
|
return &defaultRoundTripperProvider{cache: make(map[string]http.RoundTripper)}
|
|
}
|
|
|
|
// RoundTripperFor implements coreauth.RoundTripperProvider.
|
|
func (p *defaultRoundTripperProvider) RoundTripperFor(auth *coreauth.Auth) http.RoundTripper {
|
|
if auth == nil {
|
|
return nil
|
|
}
|
|
proxyStr := strings.TrimSpace(auth.ProxyURL)
|
|
if proxyStr == "" {
|
|
return nil
|
|
}
|
|
p.mu.RLock()
|
|
rt := p.cache[proxyStr]
|
|
p.mu.RUnlock()
|
|
if rt != nil {
|
|
return rt
|
|
}
|
|
transport, _, errBuild := proxyutil.BuildHTTPTransport(proxyStr)
|
|
if errBuild != nil {
|
|
log.Errorf("%v", errBuild)
|
|
return nil
|
|
}
|
|
if transport == nil {
|
|
return nil
|
|
}
|
|
p.mu.Lock()
|
|
p.cache[proxyStr] = transport
|
|
p.mu.Unlock()
|
|
return transport
|
|
}
|