···3232 s.pages,3333 )34343535+ router.Get("/favicon.svg", s.Favicon)3636+ router.Get("/favicon.ico", s.Favicon)3737+3538 router.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) {3639 pat := chi.URLParam(r, "*")3740 if strings.HasPrefix(pat, "did:") || strings.HasPrefix(pat, "@") {
+13
appview/state/state.go
···157157 return state, nil158158}159159160160+func (s *State) Favicon(w http.ResponseWriter, r *http.Request) {161161+ w.Header().Set("Content-Type", "image/svg+xml")162162+ w.Header().Set("Cache-Control", "public, max-age=31536000") // one year163163+ w.Header().Set("ETag", `"favicon-svg-v1"`)164164+165165+ if match := r.Header.Get("If-None-Match"); match == `"favicon-svg-v1"` {166166+ w.WriteHeader(http.StatusNotModified)167167+ return168168+ }169169+170170+ s.pages.Favicon(w)171171+}172172+160173func (s *State) TermsOfService(w http.ResponseWriter, r *http.Request) {161174 user := s.oauth.GetUser(r)162175 s.pages.TermsOfService(w, pages.TermsOfServiceParams{