package main import ( "embed" "flag" "fmt" "html/template" "log" "net/http" "net/http/httputil" "net/url" "time" ) var ( port = flag.Int("port", 42069, "port to listen on") https = flag.Bool("https", false, "use https") ) func index(w http.ResponseWriter, _ *http.Request) { fmt.Fprint(w, ` roseh.moe

Hello world

`) } //go:embed templates/404.html.template var notFoundString string var notFoundTemplate = template.Must(template.New("notFound").Parse(notFoundString)) func notFound(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) type args struct { Path string } if err := notFoundTemplate.Execute(w, args{Path: r.URL.Path}); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } //go:embed static var static embed.FS func main() { flag.Parse() mux := http.NewServeMux() jellyfinURL, err := url.Parse("http://localhost:8096") if err != nil { log.Fatalf("Jellyfin URL: %s", err) } mux.Handle("/cinema/", httputil.NewSingleHostReverseProxy(jellyfinURL)) mux.Handle("/static/", http.FileServerFS(static)) mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { index(w, r) } else { notFound(w, r) } }) httpServer := http.Server{ Addr: fmt.Sprintf(":%d", *port), Handler: mux, ReadHeaderTimeout: 5 * time.Second, WriteTimeout: 5 * time.Second, } log.Printf("Listening on %q", httpServer.Addr) if *https { log.Fatal(httpServer.ListenAndServeTLS("/var/lib/acme/roseh.moe/cert.pem", "/var/lib/acme/roseh.moe/key.pem")) } else { log.Fatal(httpServer.ListenAndServe()) } }