package main
import (
"flag"
"io/fs"
"log"
"net"
"net/http"
"net/http/cgi"
"os"
"os/signal"
"strconv"
"strings"
)
func main() {
path := flag.String("path", "", "Path to the cgi binary")
dir := flag.String("dir", "", "set a different working directory from the base path of 'path'")
env := flag.String("env", "", "set environment variables for the CGI process")
prefix := flag.String("uri-prefix", "/", "set the URL prefix when the CGI process is hosted in a sub directory")
socketMode := flag.String("mode", "777", "set the filesystem mode when using a unix socket")
addr := flag.String("listen", "127.0.0.1:8080", "set the listen address")
flag.Parse()
listenAddr := *addr
listenType := "unix"
switch listenAddr[0] {
case ':', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
listenType = "tcp"
}
if listenType == "unix" {
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
<-c
os.Remove(listenAddr)
os.Exit(0)
}()
}
l, err := net.Listen(listenType, listenAddr)
if err != nil {
log.Fatalf("could not start to listen: %s", err)
}
if listenType == "unix" {
mode, err := strconv.ParseUint(*socketMode, 8, 32)
if err != nil {
log.Fatalf("could not parse mode: %s", err)
}
log.Printf("what we parsed: %s", fs.FileMode(mode))
os.Chmod(listenAddr, fs.FileMode(mode))
}
forwarder := &cgi.Handler{
Path: *path,
Root: *prefix,
Env: strings.Split(*env, ","),
Dir: *dir,
}
http.Handle("/", forwarder)
log.Printf("server stopped working: %s", http.Serve(l, nil))
}