httpserve.go (1154B)
1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "golang.org/x/sys/unix" 7 "log" 8 "net" 9 "net/http" 10 "os" 11 "os/signal" 12 ) 13 14 func main() { 15 flag.Usage = func() { 16 format := `Usage: %[1]s tcp [HOST]:[PORT] ROOT 17 %[1]s unix PATH ROOT 18 ` 19 fmt.Fprintf(os.Stderr, format, os.Args[0]) 20 os.Exit(1) 21 } 22 23 flag.Parse() 24 args := flag.Args() 25 if len(args) != 3 || (args[0] != "tcp" && args[0] != "unix") { 26 flag.Usage() 27 } 28 29 network := args[0] 30 address := args[1] 31 root := args[2] 32 33 // We catch termination signals so that we can properly close the socket. 34 // We must register the signal channel before calling net.Listen to avoid 35 // a race condition. 36 sigs := make(chan os.Signal, 3) 37 signal.Notify(sigs, unix.SIGINT, unix.SIGQUIT, unix.SIGTERM) 38 39 listener, err := net.Listen(network, address) 40 if err != nil { 41 log.Fatal(err) 42 } 43 defer listener.Close() 44 45 serveErr := make(chan error, 1) 46 go func () { 47 log.Printf("serving %s on %s\n", root, listener.Addr()) 48 serveErr <- http.Serve(listener, http.FileServer(http.Dir(root))) 49 }() 50 51 select { 52 case err := <-serveErr: 53 log.Print(err) 54 case sig := <-sigs: 55 log.Printf("received signal %s; terminating\n", sig) 56 } 57 }