From aa32bd335c4c6ff3a50aad0b029571465469452b Mon Sep 17 00:00:00 2001 From: Azareal Date: Thu, 12 Mar 2020 16:52:26 +1000 Subject: [PATCH] try to avoid as many upfront gzip allocs to avoid wasting resources when they're not needed avoid gzip for guests on routeAPI --- common/theme.go | 1 + gen_router.go | 17 +++++------------ router_gen/main.go | 9 +++------ router_gen/route_impl.go | 4 +--- routes.go | 28 ++++++++++------------------ 5 files changed, 20 insertions(+), 39 deletions(-) diff --git a/common/theme.go b/common/theme.go index c7937903..5bb78cbd 100644 --- a/common/theme.go +++ b/common/theme.go @@ -307,6 +307,7 @@ func (t *Theme) RunTmpl(template string, pi interface{}, w io.Writer) error { gzw, ok := w.(GzipResponseWriter) if ok { w = gzw.Writer + gzw.Header().Set("Content-Type", "text/html;charset=utf-8") } getTmpl := t.GetTmpl(template) diff --git a/gen_router.go b/gen_router.go index 9b5aee81..697c35fe 100644 --- a/gen_router.go +++ b/gen_router.go @@ -788,13 +788,13 @@ func NewWriterIntercept(w http.ResponseWriter) *WriterIntercept { } var wiMaxAge = "max-age=" + strconv.Itoa(int(c.Day)) -func (writ *WriterIntercept) WriteHeader(code int) { +func (wi *WriterIntercept) WriteHeader(code int) { if code == 200 { - h := writ.ResponseWriter.Header() + h := wi.ResponseWriter.Header() h.Set("Cache-Control", wiMaxAge) h.Set("Vary", "Accept-Encoding") } - writ.ResponseWriter.WriteHeader(code) + wi.ResponseWriter.WriteHeader(code) } // HTTPSRedirect is a connection handler which redirects all HTTP requests to HTTPS @@ -1202,7 +1202,6 @@ func (r *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { if prefix != "/ws" && strings.Contains(req.Header.Get("Accept-Encoding"), "gzip") { h := w.Header() h.Set("Content-Encoding", "gzip") - h.Set("Content-Type", "text/html;charset=utf-8") gzw := c.GzipResponseWriter{Writer: gzip.NewWriter(w), ResponseWriter: w} defer func() { if h.Get("Content-Encoding") == "gzip" && h.Get("X-I") == "" { @@ -1277,9 +1276,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c gzw, ok := w.(c.GzipResponseWriter) if ok { w = gzw.ResponseWriter - h := w.Header() - h.Del("Content-Type") - h.Del("Content-Encoding") + w.Header().Del("Content-Encoding") } err = routes.ShowAttachment(w,req,user,extraData) co.RouteViewCounter.Bump3(6, cn) @@ -1845,9 +1842,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c gzw, ok := w.(c.GzipResponseWriter) if ok { w = gzw.ResponseWriter - h := w.Header() - h.Del("Content-Type") - h.Del("Content-Encoding") + w.Header().Del("Content-Encoding") } err = panel.Backups(w,req,user,extraData) co.RouteViewCounter.Bump3(89, cn) @@ -2736,7 +2731,6 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c if ok { w = gzw.ResponseWriter h := w.Header() - h.Del("Content-Type") h.Del("Content-Encoding") } req.URL.Path += extraData @@ -2756,7 +2750,6 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c if ok { w = gzw.ResponseWriter h := w.Header() - h.Del("Content-Type") h.Del("Content-Encoding") } req.URL.Path = "/s/favicon.ico" diff --git a/router_gen/main.go b/router_gen/main.go index 1dec6210..d122dc6b 100644 --- a/router_gen/main.go +++ b/router_gen/main.go @@ -472,13 +472,13 @@ func NewWriterIntercept(w http.ResponseWriter) *WriterIntercept { } var wiMaxAge = "max-age=" + strconv.Itoa(int(c.Day)) -func (writ *WriterIntercept) WriteHeader(code int) { +func (wi *WriterIntercept) WriteHeader(code int) { if code == 200 { - h := writ.ResponseWriter.Header() + h := wi.ResponseWriter.Header() h.Set("Cache-Control", wiMaxAge) h.Set("Vary", "Accept-Encoding") } - writ.ResponseWriter.WriteHeader(code) + wi.ResponseWriter.WriteHeader(code) } // HTTPSRedirect is a connection handler which redirects all HTTP requests to HTTPS @@ -886,7 +886,6 @@ func (r *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { if prefix != "/ws" && strings.Contains(req.Header.Get("Accept-Encoding"), "gzip") { h := w.Header() h.Set("Content-Encoding", "gzip") - h.Set("Content-Type", "text/html;charset=utf-8") gzw := c.GzipResponseWriter{Writer: gzip.NewWriter(w), ResponseWriter: w} defer func() { if h.Get("Content-Encoding") == "gzip" && h.Get("X-I") == "" { @@ -928,7 +927,6 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c if ok { w = gzw.ResponseWriter h := w.Header() - h.Del("Content-Type") h.Del("Content-Encoding") } req.URL.Path += extraData @@ -948,7 +946,6 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c if ok { w = gzw.ResponseWriter h := w.Header() - h.Del("Content-Type") h.Del("Content-Encoding") } req.URL.Path = "/s/favicon.ico" diff --git a/router_gen/route_impl.go b/router_gen/route_impl.go index 19ad1e17..66a8b7cf 100644 --- a/router_gen/route_impl.go +++ b/router_gen/route_impl.go @@ -63,9 +63,7 @@ func (r *RouteImpl) NoGzip() *RouteImpl { return r.LitBeforeMultiline(`gzw, ok := w.(c.GzipResponseWriter) if ok { w = gzw.ResponseWriter - h := w.Header() - h.Del("Content-Type") - h.Del("Content-Encoding") + w.Header().Del("Content-Encoding") }`) } diff --git a/routes.go b/routes.go index a5c879c4..1d75e842 100644 --- a/routes.go +++ b/routes.go @@ -72,20 +72,15 @@ func routeAPI(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError // TODO: Split this into it's own function case "alerts": // A feed of events tailored for a specific user if !user.Loggedin { - var etag string - /*_, ok := w.(c.GzipResponseWriter) + h := w.Header() + gzw, ok := w.(c.GzipResponseWriter) if ok { - etag = c.GzipStartEtag - } else { - etag = c.StartEtag - }*/ - _, ok := w.(c.GzipResponseWriter) - if ok { - etag = "\"1583653869-ng\"" - } else { - etag = "\"1583653869-n\"" + w = gzw.ResponseWriter + h.Del("Content-Encoding") } - w.Header().Set("ETag", etag) + etag := "\"1583653869-n\"" + //etag = c.StartEtag + h.Set("ETag", etag) if match := r.Header.Get("If-None-Match"); match != "" { if strings.Contains(match, etag) { w.WriteHeader(http.StatusNotModified) @@ -108,9 +103,7 @@ func routeAPI(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError gzw, ok := w.(c.GzipResponseWriter) if ok { w = gzw.ResponseWriter - h := w.Header() - h.Del("Content-Type") - h.Del("Content-Encoding") + w.Header().Del("Content-Encoding") } _, _ = io.WriteString(w, `{}`) return nil @@ -158,9 +151,7 @@ func routeAPI(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError gzw, ok := w.(c.GzipResponseWriter) if ok { w = gzw.ResponseWriter - h := w.Header() - h.Del("Content-Type") - h.Del("Content-Encoding") + w.Header().Del("Content-Encoding") } _, _ = io.WriteString(w, `{}`) return nil @@ -193,6 +184,7 @@ func routeAPI(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError sb.WriteString(`],"count":`) sb.WriteString(strconv.Itoa(count)) sb.WriteString(`,"tc":`) + //rCreatedAt sb.WriteString(strconv.Itoa(int(topCreatedAt))) sb.WriteRune('}')