90eb56465b
- Updated `.env.example` to include new environment variables for server access logging and security settings, ensuring comprehensive configuration options. - Revised `docker-entrypoint.sh` to clarify the source of supported environment variables. - Improved `README.md` to reflect the latest environment variable changes and maintain synchronization with the canonical list in `internal/config/config.go`. - Added tests to ensure documentation consistency across `.env.example` and `README.md`, preventing future discrepancies.
86 lines
1.9 KiB
Go
86 lines
1.9 KiB
Go
package httpapi
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"scratchbox/internal/config"
|
|
"scratchbox/internal/storage"
|
|
)
|
|
|
|
var testStorageKey = []byte("0123456789abcdef0123456789abcdef")
|
|
|
|
type testServerOptions struct {
|
|
maxUploadBytes int64
|
|
defaultTTL time.Duration
|
|
rateLimitEnable bool
|
|
rawCacheBytes int64 // 0 => default 64MiB
|
|
}
|
|
|
|
func newTestHandler(t *testing.T, opts testServerOptions) http.Handler {
|
|
t.Helper()
|
|
|
|
handler, _ := newTestHandlerAndStore(t, opts)
|
|
return handler
|
|
}
|
|
|
|
func newTestHandlerAndStore(t *testing.T, opts testServerOptions) (http.Handler, *storage.FilesystemStore) {
|
|
t.Helper()
|
|
|
|
dataDir := filepath.Join(t.TempDir(), "data")
|
|
store, err := storage.NewFilesystemStore(dataDir, testStorageKey)
|
|
if err != nil {
|
|
t.Fatalf("NewFilesystemStore() error = %v", err)
|
|
}
|
|
|
|
rawCacheBytes := opts.rawCacheBytes
|
|
if rawCacheBytes <= 0 {
|
|
rawCacheBytes = 64 * 1024 * 1024
|
|
}
|
|
|
|
cfg := config.Config{
|
|
Server: config.ServerConfig{
|
|
ListenAddr: ":0",
|
|
},
|
|
Limits: config.LimitsConfig{
|
|
MaxUploadSizeBytes: opts.maxUploadBytes,
|
|
DefaultTTLDuration: opts.defaultTTL,
|
|
RawCacheMaxBytes: rawCacheBytes,
|
|
RawCacheMaxEntries: 32,
|
|
},
|
|
Storage: config.StorageConfig{
|
|
DataDir: dataDir,
|
|
},
|
|
Security: config.SecurityConfig{
|
|
RateLimitUI: config.RateLimitConfig{
|
|
Enabled: opts.rateLimitEnable,
|
|
RequestsPerMinute: 120,
|
|
Burst: 1,
|
|
},
|
|
RateLimitAPIRead: config.RateLimitConfig{
|
|
Enabled: opts.rateLimitEnable,
|
|
RequestsPerMinute: 120,
|
|
Burst: 1,
|
|
},
|
|
RateLimitAPIWrite: config.RateLimitConfig{
|
|
Enabled: opts.rateLimitEnable,
|
|
RequestsPerMinute: 120,
|
|
Burst: 1,
|
|
},
|
|
HSTSEnabled: true,
|
|
},
|
|
}
|
|
|
|
srv := &Server{
|
|
cfg: cfg,
|
|
store: store,
|
|
logger: log.New(io.Discard, "", 0),
|
|
rawCache: newRawContentCache(cfg.Limits.RawCacheMaxEntries, cfg.Limits.RawCacheMaxBytes),
|
|
}
|
|
return srv.Routes(), store
|
|
}
|