From 428192275bb104b173c8d9499b352e1da0c676e3 Mon Sep 17 00:00:00 2001 From: Benny Date: Fri, 12 Feb 2021 16:13:13 +0800 Subject: [PATCH] choose webp or png feature (#70) * support webp_bigger header, add test cases * fix test case --- config.go | 6 +- encoder_test.go | 28 +++++---- helper.go | 36 +++++++++-- helper_test.go | 6 +- pics/big.jpg | Bin 0 -> 78260 bytes prefetch_test.go | 9 ++- router.go | 161 ++++++++++++++++++++++++----------------------- router_test.go | 21 ++++++- update.go | 3 +- update_test.go | 9 +++ 10 files changed, 171 insertions(+), 108 deletions(-) create mode 100644 pics/big.jpg diff --git a/config.go b/config.go index 2c30063..706aa8d 100644 --- a/config.go +++ b/config.go @@ -22,11 +22,7 @@ var ( remoteRaw = "remote-raw" config Config version = "0.3.2" -) - -const ( - NotCompressed = "not_compressed" - WebpBigger = "webp_bigger" + releaseUrl = "https://github.com/webp-sh/webp_server_go/releases/latest/download/" ) const ( diff --git a/encoder_test.go b/encoder_test.go index ad49257..693baf2 100644 --- a/encoder_test.go +++ b/encoder_test.go @@ -8,7 +8,17 @@ import ( "testing" ) -//go test -v -cover . +func walker() []string { + var list []string + _ = filepath.Walk("./pics", func(path string, info os.FileInfo, err error) error { + if !info.IsDir() { + list = append(list, path) + } + return nil + }) + return list +} + func TestWebpEncoder(t *testing.T) { var webp = "/tmp/test-result.webp" var target = walker() @@ -25,24 +35,18 @@ func TestWebpEncoder(t *testing.T) { _ = os.Remove(webp) } -func TestNonImage(t *testing.T) { +func TestNonExistImage(t *testing.T) { var webp = "/tmp/test-result.webp" // test error var err = webpEncoder("./pics/empty.jpg", webp, 80, true, nil) assert.NotNil(t, err) _ = os.Remove(webp) - } -func walker() []string { - var list []string - _ = filepath.Walk("./pics", func(path string, info os.FileInfo, err error) error { - if !info.IsDir() { - list = append(list, path) - } - return nil - }) - return list +func TestConvertFail(t *testing.T) { + var webp = "/tmp/test-result.webp" + var err = webpEncoder("./pics/webp_server.jpg", webp, -1, true, nil) + assert.NotNil(t, t, err) } func runEncoder(t *testing.T, file string, webp string) { diff --git a/helper.go b/helper.go index 88a9372..7a9eb5f 100644 --- a/helper.go +++ b/helper.go @@ -9,6 +9,7 @@ import ( "os" "path" "path/filepath" + "strconv" "strings" @@ -32,6 +33,9 @@ func fileCount(dir string) int { count := 0 _ = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } if !info.IsDir() { count += 1 } @@ -50,22 +54,24 @@ func imageExists(filename string) bool { } // Check for remote filepath, e.g: https://test.webp.sh/node.png -// return StatusCode, etagValue -func getRemoteImageInfo(fileUrl string) (int, string) { +// return StatusCode, etagValue and length +func getRemoteImageInfo(fileUrl string) (int, string, string) { res, err := http.Head(fileUrl) if err != nil { log.Errorln("Connection to remote error!") - return http.StatusInternalServerError, "" + return http.StatusInternalServerError, "", "" } if res.StatusCode != 404 { etagValue := res.Header.Get("etag") if etagValue == "" { log.Info("Remote didn't return etag in header, please check.") } else { - return 200, etagValue + return 200, etagValue, res.Header.Get("content-length") } } - return res.StatusCode, "" + + return res.StatusCode, "", res.Header.Get("content-length") + } func fetchRemoteImage(filepath string, url string) error { @@ -184,3 +190,23 @@ func headerOrigin(header string) bool { return true } } + +func chooseProxy(proxyRawSize string, webpAbsPath string) bool { + var proxyRaw, _ = strconv.Atoi(proxyRawSize) + webp, _ := ioutil.ReadFile(webpAbsPath) + if len(webp) > proxyRaw { + return true + } else { + return false + } +} + +func chooseLocalSmallerFile(rawImageAbs, webpAbsPath string) string { + raw, _ := ioutil.ReadFile(rawImageAbs) + webp, _ := ioutil.ReadFile(webpAbsPath) + if len(webp) > len(raw) { + return rawImageAbs + } else { + return webpAbsPath + } +} diff --git a/helper_test.go b/helper_test.go index 309e73c..8af14f5 100644 --- a/helper_test.go +++ b/helper_test.go @@ -177,14 +177,16 @@ func TestChanErr(t *testing.T) { func TestGetRemoteImageInfo(t *testing.T) { url := "https://github.com/favicon.ico" - statusCode, etag := getRemoteImageInfo(url) + statusCode, etag, length := getRemoteImageInfo(url) assert.NotEqual(t, "", etag) + assert.NotEqual(t, "0", length) assert.Equal(t, statusCode, http.StatusOK) // test non-exist url url = "http://sdahjajda.com" - statusCode, etag = getRemoteImageInfo(url) + statusCode, etag, length = getRemoteImageInfo(url) assert.Equal(t, "", etag) + assert.Equal(t, "", length) assert.Equal(t, statusCode, http.StatusInternalServerError) } diff --git a/pics/big.jpg b/pics/big.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46c6c38da801ca11f0fc09f27d5bdc1eb5e6835e GIT binary patch literal 78260 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∾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 - localEtagImagePath := config.ExhaustPath + reqURI + "-etag-" + etagValue - if imageExists(localEtagImagePath) { - return c.SendFile(localEtagImagePath) - } else { - // Temporary store of remote file. - cleanProxyCache(config.ExhaustPath + reqURI + "*") - localRemoteTmpPath := remoteRaw + reqURI - _ = fetchRemoteImage(localRemoteTmpPath, realRemoteAddr) - q, _ := strconv.ParseFloat(config.Quality, 32) - _ = os.MkdirAll(path.Dir(localEtagImagePath), 0755) - err := webpEncoder(localRemoteTmpPath, localEtagImagePath, float32(q), true, nil) - if err != nil { - log.Warning(err) - } - return c.SendFile(localEtagImagePath) - } - } else { - msg := fmt.Sprintf("Remote returned %d status code!", statusCode) - _ = c.Send([]byte(msg)) - log.Warn(msg) - _ = c.SendStatus(statusCode) - cleanProxyCache(config.ExhaustPath + reqURI + "*") - return errors.New(msg) - } - // End Proxy Mode + return proxyHandler(c, reqURI) + } + + // Check the original image for existence, + if !imageExists(rawImageAbs) { + msg := "image not found" + _ = c.Send([]byte(msg)) + log.Warn(msg) + _ = c.SendStatus(404) + return errors.New(msg) + } + + _, webpAbsPath := genWebpAbs(rawImageAbs, config.ExhaustPath, imgFilename, reqURI) + + if imageExists(webpAbsPath) { + finalFile = webpAbsPath } else { - // Check the original image for existence, - if !imageExists(rawImageAbs) { - msg := "image not found" - _ = c.Send([]byte(msg)) - log.Warn(msg) - _ = c.SendStatus(404) - return errors.New(msg) - } - - _, webpAbsPath := genWebpAbs(rawImageAbs, config.ExhaustPath, imgFilename, reqURI) - - if imageExists(webpAbsPath) { - finalFile = webpAbsPath + // we don't have abc.jpg.png1582558990.webp + // delete the old pic and convert a new one. + // /home/webp_server/exhaust/path/to/tsuki.jpg.1582558990.webp + destHalfFile := path.Clean(path.Join(webpAbsPath, path.Dir(reqURI), imgFilename)) + matches, err := filepath.Glob(destHalfFile + "*") + if err != nil { + log.Error(err.Error()) } else { - // we don't have abc.jpg.png1582558990.webp - // delete the old pic and convert a new one. - // /home/webp_server/exhaust/path/to/tsuki.jpg.1582558990.webp - destHalfFile := path.Clean(path.Join(webpAbsPath, path.Dir(reqURI), imgFilename)) - matches, err := filepath.Glob(destHalfFile + "*") - if err != nil { - log.Error(err.Error()) - } else { - // /home/webp_server/exhaust/path/to/tsuki.jpg.1582558100.webp <- older ones will be removed - // /home/webp_server/exhaust/path/to/tsuki.jpg.1582558990.webp <- keep the latest one - for _, p := range matches { - if strings.Compare(destHalfFile, p) != 0 { - _ = os.Remove(p) - } + // /home/webp_server/exhaust/path/to/tsuki.jpg.1582558100.webp <- older ones will be removed + // /home/webp_server/exhaust/path/to/tsuki.jpg.1582558990.webp <- keep the latest one + for _, p := range matches { + if strings.Compare(destHalfFile, p) != 0 { + _ = os.Remove(p) } } - - //for webp, we need to create dir first - err = os.MkdirAll(path.Dir(webpAbsPath), 0755) - q, _ := strconv.ParseFloat(config.Quality, 32) - err = webpEncoder(rawImageAbs, webpAbsPath, float32(q), true, nil) - - if err != nil { - log.Error(err) - _ = c.SendStatus(400) - _ = c.Send([]byte("Bad file. " + err.Error())) - return err - } - finalFile = webpAbsPath } - etag := genEtag(finalFile) - c.Set("ETag", etag) - c.Set("X-Compression-Rate", getCompressionRate(rawImageAbs, webpAbsPath)) - return c.SendFile(finalFile) + + //for webp, we need to create dir first + err = os.MkdirAll(path.Dir(webpAbsPath), 0755) + q, _ := strconv.ParseFloat(config.Quality, 32) + err = webpEncoder(rawImageAbs, webpAbsPath, float32(q), true, nil) + + if err != nil { + log.Error(err) + _ = c.SendStatus(400) + _ = c.Send([]byte("Bad file. " + err.Error())) + return err + } + finalFile = webpAbsPath + } + etag := genEtag(finalFile) + c.Set("ETag", etag) + c.Set("X-Compression-Rate", getCompressionRate(rawImageAbs, webpAbsPath)) + finalFile = chooseLocalSmallerFile(rawImageAbs, webpAbsPath) + return c.SendFile(finalFile) + +} + +func proxyHandler(c *fiber.Ctx, reqURI string) error { + // https://test.webp.sh/node.png + realRemoteAddr := config.ImgPath + reqURI + // Ping Remote for status code and etag info + log.Infof("Remote Addr is %s fetching", realRemoteAddr) + statusCode, etagValue, remoteLength := getRemoteImageInfo(realRemoteAddr) + if statusCode == 200 { + // Check local path: /node.png-etag- + localEtagWebPPath := config.ExhaustPath + reqURI + "-etag-" + etagValue + if imageExists(localEtagWebPPath) { + chooseProxy(remoteLength, localEtagWebPPath) + return c.SendFile(localEtagWebPPath) + } else { + // Temporary store of remote file. + cleanProxyCache(config.ExhaustPath + reqURI + "*") + localRawImagePath := remoteRaw + reqURI + _ = fetchRemoteImage(localRawImagePath, realRemoteAddr) + q, _ := strconv.ParseFloat(config.Quality, 32) + _ = os.MkdirAll(path.Dir(localEtagWebPPath), 0755) + err := webpEncoder(localRawImagePath, localEtagWebPPath, float32(q), true, nil) + if err != nil { + log.Warning(err) + } + chooseProxy(remoteLength, localEtagWebPPath) + return c.SendFile(localEtagWebPPath) + } + } else { + msg := fmt.Sprintf("Remote returned %d status code!", statusCode) + _ = c.Send([]byte(msg)) + log.Warn(msg) + _ = c.SendStatus(statusCode) + cleanProxyCache(config.ExhaustPath + reqURI + "*") + return errors.New(msg) } } diff --git a/router_test.go b/router_test.go index 67e3032..10a3eea 100644 --- a/router_test.go +++ b/router_test.go @@ -10,6 +10,7 @@ import ( "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" ) @@ -21,7 +22,7 @@ var ( func setupParam() { // setup parameters here... config.ImgPath = "./pics" - config.ExhaustPath = "./exhaust" + config.ExhaustPath = "./exhaust_test" config.AllowedTypes = []string{"jpg", "png", "jpeg", "bmp"} proxyMode = false @@ -55,7 +56,6 @@ func TestServerHeaders(t *testing.T) { ratio = response.Header.Get("X-Compression-Rate") etag = response.Header.Get("Etag") - assert.Equal(t, NotCompressed, ratio) assert.NotEqual(t, "", etag) } @@ -156,3 +156,20 @@ func TestConvertProxyModeWork(t *testing.T) { assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, "image/jpeg", getFileContentType(data)) } + +func TestConvertBigger(t *testing.T) { + setupParam() + config.Quality = "100" + + jpg, _ := ioutil.ReadFile("pics/big.jpg") + + var app = fiber.New() + app.Get("/*", convert) + + url := "http://127.0.0.1:3333/big.jpg" + response, data := requestToServer(url, app, chromeUA) + assert.Equal(t, "image/jpeg", response.Header.Get("content-type")) + assert.True(t, len(data) == len(jpg)) + + _ = os.RemoveAll(config.ExhaustPath) +} diff --git a/update.go b/update.go index 1a1afab..ee73861 100644 --- a/update.go +++ b/update.go @@ -41,9 +41,8 @@ func autoUpdate() { if runtime.GOOS == "windows" { filename += ".exe" } - var releaseUrl = "https://github.com/webp-sh/webp_server_go/releases/latest/download/" + filename log.Info("Downloading binary to update...") - resp, _ := http.Get(releaseUrl) + resp, _ := http.Get(releaseUrl + filename) if resp.StatusCode != 200 { log.Debugf("%s-%s not found on release.", runtime.GOOS, runtime.GOARCH) return diff --git a/update_test.go b/update_test.go index e50cc12..e757999 100644 --- a/update_test.go +++ b/update_test.go @@ -18,6 +18,15 @@ func TestNormalAutoUpdate(t *testing.T) { _ = os.RemoveAll(dir) } +func Test404AutoUpdate(t *testing.T) { + version = "0.0.1" + dir := "./update" + releaseUrl = releaseUrl + "a" + autoUpdate() + assert.Equal(t, 0, fileCount(dir)) + _ = os.RemoveAll(dir) +} + func TestNoNeedAutoUpdate(t *testing.T) { version = "99.99" dir := "./update"