sfu/handlers.go
cătălin e7a9ddc460
Some checks failed
continuous-integration/drone/push Build is failing
ci: add staticcheck job
2022-06-28 15:09:00 +02:00

102 lines
2.8 KiB
Go

package main
import (
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"time"
)
func downloadFile(w http.ResponseWriter, req *http.Request, fileName string) {
Info.Printf("server: will download %v\n", fileName)
file, err := os.Open(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileName))
if err != nil {
Error.Println(err)
http.Error(w, "File not found", http.StatusNotFound)
return
}
defer file.Close()
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%v", fileName))
http.ServeContent(w, req, fileName, time.Now(), file)
}
func fileExists(fileName string) bool {
_, err := os.Stat(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileName))
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
return false
}
func deleteFile(w http.ResponseWriter, req *http.Request, fileName string) {
Info.Printf("server: will delete %v\n", fileName)
if !fileExists(fileName) {
Error.Printf("%v does not exist\n", fileName)
http.Error(w, "File not found", http.StatusNotFound)
return
}
err := os.Remove(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileName))
if err != nil {
Error.Println(err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte("file deleted"))
}
func uploadFile(w http.ResponseWriter, req *http.Request) {
file, fileHeader, err := req.FormFile("file")
if err != nil {
Error.Println(err)
}
defer file.Close()
fileExists := fileExists(fileHeader.Filename)
forceOverwrite := req.FormValue("force")
if fileExists && forceOverwrite != "true" {
Error.Printf("file %v already exists\n", fileHeader.Filename)
http.Error(w, "File already exists", http.StatusConflict)
return
}
if !fileExists || (forceOverwrite == "true" && fileExists) {
Info.Printf("server: will upload %v\n", fileHeader.Filename)
out, err := os.Create(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileHeader.Filename))
if err != nil {
Error.Println(err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
Error.Println(err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusCreated)
w.Write([]byte("file uploaded"))
return
}
http.Error(w, "internal server error", http.StatusInternalServerError)
}
func listFiles(w http.ResponseWriter, req *http.Request) {
Info.Printf("server: will list uploaded files on %v\n", SFU_FILES_DIR)
files, err := ioutil.ReadDir(SFU_FILES_DIR)
if err != nil {
Warning.Printf("%v does not exist\n", SFU_FILES_DIR)
Info.Printf("will create %v\n", SFU_FILES_DIR)
_ = os.Mkdir(SFU_FILES_DIR, os.ModePerm)
}
fmt.Fprint(w, "<html><body><ol>")
for _, f := range files {
fmt.Fprintf(w, "<li><a href=\"%v\">%v</a></li>\n", f.Name(), f.Name())
}
fmt.Fprint(w, "</ol></body></html>")
}