Browse Source

more efficient client side gzip compression

pull/922/head
Chris Lu 6 years ago
parent
commit
174bf1e8b2
  1. 37
      weed/operation/compress.go
  2. 17
      weed/operation/upload_content.go

37
weed/operation/compress.go

@ -16,45 +16,58 @@ import (
*/
func IsGzippable(ext, mtype string, data []byte) bool {
shouldBeZipped, iAmSure := IsGzippableFileType(ext, mtype)
if iAmSure {
return shouldBeZipped
}
isMostlyText := util.IsText(data)
return isMostlyText
}
/*
* Default more not to gzip since gzip can be done on client side.
*/
func IsGzippableFileType(ext, mtype string) (shouldBeZipped, iAmSure bool) {
// text
if strings.HasPrefix(mtype, "text/") {
return true
return true, true
}
// images
switch ext {
case ".svg", ".bmp":
return true
return true, true
}
if strings.HasPrefix(mtype, "image/") {
return false
return false, true
}
// by file name extension
switch ext {
case ".zip", ".rar", ".gz", ".bz2", ".xz":
return false
return false, true
case ".pdf", ".txt", ".html", ".htm", ".css", ".js", ".json":
return true
return true, true
case ".php", ".java", ".go", ".rb", ".c", ".cpp", ".h", ".hpp":
return true
return true, true
case ".png", ".jpg", ".jpeg":
return false
return false, true
}
// by mime type
if strings.HasPrefix(mtype, "application/") {
if strings.HasSuffix(mtype, "xml") {
return true
return true, true
}
if strings.HasSuffix(mtype, "script") {
return true
return true, true
}
}
isMostlyText := util.IsText(data)
return isMostlyText
return false, false
}
func GzipData(input []byte) ([]byte, error) {

17
weed/operation/upload_content.go

@ -2,6 +2,7 @@ package operation
import (
"bytes"
"compress/gzip"
"encoding/json"
"errors"
"fmt"
@ -39,10 +40,24 @@ var fileNameEscaper = strings.NewReplacer("\\", "\\\\", "\"", "\\\"")
// Upload sends a POST request to a volume server to upload the content
func Upload(uploadUrl string, filename string, reader io.Reader, isGzipped bool, mtype string, pairMap map[string]string, jwt security.EncodedJwt) (*UploadResult, error) {
contentIsGzipped := isGzipped
shouldGzipNow := false
if !isGzipped {
if shouldBeZipped, iAmSure := IsGzippableFileType(filepath.Base(filename), mtype); iAmSure && shouldBeZipped {
shouldGzipNow = true
contentIsGzipped = true
}
}
return upload_content(uploadUrl, func(w io.Writer) (err error) {
if shouldGzipNow {
gzWriter := gzip.NewWriter(w)
_, err = io.Copy(gzWriter, reader)
gzWriter.Close()
} else {
_, err = io.Copy(w, reader)
}
return
}, filename, isGzipped, mtype, pairMap, jwt)
}, filename, contentIsGzipped, mtype, pairMap, jwt)
}
func upload_content(uploadUrl string, fillBufferFunction func(w io.Writer) error, filename string, isGzipped bool, mtype string, pairMap map[string]string, jwt security.EncodedJwt) (*UploadResult, error) {
body_buf := bytes.NewBufferString("")

Loading…
Cancel
Save