diff --git a/hscontrol/handlers.go b/hscontrol/handlers.go index d52b4d50..87d69038 100644 --- a/hscontrol/handlers.go +++ b/hscontrol/handlers.go @@ -286,12 +286,16 @@ func FaviconHandler(writer http.ResponseWriter, req *http.Request) { http.ServeContent(writer, req, "favicon.ico", time.Unix(0, 0), bytes.NewReader(favicon)) } -// Returns a blank page with favicon linked. +// BlankHandler returns a blank page with favicon linked. func BlankHandler(writer http.ResponseWriter, res *http.Request) { writer.Header().Set("Content-Type", "text/html; charset=utf-8") - io.WriteString(writer, ` -
- - - `) + writer.WriteHeader(http.StatusOK) + + _, err := writer.Write([]byte(templates.BlankPage().Render())) + if err != nil { + log.Error(). + Caller(). + Err(err). + Msg("Failed to write HTTP response") + } } diff --git a/hscontrol/templates/general.go b/hscontrol/templates/general.go index 2d3ea791..f779063e 100644 --- a/hscontrol/templates/general.go +++ b/hscontrol/templates/general.go @@ -14,8 +14,6 @@ var headscaleCSS string //go:embed headscale.svg var headscaleSVG string - - // mdTypesetBody creates a body element with md-typeset styling // that matches the official Headscale documentation design. // Uses CSS classes with styles defined in headscaleCSS. @@ -191,8 +189,8 @@ func HtmlStructure(head, body *elem.Element) *elem.Element { }), // Google Fonts for Roboto and Roboto Mono elem.Link(attrs.Props{ - attrs.Rel: "preconnect", - attrs.Href: "https://fonts.gstatic.com", + attrs.Rel: "preconnect", + attrs.Href: "https://fonts.gstatic.com", "crossorigin": "", }), elem.Link(attrs.Props{ @@ -206,3 +204,20 @@ func HtmlStructure(head, body *elem.Element) *elem.Element { body, ) } + +// BlankPage creates a minimal blank HTML page with favicon. +// Used for endpoints that need to return a valid HTML page with no content. +func BlankPage() *elem.Element { + return elem.Html(attrs.Props{attrs.Lang: "en"}, + elem.Head(nil, + elem.Meta(attrs.Props{ + attrs.Charset: "UTF-8", + }), + elem.Link(attrs.Props{ + attrs.Rel: "icon", + attrs.Href: "/favicon.ico", + }), + ), + elem.Body(nil), + ) +}