From c72c86a9210fa65562fb61312c0523785cc09f0a Mon Sep 17 00:00:00 2001 From: DarthSim Date: Sat, 7 Oct 2017 02:54:24 +0600 Subject: [PATCH] Precheck vips image types support --- download.go | 2 +- process.go | 51 +++++++++++++++++++++++++-------------------------- server.go | 2 +- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/download.go b/download.go index 2bb57fe2..7bb7099b 100644 --- a/download.go +++ b/download.go @@ -67,7 +67,7 @@ func checkTypeAndDimensions(r io.Reader) (imageType, error) { if imgconf.Width > conf.MaxSrcDimension || imgconf.Height > conf.MaxSrcDimension { return UNKNOWN, errors.New("File is too big") } - if !imgtypeOk || !vipsTypeSupportedLoad(imgtype) { + if !imgtypeOk || !vipsTypeSupportLoad[imgtype] { return UNKNOWN, errors.New("Source image type not supported") } diff --git a/process.go b/process.go index 5e93fd2e..9b2a6080 100644 --- a/process.go +++ b/process.go @@ -78,6 +78,8 @@ type processingOptions struct { } var vipsSupportSmartcrop bool +var vipsTypeSupportLoad = make(map[imageType]bool) +var vipsTypeSupportSave = make(map[imageType]bool) func initVips() { runtime.LockOSThread() @@ -97,6 +99,29 @@ func initVips() { } vipsSupportSmartcrop = C.vips_support_smartcrop() == 1 + + if int(C.vips_type_find_load_go(C.JPEG)) != 0 { + vipsTypeSupportLoad[JPEG] = true + } + if int(C.vips_type_find_load_go(C.PNG)) != 0 { + vipsTypeSupportLoad[PNG] = true + } + if int(C.vips_type_find_load_go(C.WEBP)) != 0 { + vipsTypeSupportLoad[WEBP] = true + } + if int(C.vips_type_find_load_go(C.GIF)) != 0 { + vipsTypeSupportLoad[GIF] = true + } + + if int(C.vips_type_find_save_go(C.JPEG)) != 0 { + vipsTypeSupportSave[JPEG] = true + } + if int(C.vips_type_find_save_go(C.PNG)) != 0 { + vipsTypeSupportSave[PNG] = true + } + if int(C.vips_type_find_save_go(C.WEBP)) != 0 { + vipsTypeSupportSave[WEBP] = true + } } func randomAccessRequired(po processingOptions) int { @@ -106,32 +131,6 @@ func randomAccessRequired(po processingOptions) int { return 0 } -func vipsTypeSupportedLoad(imgtype imageType) bool { - switch imgtype { - case JPEG: - return int(C.vips_type_find_load_go(C.JPEG)) != 0 - case PNG: - return int(C.vips_type_find_load_go(C.PNG)) != 0 - case WEBP: - return int(C.vips_type_find_load_go(C.WEBP)) != 0 - case GIF: - return int(C.vips_type_find_load_go(C.GIF)) != 0 - } - return false -} - -func vipsTypeSupportedSave(imgtype imageType) bool { - switch imgtype { - case JPEG: - return int(C.vips_type_find_save_go(C.JPEG)) != 0 - case PNG: - return int(C.vips_type_find_save_go(C.PNG)) != 0 - case WEBP: - return int(C.vips_type_find_save_go(C.WEBP)) != 0 - } - return false -} - func round(f float64) int { return int(f + .5) } diff --git a/server.go b/server.go index f0123946..e8595e8e 100644 --- a/server.go +++ b/server.go @@ -77,7 +77,7 @@ func parsePath(r *http.Request) (string, processingOptions, error) { return "", po, fmt.Errorf("Invalid image format: %s", filenameParts[1]) } - if !vipsTypeSupportedSave(po.format) { + if !vipsTypeSupportSave[po.format] { return "", po, errors.New("Resulting image type not supported") }