diff --git a/appview/pages/pages.go b/appview/pages/pages.go index d5bb68bb..6697ffa3 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -260,6 +260,10 @@ func (p *Pages) executeRepo(name string, w io.Writer, params any) error { return p.executeOrReload(name, w, "layouts/repobase", params) } +func (p *Pages) Favicon(w io.Writer) error { + return p.executePlain("favicon", w, nil) +} + type LoginParams struct { ReturnUrl string } diff --git a/appview/pages/templates/favicon.html b/appview/pages/templates/favicon.html new file mode 100644 index 00000000..a042c3fe --- /dev/null +++ b/appview/pages/templates/favicon.html @@ -0,0 +1,26 @@ +{{ define "favicon" }} + + + + + + + + +{{ end }} diff --git a/appview/pages/templates/layouts/topbar.html b/appview/pages/templates/layouts/topbar.html index 43590160..adfc8ddb 100644 --- a/appview/pages/templates/layouts/topbar.html +++ b/appview/pages/templates/layouts/topbar.html @@ -2,7 +2,7 @@ - + tangledalpha diff --git a/appview/state/router.go b/appview/state/router.go index 2e546a79..81eea64b 100644 --- a/appview/state/router.go +++ b/appview/state/router.go @@ -32,6 +32,9 @@ func (s *State) Router() http.Handler { s.pages, ) + router.Get("/favicon.svg", s.Favicon) + router.Get("/favicon.ico", s.Favicon) + router.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) { pat := chi.URLParam(r, "*") if strings.HasPrefix(pat, "did:") || strings.HasPrefix(pat, "@") { diff --git a/appview/state/state.go b/appview/state/state.go index e2df9ee6..e09e67ed 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -157,6 +157,19 @@ func Make(ctx context.Context, config *config.Config) (*State, error) { return state, nil } +func (s *State) Favicon(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "image/svg+xml") + w.Header().Set("Cache-Control", "public, max-age=31536000") // one year + w.Header().Set("ETag", `"favicon-svg-v1"`) + + if match := r.Header.Get("If-None-Match"); match == `"favicon-svg-v1"` { + w.WriteHeader(http.StatusNotModified) + return + } + + s.pages.Favicon(w) +} + func (s *State) TermsOfService(w http.ResponseWriter, r *http.Request) { user := s.oauth.GetUser(r) s.pages.TermsOfService(w, pages.TermsOfServiceParams{