diff --git a/knotserver/git/git.go b/knotserver/git/git.go index c7490000..56b116ed 100644 --- a/knotserver/git/git.go +++ b/knotserver/git/git.go @@ -194,7 +194,7 @@ func (g *GitRepo) FileContent(path string) (string, error) { } } -func (g *GitRepo) BinContent(path string) ([]byte, error) { +func (g *GitRepo) RawContent(path string) ([]byte, error) { c, err := g.r.CommitObject(g.h) if err != nil { return nil, fmt.Errorf("commit object: %w", err) @@ -210,17 +210,13 @@ func (g *GitRepo) BinContent(path string) ([]byte, error) { return nil, err } - isbin, _ := file.IsBinary() - if isbin { - reader, err := file.Reader() - if err != nil { - return nil, fmt.Errorf("opening file reader: %w", err) - } - defer reader.Close() - - return io.ReadAll(reader) + reader, err := file.Reader() + if err != nil { + return nil, fmt.Errorf("opening file reader: %w", err) } - return nil, ErrNotBinaryFile + defer reader.Close() + + return io.ReadAll(reader) } func (g *GitRepo) Tags() ([]*TagReference, error) { diff --git a/knotserver/routes.go b/knotserver/routes.go index bf97eee5..6fbc8d9e 100644 --- a/knotserver/routes.go +++ b/knotserver/routes.go @@ -208,7 +208,7 @@ func (h *Handle) BlobRaw(w http.ResponseWriter, r *http.Request) { return } - contents, err := gr.BinContent(treePath) + contents, err := gr.RawContent(treePath) if err != nil { writeError(w, err.Error(), http.StatusBadRequest) l.Error("file content", "error", err.Error()) @@ -217,6 +217,11 @@ func (h *Handle) BlobRaw(w http.ResponseWriter, r *http.Request) { mimeType := http.DetectContentType(contents) + // exception for svg + if strings.HasPrefix(mimeType, "text/xml") && filepath.Ext(treePath) == ".svg" { + mimeType = "image/svg+xml" + } + if !strings.HasPrefix(mimeType, "image/") && !strings.HasPrefix(mimeType, "video/") { l.Error("attempted to serve non-image/video file", "mimetype", mimeType) writeError(w, "only image and video files can be accessed directly", http.StatusForbidden)