Go WebserverΒΆ

Web server function (can run as goroutine):

func Webserver(address string) {
    logger.Printf("Starting webserver at %s\n", address)

    activeHandler := ActiveHandler{ args }

    http.Handle("/bin/", http.StripPrefix("/bin", activeHandler))
    http.Handle("/static/", http.StripPrefix("/static", staticHandler))
    http.Handle("/", templateHandler)
    err := http.ListenAndServe(address, nil)
    if err != nil {
        panic(err)
    }
}

Handler to serve some embedded static files:

var (
    //go:embed something.js
    somethingjs []byte
    //go:embed image.png
    image_png []byte
)
type StaticHandler struct {
    urlToPage map[string]StaticPage
}

type StaticPage struct {
    bits        []byte
    contentType string
}

var staticHandler = StaticHandler{
    urlToPage: map[string]StaticPage{
        "/something.js":         {somethingjs, "application/javascript"},
        "/image.png": {image_png, "image/png"},
    },
}

func (h StaticHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    //logger.Printf("StaticHandler.ServeHTTP('%v')\n", req.URL.Path)
    page, ok := h.urlToPage[req.URL.Path]
    if ok {
        w.Header().Set("content-type", page.contentType)
        _, err := w.Write(page.bits)
        if err != nil {
            logger.Print(err)
        }
    } else {
        logger.Printf("StaticHandler.ServeHTTP('%v') => 404\n", req.URL.Path)
        http.NotFound(w, req)
    }
}

Return data as JSON:

func ReturnDataAsJSON(w http.ResponseWriter, data any) {
    jsonData := misc.ToJSON(data)
    w.Header().Add(http.CanonicalHeaderKey("content-type"), "application/json")
    w.WriteHeader(http.StatusOK)
    _, err := w.Write(jsonData)
    misc.Check(err)
}