feat: add env vars to disable render endpoints

BLOCKY_DISABLE_GLB/PNG/GIF/MP4 return 403 when set to true
This commit is contained in:
devilreef 2026-01-23 01:36:43 +06:00
parent ce511e1a85
commit f8947fdcc4
5 changed files with 110 additions and 7 deletions

View file

@ -0,0 +1,35 @@
package api
import (
"encoding/json"
"net/http"
"blockyserver/internal/config"
)
// EndpointGuard creates middleware that returns 403 if endpoint is disabled
func EndpointGuard(enabled bool, endpointName string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !enabled {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusForbidden)
json.NewEncoder(w).Encode(ErrorResponse{
Error: endpointName + " endpoint is disabled",
})
return
}
next.ServeHTTP(w, r)
})
}
}
// NewEndpointGuards creates guards for all render endpoints based on config
func NewEndpointGuards(cfg *config.EndpointConfig) map[string]func(http.Handler) http.Handler {
return map[string]func(http.Handler) http.Handler{
"glb": EndpointGuard(cfg.GLBEnabled, "/render/glb"),
"png": EndpointGuard(cfg.PNGEnabled, "/render/png"),
"gif": EndpointGuard(cfg.GIFEnabled, "/render/gif"),
"mp4": EndpointGuard(cfg.MP4Enabled, "/render/mp4"),
}
}

View file

@ -4,6 +4,7 @@ import (
"net/http"
"time"
"blockyserver/internal/config"
"blockyserver/internal/service"
"github.com/go-chi/chi/v5"
@ -19,6 +20,10 @@ func NewServer(svc *service.MergeService) http.Handler {
r.Use(middleware.Recoverer)
r.Use(middleware.Timeout(60 * time.Second))
// Load endpoint config
cfg := config.LoadEndpointConfig()
guards := NewEndpointGuards(cfg)
// Create handlers
h := NewHandlers(svc)
@ -26,10 +31,10 @@ func NewServer(svc *service.MergeService) http.Handler {
r.Get("/health", h.HandleHealth)
r.Get("/openapi.json", h.HandleOpenAPISpec)
r.Get("/docs", h.HandleSwaggerUI)
r.Post("/render/glb", h.HandleGLB)
r.Post("/render/png", h.HandlePNG)
r.Post("/render/gif", h.HandleGIF)
r.Post("/render/mp4", h.HandleMP4)
r.With(guards["glb"]).Post("/render/glb", h.HandleGLB)
r.With(guards["png"]).Post("/render/png", h.HandlePNG)
r.With(guards["gif"]).Post("/render/gif", h.HandleGIF)
r.With(guards["mp4"]).Post("/render/mp4", h.HandleMP4)
return r
}

31
internal/config/config.go Normal file
View file

@ -0,0 +1,31 @@
package config
import (
"os"
"strings"
)
// EndpointConfig holds enable/disable flags for render endpoints
type EndpointConfig struct {
GLBEnabled bool
PNGEnabled bool
GIFEnabled bool
MP4Enabled bool
}
// LoadEndpointConfig reads endpoint configuration from environment variables.
// All endpoints are enabled by default.
// Set BLOCKY_DISABLE_GLB=true, BLOCKY_DISABLE_PNG=true, etc. to disable.
func LoadEndpointConfig() *EndpointConfig {
return &EndpointConfig{
GLBEnabled: !isDisabled("BLOCKY_DISABLE_GLB"),
PNGEnabled: !isDisabled("BLOCKY_DISABLE_PNG"),
GIFEnabled: !isDisabled("BLOCKY_DISABLE_GIF"),
MP4Enabled: !isDisabled("BLOCKY_DISABLE_MP4"),
}
}
func isDisabled(envVar string) bool {
val := strings.ToLower(os.Getenv(envVar))
return val == "true" || val == "1" || val == "yes"
}