From 8a9c78d4317c9fe42b2cecf0948051a758c20f94 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Wed, 14 Feb 2024 23:43:17 +0600 Subject: [PATCH] :building_construction: Created resource HTTP delivery --- .../resource/delivery/http/resource_http.go | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 internal/resource/delivery/http/resource_http.go diff --git a/internal/resource/delivery/http/resource_http.go b/internal/resource/delivery/http/resource_http.go new file mode 100644 index 0000000..42faba3 --- /dev/null +++ b/internal/resource/delivery/http/resource_http.go @@ -0,0 +1,48 @@ +package http + +import ( + "bytes" + "context" + "fmt" + "io" + "io/fs" + "net/http" + + "source.toby3d.me/toby3d/home/internal/domain" + "source.toby3d.me/toby3d/home/internal/resource" +) + +type Handler struct { + contentDir fs.FS + resources resource.UseCase +} + +func NewHandler(resources resource.UseCase, contentDir fs.FS) *Handler { + return &Handler{ + contentDir: contentDir, + resources: resources, + } +} + +func (h *Handler) Handle(ctx context.Context, path string) (http.Handler, error) { + res, err := h.resources.Do(ctx, path) + if err != nil { + return nil, err + } + + file, err := h.contentDir.Open(res.File.Filename()) + if err != nil { + return nil, fmt.Errorf("cannot open resource: %w", err) + } + defer file.Close() + + resBytes, err := io.ReadAll(file) + if err != nil { + return nil, fmt.Errorf("cannot read resource: %w", err) + } + + // TODO(toby3d): ugly workaround, refactor that. + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.ServeContent(w, r, res.Name(), domain.ResourceModTime(res), bytes.NewReader(resBytes)) + }), nil +}