-
Notifications
You must be signed in to change notification settings - Fork 3
/
error.go
172 lines (158 loc) · 4.2 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
//|------------------------------------------------------------------
//| __
//| __/ \
//| __/ \__/_
//| / \__/ \
//|/\__/CellGo /_
//|\/_/NetFW__/ \
//| /\__ _/ \__/
//| \/_/ \__/_/
//| /\__/_/
//| \/_/
//| ------------------------------------------------------------------
//| Cellgo Framework error type
//| All rights reserved: By cellgo.cn CopyRight
//| You are free to use the source code, but in the use of the process,
//| please keep the author information. Respect for the work of others
//| is respect for their own
//|-------------------------------------------------------------------
// Author:Tommy.Jin Dtime:2016-7-23
package cellgo
import (
"fmt"
"html/template"
"log"
"net/http"
"reflect"
"strings"
)
//Type numbers
const (
errHandlerType = iota
errControllerType
errOtherType
)
// Error type.
type Error struct {
// ErrMaps holds map of http handlers for each errorcode string.
// error(40x and 50x)
ErrMaps map[string]*errInfo
}
// Error Handler type or controller type or Other type.
type errInfo struct {
controllerType reflect.Type
otherType reflect.Type
handler http.HandlerFunc
errCode string
errType int
}
var (
// Error is the Error handling type for Cellgo
CellError *Error
)
func init() {
CellError = &Error{ErrMaps: make(map[string]*errInfo, 10)}
CellError.registerHandlers()
}
// register Command and handle function
func (err *Error) registerHandlers() {
m := map[string]func(http.ResponseWriter, *http.Request){
"404": err.notFound,
"500": err.serverInternalError,
}
for e, h := range m {
if _, ok := err.ErrMaps[e]; !ok {
err.ErrHandler(e, h)
}
}
}
//Set errorCode with errorFunc
// CellError.ErrHandler("404",notFound)
// CellError.ErrHandler("500",serverInternalError)
func (err *Error) ErrHandler(code string, h http.HandlerFunc) *Core {
err.ErrMaps[code] = &errInfo{
errType: errHandlerType,
handler: h,
errCode: code,
}
return CellCore
}
//Set controllerFunc with errorFunc
// CellError.ErrController(&controllers.ErrController{})
func (err *Error) ErrController(c ControllerInterface) *Core {
reflectVal := reflect.ValueOf(c)
rt := reflectVal.Type()
ct := reflect.Indirect(reflectVal).Type()
for i := 0; i < rt.NumMethod(); i++ {
methodName := rt.Method(i).Name
if strings.HasPrefix(methodName, "Error") {
errName := strings.TrimPrefix(methodName, "Error")
err.ErrMaps[errName] = &errInfo{
errType: errControllerType,
controllerType: ct,
errCode: methodName,
}
}
}
return CellCore
}
//Print error && panic
func (err *Error) FailOnError(errs error, msg string) {
if errs != nil {
log.Fatalf("%s: %s", msg, errs)
panic(fmt.Sprintf("%s: %s", msg, errs))
}
}
var errtpl = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>{{.Title}}</title>
</head>
<body>
<div id="wrapper">
<div id="container">
<div class="navtop">
<h1>{{.Title}}</h1>
</div>
<div id="content">
{{.Content}}
<a href="/" title="Home" class="button">Go Home</a><br />
<br>Powered by cellgo {{.Version}}
</div>
</div>
</div>
</body>
</html>
`
// show 404 notfound error.
func (err *Error) notFound(rw http.ResponseWriter, r *http.Request) {
t, _ := template.New("cellgoerrortemp").Parse(errtpl)
data := map[string]interface{}{
"Title": http.StatusText(404),
"Version": VERSION,
}
data["Content"] = template.HTML("<br>The page you have requested has flown the coop." +
"<br>Perhaps you are here because:" +
"<br><br><ul>" +
"<br>The page has moved" +
"<br>The page no longer exists" +
"<br>You were looking for your puppy and got lost" +
"<br>You like 404 pages" +
"</ul>")
t.Execute(rw, data)
}
// show 500 internal server error.
func (err *Error) serverInternalError(rw http.ResponseWriter, r *http.Request) {
t, _ := template.New("beegoerrortemp").Parse(errtpl)
data := map[string]interface{}{
"Title": http.StatusText(500),
"Version": VERSION,
}
data["Content"] = template.HTML("<br>The page you have requested is down right now." +
"<br><br><ul>" +
"<br>Please try again later and report the error to the website administrator" +
"<br></ul>")
t.Execute(rw, data)
}