From d96115325a18c62b86f044a3aa7dcb836dfbbb10 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Fri, 25 Dec 2020 13:57:26 -0800 Subject: [PATCH] Add file helper --- router/router_server_files.go | 7 +++--- server/filesystem/filesystem.go | 39 +++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/router/router_server_files.go b/router/router_server_files.go index 8cd7a6d..eca7390 100644 --- a/router/router_server_files.go +++ b/router/router_server_files.go @@ -22,7 +22,7 @@ import ( // Returns the contents of a file on the server. func getServerFileContents(c *gin.Context) { - s := GetServer(c.Param("server")) + s := ExtractServer(c) f, err := url.QueryUnescape(c.Query("file")) if err != nil { WithError(c, err) @@ -31,7 +31,7 @@ func getServerFileContents(c *gin.Context) { p := "/" + strings.TrimLeft(f, "/") st, err := s.Filesystem().Stat(p) if err != nil { - NewServerError(err, s).AbortFilesystemError(c) + WithError(c, err) return } @@ -55,9 +55,10 @@ func getServerFileContents(c *gin.Context) { // happen since we're doing so much before this point that would normally throw an error if there // was a problem with the file. if err := s.Filesystem().Readfile(p, c.Writer); err != nil { - NewServerError(err, s).AbortFilesystemError(c) + WithError(c, err) return } + c.Writer.Flush() } // Returns the contents of a directory for a server. diff --git a/server/filesystem/filesystem.go b/server/filesystem/filesystem.go index a135dbd..01c8361 100644 --- a/server/filesystem/filesystem.go +++ b/server/filesystem/filesystem.go @@ -50,29 +50,36 @@ func (fs *Filesystem) Path() string { return fs.root } +// Returns a reader for a file instance. +func (fs *Filesystem) File(p string) (*os.File, os.FileInfo, error) { + cleaned, err := fs.SafePath(p) + if err != nil { + return nil, nil, err + } + st, err := os.Stat(cleaned) + if err != nil { + return nil, nil, err + } + if st.IsDir() { + return nil, nil, &Error{code: ErrCodeIsDirectory} + } + f, err := os.Open(cleaned) + if err != nil { + return nil, nil, err + } + return f, st, nil +} + // Reads a file on the system and returns it as a byte representation in a file // reader. This is not the most memory efficient usage since it will be reading the // entirety of the file into memory. func (fs *Filesystem) Readfile(p string, w io.Writer) error { - cleaned, err := fs.SafePath(p) + file, _, err := fs.File(p) if err != nil { return err } - - if st, err := os.Stat(cleaned); err != nil { - return err - } else if st.IsDir() { - return &Error{code: ErrCodeIsDirectory} - } - - f, err := os.Open(cleaned) - if err != nil { - return err - } - defer f.Close() - - _, err = bufio.NewReader(f).WriteTo(w) - + defer file.Close() + _, err = bufio.NewReader(file).WriteTo(w) return err }