From f679cd3785f3c8109c1700c9b7a331c5fc1e3ffc Mon Sep 17 00:00:00 2001 From: Knut Ahlers Date: Mon, 13 May 2019 00:05:06 +0200 Subject: [PATCH] Force bootstrap to apply gzip encoding Signed-off-by: Knut Ahlers --- http.go | 2 +- main.go | 7 ++++--- upload.go | 30 +++++++++++++++++++++++++----- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/http.go b/http.go index 7a9f0b5..88bafee 100644 --- a/http.go +++ b/http.go @@ -19,7 +19,7 @@ func simpleFilePost(res http.ResponseWriter, r *http.Request) { return } - url, err := executeUpload(fh.Filename, f, true, "") + url, err := executeUpload(fh.Filename, f, true, "", false) if err != nil { log.WithError(err).Error("Uploading file from HTTP request failed") http.Error(res, "Failed to upload file. For details see the log.", http.StatusInternalServerError) diff --git a/main.go b/main.go index 25c05bb..5bfe926 100644 --- a/main.go +++ b/main.go @@ -9,8 +9,9 @@ import ( "io" "os" - "github.com/Luzifer/rconfig" log "github.com/sirupsen/logrus" + + "github.com/Luzifer/rconfig" ) var ( @@ -98,7 +99,7 @@ func doCLIUpload() error { inFile = inFileHandle } - url, err := executeUpload(inFileName, inFile, true, cfg.ContentType) + url, err := executeUpload(inFileName, inFile, true, cfg.ContentType, false) if err != nil { return fmt.Errorf("Unable to upload file: %s", err) } @@ -109,7 +110,7 @@ func doCLIUpload() error { func doBootstrap() error { for _, asset := range []string{"index.html", "app.js"} { - if _, err := executeUpload(asset, bytes.NewReader(MustAsset("frontend/"+asset)), false, ""); err != nil { + if _, err := executeUpload(asset, bytes.NewReader(MustAsset("frontend/"+asset)), false, "", true); err != nil { return fmt.Errorf("Unable to upload bootstrap asset %q: %s", asset, err) } } diff --git a/upload.go b/upload.go index bc1fab7..5207975 100644 --- a/upload.go +++ b/upload.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "compress/gzip" "crypto/sha1" "fmt" "html/template" @@ -16,10 +17,11 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/cheggaaa/pb" + "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) -func executeUpload(inFileName string, inFileHandle io.ReadSeeker, useCalculatedFilename bool, overrideMimeType string) (string, error) { +func executeUpload(inFileName string, inFileHandle io.ReadSeeker, useCalculatedFilename bool, overrideMimeType string, forceGzip bool) (string, error) { var ( upFile = inFileName err error @@ -42,6 +44,23 @@ func executeUpload(inFileName string, inFileHandle io.ReadSeeker, useCalculatedF log.Debugf("Uploading file to %q with type %q", upFile, mimeType) + var contentEncoding *string + if forceGzip { + buf := new(bytes.Buffer) + gw := gzip.NewWriter(buf) + + if _, err := io.Copy(gw, inFileHandle); err != nil { + return "", errors.Wrap(err, "Unable to compress file") + } + + if err := gw.Close(); err != nil { + return "", errors.Wrap(err, "Unable to close gzip writer") + } + + inFileHandle = bytes.NewReader(buf.Bytes()) + contentEncoding = aws.String("gzip") + } + sess := session.Must(session.NewSession()) svc := s3.New(sess) @@ -69,10 +88,11 @@ func executeUpload(inFileName string, inFileHandle io.ReadSeeker, useCalculatedF } if _, err := svc.PutObject(&s3.PutObjectInput{ - Body: ps, - Bucket: aws.String(cfg.Bucket), - ContentType: aws.String(mimeType), - Key: aws.String(upFile), + Body: ps, + Bucket: aws.String(cfg.Bucket), + ContentEncoding: contentEncoding, + ContentType: aws.String(mimeType), + Key: aws.String(upFile), }); err != nil { return "", err }