From af80d889aff6a70fc69ce1947b302fdb8b557b82 Mon Sep 17 00:00:00 2001 From: Andrea Spacca Date: Wed, 16 Jan 2019 19:58:11 +0100 Subject: [PATCH] support range header --- server/handlers.go | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/server/handlers.go b/server/handlers.go index 02ab05a..8c8a937 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -274,18 +274,18 @@ func (s *Server) postHandler(w http.ResponseWriter, r *http.Request) { return } + var file *os.File var reader io.Reader if n > _24K { - file, err := ioutil.TempFile(s.tempPath, "transfer-") + file, err = ioutil.TempFile(s.tempPath, "transfer-") if err != nil { log.Fatal(err) } - defer file.Close() n, err = io.Copy(file, io.MultiReader(&b, f)) if err != nil { - os.Remove(file.Name()) + cleanTmpFile(file) log.Printf("%s", err.Error()) http.Error(w, err.Error(), 500) @@ -305,10 +305,14 @@ func (s *Server) postHandler(w http.ResponseWriter, r *http.Request) { if err := json.NewEncoder(buffer).Encode(metadata); err != nil { log.Printf("%s", err.Error()) http.Error(w, errors.New("Could not encode metadata").Error(), 500) + + cleanTmpFile(file) return } else if err := s.storage.Put(token, fmt.Sprintf("%s.metadata", filename), buffer, "text/json", uint64(buffer.Len())); err != nil { log.Printf("%s", err.Error()) http.Error(w, errors.New("Could not save metadata").Error(), 500) + + cleanTmpFile(file) return } @@ -323,10 +327,19 @@ func (s *Server) postHandler(w http.ResponseWriter, r *http.Request) { relativeURL, _ := url.Parse(path.Join(token, filename)) fmt.Fprintln(w, getURL(r).ResolveReference(relativeURL).String()) + + cleanTmpFile(file) } } } +func cleanTmpFile(f *os.File) { + if f != nil { + f.Close() + os.Remove(f.Name()) + } +} + type Metadata struct { // ContentType is the original uploading content type ContentType string @@ -393,19 +406,20 @@ func (s *Server) putHandler(w http.ResponseWriter, r *http.Request) { return } + var file *os.File + if n > _24K { - file, err := ioutil.TempFile(s.tempPath, "transfer-") + file, err = ioutil.TempFile(s.tempPath, "transfer-") if err != nil { log.Printf("%s", err.Error()) http.Error(w, err.Error(), 500) return } - defer file.Close() + defer cleanTmpFile(file) n, err = io.Copy(file, io.MultiReader(&b, f)) if err != nil { - os.Remove(file.Name()) log.Printf("%s", err.Error()) http.Error(w, err.Error(), 500) return @@ -884,11 +898,24 @@ func (s *Server) getHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Disposition", fmt.Sprintf("%s; filename=\"%s\"", disposition, filename)) w.Header().Set("Connection", "keep-alive") - if _, err = io.Copy(w, reader); err != nil { + file, err := ioutil.TempFile(s.tempPath, "range-") + if err != nil { + log.Printf("%s", err.Error()) + http.Error(w, "Error occurred copying to output stream", 500) + return + } + + defer cleanTmpFile(file) + + tee := io.TeeReader(reader, file) + _, err = ioutil.ReadAll(tee) + if err != nil { log.Printf("%s", err.Error()) http.Error(w, "Error occurred copying to output stream", 500) return } + + http.ServeContent(w, r, filename, time.Now(), file) } func (s *Server) RedirectHandler(h http.Handler) http.HandlerFunc {