From 7dde1e145cf2bd895f1d19bb65f0ba52a9a27aa5 Mon Sep 17 00:00:00 2001 From: Varun Patil Date: Fri, 17 Mar 2023 14:06:54 -0700 Subject: [PATCH] Add temp post support --- main.go | 26 +++++++++++++++++++++++--- manager.go | 3 +++ temp.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 temp.go diff --git a/main.go b/main.go index d8f8578b..858e7f7c 100644 --- a/main.go +++ b/main.go @@ -37,39 +37,58 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { url := r.URL.Path parts := make([]string, 0) + // log.Println("Serving", url) + + // Break url into parts for _, part := range strings.Split(url, "/") { if part != "" { parts = append(parts, part) } } + // Serve actual file from manager if len(parts) < 3 { log.Println("Invalid URL", url) w.WriteHeader(http.StatusBadRequest) return } + // Get streamid and chunk streamid := parts[0] path := "/" + strings.Join(parts[1:len(parts)-1], "/") chunk := parts[len(parts)-1] - // log.Println("Serving", path, streamid, chunk) + // Check if POST request to create temp file + if r.Method == "POST" && len(parts) >= 2 && parts[1] == "create" { + var err error + path, err = h.createTempFile(w, r, parts) + if err != nil { + return + } + } - if streamid == "" || chunk == "" || path == "" { + // Check if valid + if streamid == "" || path == "" { w.WriteHeader(http.StatusBadRequest) return } + // Get existing manager or create new one manager := h.getManager(path, streamid) if manager == nil { manager = h.createManager(path, streamid) } + // Failed to create manager if manager == nil { w.WriteHeader(http.StatusInternalServerError) return } - manager.ServeHTTP(w, r, chunk) + + // Serve chunk if asked for + if chunk != "" && chunk != "ignore" { + manager.ServeHTTP(w, r, chunk) + } } func (h *Handler) getManager(path string, streamid string) *Manager { @@ -87,6 +106,7 @@ func (h *Handler) createManager(path string, streamid string) *Manager { manager, err := NewManager(h.c, path, streamid, h.close) if err != nil { log.Println("Error creating manager", err) + freeIfTemp(path) return nil } diff --git a/manager.go b/manager.go index 254bcf68..f9a8dee7 100644 --- a/manager.go +++ b/manager.go @@ -157,6 +157,9 @@ func (m *Manager) Destroy() { // Delete temp dir os.RemoveAll(m.tempDir) + + // Delete file if temp + freeIfTemp(m.path) } func (m *Manager) ServeHTTP(w http.ResponseWriter, r *http.Request, chunk string) error { diff --git a/temp.go b/temp.go new file mode 100644 index 00000000..4a40fc52 --- /dev/null +++ b/temp.go @@ -0,0 +1,49 @@ +package main + +import ( + "encoding/json" + "io/ioutil" + "log" + "net/http" + "os" + "strings" +) + +func (h *Handler) createTempFile(w http.ResponseWriter, r *http.Request, parts []string) (string, error) { + streamid := parts[0] + body, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Println("Error reading body", err) + w.WriteHeader(http.StatusInternalServerError) + return "", err + } + + // Create temporary file + file, err := ioutil.TempFile(h.c.TempDir, streamid+"-govod-temp-") + if err != nil { + log.Println("Error creating temp file", err) + w.WriteHeader(http.StatusInternalServerError) + return "", err + } + defer file.Close() + + // Write data to file + if _, err := file.Write(body); err != nil { + log.Println("Error writing to temp file", err) + w.WriteHeader(http.StatusInternalServerError) + return "", err + } + + // Return full path to file in JSON + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"path": file.Name()}) + + // Return path to file + return file.Name(), nil +} + +func freeIfTemp(path string) { + if strings.Contains(path, "-govod-temp-") { + os.Remove(path) + } +}