sfu/handlers.go

103 lines
2.9 KiB
Go

package main
import (
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"time"
)
func downloadFile(w http.ResponseWriter, req *http.Request, fileName string) {
Info.Println(fmt.Sprintf("server: will download %v", 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.Println(fmt.Sprintf("server: will delete %v", fileName))
if !fileExists(fileName) {
Error.Println(fmt.Sprintf("%v does not exist", 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.Println(fmt.Sprintf("file %v already exists", fileHeader.Filename))
http.Error(w, "File already exists", http.StatusConflict)
return
}
if !fileExists || (forceOverwrite == "true" && fileExists) {
Info.Println(fmt.Sprintf("server: will upload %v", 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)
return
}
func listFiles(w http.ResponseWriter, req *http.Request) {
Info.Println(fmt.Sprintf("server: will list uploaded files on %v", SFU_FILES_DIR))
files, err := ioutil.ReadDir(SFU_FILES_DIR)
if err != nil {
Warning.Println(fmt.Sprintf("%v does not exist", SFU_FILES_DIR))
Info.Println(fmt.Sprintf("will create %v", 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>")
}