package main
import (
"html/template"
"io"
"log"
"net/http"
"os"
"strings"
)
func uploadHandler(dir string, quiet bool) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
// µhttpd strong
w.Header().Set("Server", "uhttpd")
// we are handling the upload
if r.Method == "POST" {
// we need the input file named "file"
file, header, err := r.FormFile("file")
if err != nil {
w.WriteHeader(500)
w.Write([]byte(err.Error()))
log.Println("ERROR", err.Error())
return
}
defer file.Close()
if !strings.HasSuffix(dir, "/") {
dir = dir + "/"
}
// lets create the desired file
out, err := os.Create(dir + header.Filename)
if err != nil {
w.WriteHeader(500)
w.Write([]byte(err.Error()))
log.Println("ERROR", err.Error())
return
}
defer out.Close()
// copy the old file in the created one
_, err = io.Copy(out, file)
if err != nil {
w.WriteHeader(500)
w.Write([]byte(err.Error()))
log.Println("ERROR", err.Error())
return
}
// do not log upload
if !quiet {
log.Println(r.Method, r.URL.Path, header.Filename, r.RemoteAddr)
}
// print for cli client
if r.URL.Query().Get("html") != "1" {
w.Write([]byte("Uploaded: " + header.Filename))
return
}
// print for browser
w.Header().Set("Content-Type", "text/html")
tmpl := template.New("uploaded")
tmpl, err = tmpl.Parse(getUploaded())
if err != nil {
log.Println(err.Error())
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
err = tmpl.Execute(w, struct {
File string
Favicon template.HTML
}{File: header.Filename, Favicon: getFavicon()})
if err != nil {
log.Println(err.Error())
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
return
} else {
// we are just printing the upload form
w.Header().Set("Content-Type", "text/html")
tmpl := template.New("upload")
tmpl, err := tmpl.Parse(getUpload())
if err != nil {
log.Println(err.Error())
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
err = tmpl.Execute(w, struct{ Favicon template.HTML }{Favicon: getFavicon()})
if err != nil {
log.Println(err.Error())
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
return
}
}
return http.HandlerFunc(fn)
}