From fca1030e1a776c3726bc9b79017d53d55755d59c Mon Sep 17 00:00:00 2001 From: schreifuchs Date: Sat, 7 Mar 2026 20:26:53 +0100 Subject: [PATCH] feat: limit image request --- internal/components/images/controller.go | 7 +++++++ internal/components/images/resorce.go | 5 ++++- internal/server/routes.go | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/internal/components/images/controller.go b/internal/components/images/controller.go index 2a156dd..6304570 100644 --- a/internal/components/images/controller.go +++ b/internal/components/images/controller.go @@ -60,6 +60,13 @@ func (s *Service) getImage(uid string) (file []byte, mimeType string, err error) } func (s *Service) GetImage(ctx context.Context, uid string, options Options) (img io.Reader, mimeType string, err error) { + if err = s.seph.Acquire(ctx, 1); err != nil { + err = fmt.Errorf("could not Acquire semaphore: %w", err) + return + + } + defer s.seph.Release(1) + rawImage, mimeType, err := s.getImage(uid) if err != nil { return diff --git a/internal/components/images/resorce.go b/internal/components/images/resorce.go index 98d36e8..91aaac2 100644 --- a/internal/components/images/resorce.go +++ b/internal/components/images/resorce.go @@ -4,6 +4,7 @@ import ( "os" "github.com/valkey-io/valkey-go" + "golang.org/x/sync/semaphore" ) type Options struct { @@ -15,12 +16,14 @@ type Options struct { type Service struct { fs fileSystem cache valkey.Client + seph *semaphore.Weighted } -func New(fs fileSystem, cache valkey.Client) *Service { +func New(fs fileSystem, cache valkey.Client, maxConcurency int64) *Service { return &Service{ fs: fs, cache: cache, + seph: semaphore.NewWeighted(maxConcurency), } } diff --git a/internal/server/routes.go b/internal/server/routes.go index cef6d59..93d135c 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -50,7 +50,7 @@ func (s *Server) registerOther() (h http.Handler) { } _ = resthome.New(mux, page.New(fs)) - _ = restimage.New(mux, images.New(fs, valkeyClient)) + _ = restimage.New(mux, images.New(fs, valkeyClient, 4)) mux.Handle("/", http.FileServer(http.FS(web.GetStaticFS())))