main.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "log/slog"
  7. "net"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. "github.com/TecharoHQ/anubis/internal"
  13. "github.com/facebookgo/flagenv"
  14. )
  15. var (
  16. dir = flag.String("dir", ".", "directory to serve")
  17. slogLevel = flag.String("slog-level", "info", "logging level")
  18. socketPath = flag.String("socket-path", "./unixhttpd.sock", "unix socket path to use")
  19. )
  20. func init() {
  21. flag.Usage = func() {
  22. fmt.Fprintf(os.Stderr, "Usage of %s:\n", filepath.Base(os.Args[0]))
  23. fmt.Fprintf(os.Stderr, " %s [--dir=.] [--socket-path=./unixhttpd.sock]\n\n", filepath.Base(os.Args[0]))
  24. flag.PrintDefaults()
  25. os.Exit(2)
  26. }
  27. }
  28. func main() {
  29. flagenv.Parse()
  30. flag.Parse()
  31. internal.InitSlog(*slogLevel)
  32. if *dir == "" && *socketPath == "" {
  33. flag.Usage()
  34. }
  35. slog.Info("starting up", "dir", *dir, "socketPath", *socketPath)
  36. os.Remove(*socketPath)
  37. mux := http.NewServeMux()
  38. mux.HandleFunc("/reqmeta", func(w http.ResponseWriter, r *http.Request) {
  39. contains := strings.Contains(r.Header.Get("Accept"), "text/html")
  40. if contains {
  41. w.Header().Add("Content-Type", "text/html")
  42. fmt.Fprint(w, "<pre id=\"main\"><code>")
  43. }
  44. r.Write(w)
  45. if contains {
  46. fmt.Fprintln(w, "</pre></code>")
  47. }
  48. })
  49. mux.Handle("/", http.FileServer(http.Dir(*dir)))
  50. server := http.Server{
  51. Handler: mux,
  52. }
  53. unixListener, err := net.Listen("unix", *socketPath)
  54. if err != nil {
  55. panic(err)
  56. }
  57. log.Fatal(server.Serve(unixListener))
  58. }