From c60c40c65d2e19531c047ca2736f3206199249a8 Mon Sep 17 00:00:00 2001 From: Oleg Gordienko Date: Wed, 28 Sep 2016 16:28:27 +0000 Subject: [PATCH] Check that client can accept gzip, check if '.gz' file exist and serve it. --- domain.go | 58 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/domain.go b/domain.go index 46f57ed02..ce92c2834 100644 --- a/domain.go +++ b/domain.go @@ -22,12 +22,31 @@ type domain struct { } func (d *domain) serveFile(w http.ResponseWriter, r *http.Request, fullPath string) error { - // Open and serve content of file - file, err := os.Open(fullPath) - if err != nil { - return err + // gzipped file exist and readable + file, err := os.Open(fullPath + ".gz") + if err == nil { + defer file.Close() + + // Client accept gzip + if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { + // Add response header about compression + w.Header().Set("Content-Encoding", "gzip") + } else { + // Open and serve content of file + file, err := os.Open(fullPath) + if err != nil { + return err + } + defer file.Close() + } + } else { + // Open and serve content of file + file, err := os.Open(fullPath) + if err != nil { + return err + } + defer file.Close() } - defer file.Close() fi, err := file.Stat() if err != nil { @@ -40,12 +59,31 @@ func (d *domain) serveFile(w http.ResponseWriter, r *http.Request, fullPath stri } func (d *domain) serveCustomFile(w http.ResponseWriter, r *http.Request, code int, fullPath string) error { - // Open and serve content of file - file, err := os.Open(fullPath) - if err != nil { - return err + // gzipped file exist and readable + file, err := os.Open(fullPath + ".gz") + if err == nil { + defer file.Close() + + // Client accept gzip + if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { + // Add response header about compression + w.Header().Set("Content-Encoding", "gzip") + } else { + // Open and serve content of file + file, err := os.Open(fullPath) + if err != nil { + return err + } + defer file.Close() + } + } else { + // Open and serve content of file + file, err := os.Open(fullPath) + if err != nil { + return err + } + defer file.Close() } - defer file.Close() fi, err := file.Stat() if err != nil { -- GitLab