/
handler_get_image.go
92 lines (81 loc) · 2.24 KB
/
handler_get_image.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"net/http"
"time"
"github.com/julienschmidt/httprouter"
"github.com/sirupsen/logrus"
"github.com/tokubai/kinu/logger"
"github.com/tokubai/kinu/resizer"
"github.com/tokubai/kinu/resource"
"github.com/tokubai/kinu/storage"
)
func GetImageHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
err := SetContentType(w, ps.ByName("filename"))
if err != nil {
if err == ErrInvalidImageExt {
RespondBadRequest(w, err.Error())
} else {
RespondInternalServerError(w, err)
}
return
}
request, err := NewImageGetRequest(ps)
if err != nil {
if _, ok := err.(*resizer.ErrInvalidGeometry); ok {
RespondBadRequest(w, err.Error())
} else if _, ok := err.(*resizer.ErrInvalidGeometryOrderRequest); ok {
RespondNotFound(w)
} else {
RespondInternalServerError(w, err)
}
return
}
targetResource := resource.New(request.Category, request.Id)
imageFetchStartTime := time.Now()
image, err := targetResource.Fetch(request.Geometry)
if err != nil {
if err == storage.ErrImageNotFound {
RespondNotFound(w)
} else if err == resource.ErrOriginalImageNotFound {
RespondNotFound(w)
} else {
RespondInternalServerError(w, err)
}
return
}
logger.TrackResult("fetch image from storage", imageFetchStartTime)
if request.Geometry.NeedsOriginalImage && !request.Geometry.NeedsManualCrop {
RespondImage(w, image.Body)
return
}
if len(request.Geometry.MiddleImageSize) != 0 {
RespondImage(w, image.Body)
return
}
resizeStartTime := time.Now()
resizeOption := request.Geometry.ToResizeOption()
resizeOption.SizeHintHeight = image.Height
resizeOption.SizeHintWidth = image.Width
resizeOption.SourceContentType = image.ContentType
resizeOption.Format = request.Extension
resizedImage, err := resizer.Run(image.Body, resizeOption)
if err != nil {
if err == resizer.ErrTooManyRunningResizeWorker {
RespondServiceUnavailable(w, err)
} else {
RespondInternalServerError(w, err)
}
return
}
logger.TrackResult("resize image", resizeStartTime)
if request.Extension == "data" {
RespondDataURI(w, resizedImage)
} else {
RespondImage(w, resizedImage)
}
logger.WithFields(logrus.Fields{
"path": r.URL.Path,
"params": r.URL.Query(),
"method": r.Method,
}).Info("success")
}