fix(phase-1): redact API key query params from log output and add mutex thread-safety to providers map

This commit is contained in:
newkirk
2026-07-21 13:18:31 -04:00
parent 84a18f5866
commit 42b70621a1
6 changed files with 277 additions and 17 deletions
+2 -2
View File
@@ -82,7 +82,7 @@ func (s *Server) handleGetProviders(c *gin.Context) {
status := "disabled"
if enabled {
if _, ok := s.providers[id]; ok {
if _, ok := s.getProvider(id); ok {
status = "online"
} else {
status = "error"
@@ -203,7 +203,7 @@ func (s *Server) handleUpdateProvider(c *gin.Context) {
func (s *Server) handleTestProvider(c *gin.Context) {
name := c.Param("name")
provider, ok := s.providers[name]
provider, ok := s.getProvider(name)
if !ok {
c.JSON(http.StatusNotFound, ErrorResponse(fmt.Sprintf("Provider %s not found or not enabled", name)))
return
+26 -13
View File
@@ -24,15 +24,16 @@ import (
)
type Server struct {
router *gin.Engine
cfg *config.Config
database *db.DB
providers map[string]providers.Provider
sessions *SessionManager
hub *Hub
logger *RequestLogger
registry *models.ModelRegistry
registryMu sync.RWMutex
router *gin.Engine
cfg *config.Config
database *db.DB
providers map[string]providers.Provider
providersMu sync.RWMutex
sessions *SessionManager
hub *Hub
logger *RequestLogger
registry *models.ModelRegistry
registryMu sync.RWMutex
modelRouter *router.Router
}
@@ -88,6 +89,8 @@ func (s *Server) RefreshProviders() error {
dbMap[cfg.ID] = cfg
}
newProviders := make(map[string]providers.Provider)
providerIDs := []string{"openai", "gemini", "deepseek", "moonshot", "grok", "ollama", "xiaomi"}
for _, id := range providerIDs {
// Default values from config
@@ -143,7 +146,6 @@ func (s *Server) RefreshProviders() error {
}
if !enabled {
delete(s.providers, id)
continue
}
@@ -181,10 +183,14 @@ func (s *Server) RefreshProviders() error {
}
if p != nil {
s.providers[id] = providers.NewCircuitBreakerProvider(p)
newProviders[id] = providers.NewCircuitBreakerProvider(p)
}
}
s.providersMu.Lock()
s.providers = newProviders
s.providersMu.Unlock()
s.refreshRouter()
return nil
}
@@ -368,7 +374,7 @@ func (s *Server) handleResponses(c *gin.Context) {
providerName = "ollama"
}
provider, ok := s.providers[providerName]
provider, ok := s.getProvider(providerName)
if !ok {
c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("Provider %s not enabled or supported", providerName)})
return
@@ -520,6 +526,13 @@ func (s *Server) handleListModels(c *gin.Context) {
})
}
func (s *Server) getProvider(name string) (providers.Provider, bool) {
s.providersMu.RLock()
defer s.providersMu.RUnlock()
p, ok := s.providers[name]
return p, ok
}
func (s *Server) selectProvider(modelID string) (providers.Provider, string, error) {
providerName := "openai" // default
modelLower := strings.ToLower(modelID)
@@ -546,7 +559,7 @@ func (s *Server) selectProvider(modelID string) (providers.Provider, string, err
providerName = "xiaomi"
}
p, ok := s.providers[providerName]
p, ok := s.getProvider(providerName)
if !ok {
return nil, "", fmt.Errorf("Provider %s not enabled or supported", providerName)
}