diff --git a/domain.go b/domain.go index 46f57ed028d6795228ffeb558c3e5c74c710a58e..ce92c2834293fe7f476fc21ac344acd58e27261b 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 {