api: allow gzipped response
This commit is contained in:
parent
9e682a964a
commit
78384073b0
@ -24,6 +24,8 @@ func parseConfig() error {
|
|||||||
|
|
||||||
"STATIC": binPath,
|
"STATIC": binPath,
|
||||||
|
|
||||||
|
"GZIP_STATIC": "false",
|
||||||
|
|
||||||
"SMTP_USERNAME": "",
|
"SMTP_USERNAME": "",
|
||||||
"SMTP_PASSWORD": "",
|
"SMTP_PASSWORD": "",
|
||||||
"SMTP_HOST": "",
|
"SMTP_HOST": "",
|
||||||
|
@ -37,3 +37,4 @@ var errorSessionAlreadyInUse = errors.New("Session is already in use.")
|
|||||||
var errorCannotReadResponse = errors.New("Cannot read response.")
|
var errorCannotReadResponse = errors.New("Cannot read response.")
|
||||||
var errorNotModerator = errors.New("You need to be a moderator to do that.")
|
var errorNotModerator = errors.New("You need to be a moderator to do that.")
|
||||||
var errorNotADirectory = errors.New("The given path is not a directory.")
|
var errorNotADirectory = errors.New("The given path is not a directory.")
|
||||||
|
var errorGzip = errors.New("Cannot GZip content.")
|
||||||
|
@ -25,7 +25,8 @@ type staticHtmlPlugs struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initStaticRouter(router *mux.Router) error {
|
func initStaticRouter(router *mux.Router) error {
|
||||||
asset := make(map[string]string)
|
asset := make(map[string][]byte)
|
||||||
|
gzippedAsset := make(map[string][]byte)
|
||||||
|
|
||||||
for _, dir := range []string{"js", "css", "images"} {
|
for _, dir := range []string{"js", "css", "images"} {
|
||||||
sl := string(os.PathSeparator)
|
sl := string(os.PathSeparator)
|
||||||
@ -52,12 +53,30 @@ func initStaticRouter(router *mux.Router) error {
|
|||||||
prefix += "window.commento_cdn='" + os.Getenv("CDN_PREFIX") + "';\n"
|
prefix += "window.commento_cdn='" + os.Getenv("CDN_PREFIX") + "';\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
asset[p] = prefix + string(contents)
|
gzip := (os.Getenv("GZIP_STATIC") == "true")
|
||||||
|
|
||||||
router.HandleFunc(p, func(w http.ResponseWriter, r *http.Request) {
|
asset[p] = []byte(prefix + string(contents))
|
||||||
w.Header().Set("Content-Type", mime.TypeByExtension(path.Ext(r.URL.Path)))
|
if gzip {
|
||||||
fmt.Fprint(w, asset[r.URL.Path])
|
gzippedAsset[p], err = gzipStatic(asset[p])
|
||||||
})
|
if err != nil {
|
||||||
|
logger.Errorf("error gzipping %s: %v", p, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// faster than checking inside the handler
|
||||||
|
if !gzip {
|
||||||
|
router.HandleFunc(p, func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", mime.TypeByExtension(path.Ext(r.URL.Path)))
|
||||||
|
w.Write(asset[r.URL.Path])
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
router.HandleFunc(p, func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", mime.TypeByExtension(path.Ext(r.URL.Path)))
|
||||||
|
w.Header().Set("Content-Encoding", "gzip")
|
||||||
|
w.Write(gzippedAsset[r.URL.Path])
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
18
api/utils_gzip.go
Normal file
18
api/utils_gzip.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"compress/gzip"
|
||||||
|
)
|
||||||
|
|
||||||
|
func gzipStatic(b []byte) ([]byte, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
g := gzip.NewWriter(&buf)
|
||||||
|
if _, err := g.Write(b); err != nil {
|
||||||
|
g.Close()
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
g.Close()
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user