forked from h2non/imaginary
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherror.go
132 lines (116 loc) · 3.46 KB
/
error.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"encoding/json"
"fmt"
"net/http"
"strings"
bimg "gopkg.in/h2non/bimg.v1"
)
const (
Unavailable uint8 = iota
BadRequest
NotAllowed
Unsupported
Unauthorized
InternalError
NotFound
NotImplemented
Forbidden
NotAcceptable
)
var (
ErrNotFound = NewError("Not found", NotFound)
ErrInvalidApiKey = NewError("Invalid or missing API key", Unauthorized)
ErrMethodNotAllowed = NewError("Method not allowed", NotAllowed)
ErrUnsupportedMedia = NewError("Unsupported media type", Unsupported)
ErrOutputFormat = NewError("Unsupported output image format", BadRequest)
ErrEmptyBody = NewError("Empty image", BadRequest)
ErrMissingParamFile = NewError("Missing required param: file", BadRequest)
ErrInvalidFilePath = NewError("Invalid file path", BadRequest)
ErrInvalidImageURL = NewError("Invalid image URL", BadRequest)
ErrMissingImageSource = NewError("Cannot process the image due to missing or invalid params", BadRequest)
ErrNotImplemented = NewError("Not implemented endpoint", NotImplemented)
ErrInvalidURLSignature = NewError("Invalid URL signature", BadRequest)
ErrURLSignatureMismatch = NewError("URL signature mismatch", Forbidden)
)
type Error struct {
Message string `json:"message,omitempty"`
Code uint8 `json:"code"`
}
func (e Error) JSON() []byte {
buf, _ := json.Marshal(e)
return buf
}
func (e Error) Error() string {
return e.Message
}
func (e Error) HTTPCode() int {
if e.Code == BadRequest {
return http.StatusBadRequest
}
if e.Code == NotAllowed {
return http.StatusMethodNotAllowed
}
if e.Code == Unsupported {
return http.StatusUnsupportedMediaType
}
if e.Code == InternalError {
return http.StatusInternalServerError
}
if e.Code == Unauthorized {
return http.StatusUnauthorized
}
if e.Code == NotFound {
return http.StatusNotFound
}
if e.Code == NotImplemented {
return http.StatusNotImplemented
}
if e.Code == Forbidden {
return http.StatusForbidden
}
if e.Code == NotAcceptable {
return http.StatusNotAcceptable
}
return http.StatusServiceUnavailable
}
func NewError(err string, code uint8) Error {
err = strings.Replace(err, "\n", "", -1)
return Error{err, code}
}
func replyWithPlaceholder(req *http.Request, w http.ResponseWriter, err Error, o ServerOptions) error {
image := o.PlaceholderImage
// Resize placeholder to expected output
buf, _err := bimg.Resize(o.PlaceholderImage, bimg.Options{
Force: true,
Crop: true,
Enlarge: true,
Width: parseInt(req.URL.Query().Get("width")),
Height: parseInt(req.URL.Query().Get("height")),
Type: ImageType(req.URL.Query().Get("type")),
})
if _err != nil {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(fmt.Sprintf("{\"error\":\"%s\", \"code\": %d}", _err.Error(), BadRequest)))
return _err
}
// Use final response body image
image = buf
// Placeholder image response
w.Header().Set("Content-Type", GetImageMimeType(bimg.DetermineImageType(image)))
w.Header().Set("Error", string(err.JSON()))
w.WriteHeader(err.HTTPCode())
w.Write(image)
return err
}
func ErrorReply(req *http.Request, w http.ResponseWriter, err Error, o ServerOptions) error {
// Reply with placeholder if required
if o.EnablePlaceholder || o.Placeholder != "" {
return replyWithPlaceholder(req, w, err, o)
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(err.HTTPCode())
w.Write(err.JSON())
return err
}