refactor: modularize codebase — deduplicate, extract, clean up
- Unify duplicate uTLS transports into shared internal/transport package - Extract shared version constant into internal/version - Move LoadDefaultCredentials from config to auth (remove config→auth import) - Deduplicate handler.go: extract telemetry/error helpers (324→268 lines) - Break up main.go::run() into initCredential/initEmbedded - Eliminate logging.Config duplication (use config.LoggingConfig directly) - Extract logWriter to embedded/log.go, SSE fixtures to consts in sniff.go - Use uTLS client for usage polling (consistent TLS fingerprint) - Handle sjson.SetBytes errors in sanitize.go instead of silently swallowing - Document reverse-engineered magic values in billing.go - Unexport Credential.CooldownUntil (internal state) - Replace hardcoded auth bypass paths with map in server.go
This commit is contained in:
@@ -13,17 +13,9 @@ import (
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"gopkg.in/lumberjack.v2"
|
||||
)
|
||||
|
||||
// Config holds logging configuration, mirrors config.LoggingConfig.
|
||||
type Config struct {
|
||||
Level string
|
||||
File string
|
||||
MaxSizeMB int
|
||||
MaxBackups int
|
||||
MaxAgeDays int
|
||||
Compress bool
|
||||
}
|
||||
"github.com/fujin/anthropic-proxy/internal/config"
|
||||
)
|
||||
|
||||
// Setup initializes the global zerolog logger.
|
||||
// - File set: JSON → lumberjack rotating file
|
||||
@@ -31,7 +23,7 @@ type Config struct {
|
||||
// - File empty + not TTY: JSON → stderr (for systemd journal)
|
||||
// Extra writers (e.g., OTLP log bridge) are added via io.MultiWriter so logs
|
||||
// are written to both the primary destination and any extra writers.
|
||||
func Setup(cfg Config, extraWriters ...io.Writer) zerolog.Logger {
|
||||
func Setup(cfg config.LoggingConfig, extraWriters ...io.Writer) zerolog.Logger {
|
||||
// Parse log level
|
||||
level, err := zerolog.ParseLevel(cfg.Level)
|
||||
if err != nil || cfg.Level == "" {
|
||||
|
||||
@@ -9,6 +9,8 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
|
||||
"github.com/fujin/anthropic-proxy/internal/config"
|
||||
)
|
||||
|
||||
func TestRedactHeaders(t *testing.T) {
|
||||
@@ -177,7 +179,7 @@ func TestSetup_WithFile(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
logFile := filepath.Join(dir, "test.log")
|
||||
|
||||
logger := Setup(Config{
|
||||
logger := Setup(config.LoggingConfig{
|
||||
Level: "debug",
|
||||
File: logFile,
|
||||
MaxSizeMB: 10,
|
||||
@@ -191,7 +193,7 @@ func TestSetup_WithFile(t *testing.T) {
|
||||
|
||||
func TestSetup_WithoutFile(t *testing.T) {
|
||||
// File empty — should use console or stderr mode depending on TTY
|
||||
logger := Setup(Config{
|
||||
logger := Setup(config.LoggingConfig{
|
||||
Level: "warn",
|
||||
})
|
||||
|
||||
@@ -201,13 +203,13 @@ func TestSetup_WithoutFile(t *testing.T) {
|
||||
|
||||
func TestSetup_DefaultLevel(t *testing.T) {
|
||||
// Empty level should default to info
|
||||
logger := Setup(Config{})
|
||||
logger := Setup(config.LoggingConfig{})
|
||||
_ = logger // verify no panic
|
||||
}
|
||||
|
||||
func TestSetup_InvalidLevel(t *testing.T) {
|
||||
// Invalid level should default to info
|
||||
logger := Setup(Config{Level: "not-a-level"})
|
||||
logger := Setup(config.LoggingConfig{Level: "not-a-level"})
|
||||
_ = logger // verify no panic
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user