sophuwu.site > manhttpd   
              86
            
             package main

import (
	"bytes"
	_ "embed"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/exec"
	"strings"
)

//go:embed index.html
var index []byte

//go:embed font.css
var font []byte

//go:embed dark_theme.css
var css []byte

var CFG struct {
	Hostname   string
	ListenAddr string
	ListenPort string
	MANPATH    []string
}

func init() {
	CFG.Hostname, _ = os.Hostname()
	if CFG.Hostname == "" {
		os.Getenv("HOSTNAME")
	}
	CFG.ListenAddr = os.Getenv("ListenAddr")
	CFG.ListenPort = os.Getenv("ListenPort")
	if CFG.ListenAddr == "" || CFG.ListenPort == "" || CFG.Hostname == "" {
		log.Fatal("ListenAddr, ListenPort and Hostname must be set")
	}
	b, err := exec.Command("/usr/bin/manpath", "-g").Output()
	if err != nil {
		log.Fatal("Fatal: unable to get manpath")
	}
	CFG.MANPATH = strings.Split(string(b), ":")

	css = append(css, font...)
	index = bytes.ReplaceAll(index, []byte("{{ hostname }}"), []byte(CFG.Hostname))
	index = bytes.ReplaceAll(index, []byte("{{ port }}"), []byte(CFG.ListenPort))
}

func main() {
	http.HandleFunc("/style.css", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "text/css; charset=utf-8")
		w.Header().Set("Content-Length", fmt.Sprint(len(css)))
		w.WriteHeader(http.StatusOK)
		w.Write(css)
	})
	http.Handle("/favicon.ico", http.NotFoundHandler())
	http.HandleFunc("/", handler)
	http.ListenAndServe(CFG.ListenAddr+":"+CFG.ListenPort, nil)
}

func handler(w http.ResponseWriter, r *http.Request) {

	if r.URL.Path != "/" {
		http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
		return
	}

	_ = r.ParseForm()

	man := r.Form.Get("man")
	if man == "" {
		w.Header().Set("Content-Type", "text/html; charset=utf-8")
		w.WriteHeader(http.StatusOK)
		w.Write(index)
		return
	}

	// cmd := exec.Command(man)

	// b, _ := cmd.CombinedOutput()

	w.Header().Set("Content-Type", "text/html; charset=utf-8")
	w.WriteHeader(http.StatusOK)
}