From e432723e201e84138f8619f1a704be8222b12f4b Mon Sep 17 00:00:00 2001 From: Julien Loir Date: Thu, 3 Dec 2020 18:56:11 +0100 Subject: [PATCH] Extract file reading into a dedicated function --- files/file.go | 45 ++++++++++++++++++++++++--------------------- files/utils.go | 2 +- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/files/file.go b/files/file.go index 1ae6597a..07bc135f 100644 --- a/files/file.go +++ b/files/file.go @@ -144,29 +144,12 @@ func (i *FileInfo) detectType(modify, saveContent bool) error { // of files couldn't be opened: we'd have immediately // a 500 even though it doesn't matter. So we just log it. - readLen := 0 - buffer := make([]byte, 0) + var buffer []byte mimetype := mime.TypeByExtension(i.Extension) if mimetype == "" { - reader, err := i.Fs.Open(i.Path) - if err != nil { - log.Print(err) - i.Type = "blob" - return nil - } - defer reader.Close() - - buffer = make([]byte, 512) - n, err := reader.Read(buffer) - if err != nil && err != io.EOF { - log.Print(err) - i.Type = "blob" - return nil - } - - readLen = n - mimetype = http.DetectContentType(buffer[:n]) + buffer = i.readFirstBytes() + mimetype = http.DetectContentType(buffer) } switch { @@ -180,7 +163,7 @@ func (i *FileInfo) detectType(modify, saveContent bool) error { case strings.HasPrefix(mimetype, "image"): i.Type = "image" return nil - case readLen > 0 && (isBinary(buffer[:readLen], readLen) || i.Size > 10*1024*1024): // 10 MB + case (len(buffer) > 0 && isBinary(buffer)) || i.Size > 10*1024*1024: // 10 MB i.Type = "blob" return nil default: @@ -204,6 +187,26 @@ func (i *FileInfo) detectType(modify, saveContent bool) error { return nil } +func (i *FileInfo) readFirstBytes() []byte { + reader, err := i.Fs.Open(i.Path) + if err != nil { + log.Print(err) + i.Type = "blob" + return nil + } + defer reader.Close() + + buffer := make([]byte, 512) + n, err := reader.Read(buffer) + if err != nil && err != io.EOF { + log.Print(err) + i.Type = "blob" + return nil + } + + return buffer[:n] +} + func (i *FileInfo) detectSubtitles() { if i.Type != "video" { return diff --git a/files/utils.go b/files/utils.go index bcaa13f1..f4b0365d 100644 --- a/files/utils.go +++ b/files/utils.go @@ -5,7 +5,7 @@ import ( "unicode/utf8" ) -func isBinary(content []byte, _ int) bool { +func isBinary(content []byte) bool { maybeStr := string(content) runeCnt := utf8.RuneCount(content) runeIndex := 0