Skip to content

Instantly share code, notes, and snippets.

@pnck
Created February 22, 2023 00:43
Show Gist options
  • Save pnck/a1ad81e5d3ee25839a46f267ea95aa69 to your computer and use it in GitHub Desktop.
Save pnck/a1ad81e5d3ee25839a46f267ea95aa69 to your computer and use it in GitHub Desktop.
simplest webdav server
//go run main.go -p 8080
package main
import (
"errors"
"flag"
"fmt"
"log"
"net"
"net/http"
"os"
"path/filepath"
"golang.org/x/net/webdav"
)
const (
_mode_ip = 1
_mode_unix = iota
)
func main() {
var address string
var sockFile string
var servePath string
var servePrefix string
flag.StringVar(&sockFile, "s", "", "unix domain socket file to listen on")
flag.StringVar(&address, "a", "", "address to listen to")
flag.StringVar(&servePath, "d", ".", "directory as the webdav root")
flag.StringVar(&servePrefix, "P", "/", "webdav server prefix (used when reverse proxied by nginx)")
flag.Parse()
servePath, err := filepath.Abs(servePath)
if err != nil {
panic(err)
}
handler := &webdav.Handler{
Prefix: servePrefix,
FileSystem: webdav.Dir(servePath),
LockSystem: webdav.NewMemLS(),
Logger: func(r *http.Request, err error) {
if err != nil {
log.Printf("WEBDAV [%s]: %s, ERROR: %s\n", r.Method, r.URL, err)
} else {
log.Printf("WEBDAV [%s]: %s \n", r.Method, r.URL)
}
},
}
serve_ip := func() {
fmt.Printf("serve %s at %s\n", servePath, address)
http.ListenAndServe(address, handler)
}
serve_unix := func() {
sockFile, err = filepath.Abs(sockFile)
if err != nil {
panic(err)
}
if _, err = os.Stat(sockFile); err == nil {
err = os.Remove(sockFile)
}
if errors.Is(err, os.ErrNotExist) {
err = nil
}
if err != nil {
panic(err)
}
server := http.Server{Handler: handler}
listener, err := net.Listen("unix", sockFile)
if err != nil {
panic(err)
}
os.Chmod(sockFile, 0777)
fmt.Printf("serve %s on unix:%s\n", servePath, sockFile)
server.Serve(listener)
}
serve := serve_ip
serveMode := _mode_ip
if address != "" && sockFile != "" {
panic("-s and -a flag confilicts.")
}
if sockFile != "" {
serve = serve_unix
serveMode = _mode_unix
}
if serveMode == _mode_ip && address == "" {
address = "localhost:8080"
}
serve()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment