Skip to content

Instantly share code, notes, and snippets.

@fufuok
Created May 8, 2021 08:19
Show Gist options
  • Save fufuok/a1ec3d5460ba73cd88f0d46ee43315cd to your computer and use it in GitHub Desktop.
Save fufuok/a1ec3d5460ba73cd88f0d46ee43315cd to your computer and use it in GitHub Desktop.
Simple file serve by mjibson
package main
import (
"flag"
"io"
"log"
"net/http"
"os"
"path/filepath"
)
var (
base = flag.String("base", ".", "base directory")
addr = flag.String("addr", ":1123", "HTTP listen address")
)
func main() {
flag.Parse()
sendErr := func(w http.ResponseWriter, r *http.Request, err string, code int) {
log.Printf("ERR: %s %s: %s", r.Method, r.URL.Path, err)
http.Error(w, err, code)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
localfile := filepath.Join(*base, r.URL.Path)
log.Printf("% 7s %s (%s)", r.Method, r.URL.Path, localfile)
switch r.Method {
case "PUT":
if err := os.MkdirAll(filepath.Dir(localfile), 0755); err != nil {
sendErr(w, r, err.Error(), 500)
return
}
f, err := os.Create(localfile)
if err != nil {
sendErr(w, r, err.Error(), 500)
return
}
defer f.Close()
if _, err := io.Copy(f, r.Body); err != nil {
sendErr(w, r, err.Error(), 500)
return
}
w.WriteHeader(201)
case "GET", "HEAD":
http.ServeFile(w, r, localfile)
case "DELETE":
if err := os.Remove(localfile); err != nil {
sendErr(w, r, err.Error(), 500)
return
}
w.WriteHeader(204)
default:
sendErr(w, r, "unsupported method", 400)
}
})
log.Printf("listening on %s", *addr)
log.Printf("basedir: %s", *base)
log.Fatal(http.ListenAndServe(*addr, nil))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment