package main import ( "flag" "io/ioutil" "log" "net" "net/http" "os" "syscall" ) type HelloServer struct { } func (HelloServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { data, err := ioutil.ReadAll(req.Body) if err != nil { log.Printf("%v", err) } log.Printf("request from %s, %s: %s, body %s", req.RemoteAddr, req.Method, req.RequestURI, string(data)) resp.WriteHeader(http.StatusOK) resp.Write([]byte("Hello server")) } func startUnixSocketServer(addr string) error { var l net.Listener var err error if addr != "" { log.Printf("listen on %s", addr) l, err = net.Listen("tcp", addr) } else { socket := "/run/test.sock" log.Printf("listen on %s", socket) l, err = newUnixSocket(socket) } if err != nil { return err } httpServer := &http.Server{Addr: addr} httpServer.Handler = HelloServer{} return httpServer.Serve(l) } func newUnixSocket(path string) (net.Listener, error) { if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) { return nil, err } mask := syscall.Umask(0777) defer syscall.Umask(mask) l, err := net.Listen("unix", path) if err != nil { return nil, err } return l, nil } // ./server # serve unix socket // ./server -address :80 # serve tcp 80 func main() { address := flag.String("address", "", "the address to listen") flag.Parse() log.Fatal(startUnixSocketServer(*address)) }