httpserve

simple static HTTP server
git clone git://git.rr3.xyz/httpserve
Log | Files | Refs | README | LICENSE

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 }