update middleware & beego's error
This commit is contained in:
		
							parent
							
								
									0da2059f79
								
							
						
					
					
						commit
						9f6b803a10
					
				
							
								
								
									
										9
									
								
								beego.go
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								beego.go
									
									
									
									
									
								
							| @ -1,6 +1,7 @@ | |||||||
| package beego | package beego | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"github.com/astaxie/beego/middleware" | ||||||
| 	"github.com/astaxie/beego/session" | 	"github.com/astaxie/beego/session" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"path" | 	"path" | ||||||
| @ -25,7 +26,7 @@ func AutoRouter(c ControllerInterface) *App { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Errorhandler(err string, h http.HandlerFunc) *App { | func Errorhandler(err string, h http.HandlerFunc) *App { | ||||||
| 	ErrorMaps[err] = h | 	middleware.Errorhandler(err, h) | ||||||
| 	return BeeApp | 	return BeeApp | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -78,6 +79,10 @@ func Run() { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	registerErrorHander() | 
 | ||||||
|  | 	middleware.VERSION = VERSION | ||||||
|  | 	middleware.AppName = AppName | ||||||
|  | 	middleware.RegisterErrorHander() | ||||||
|  | 
 | ||||||
| 	BeeApp.Run() | 	BeeApp.Run() | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										280
									
								
								errors.go
									
									
									
									
									
								
							
							
						
						
									
										280
									
								
								errors.go
									
									
									
									
									
								
							| @ -1,280 +0,0 @@ | |||||||
| package beego |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"html/template" |  | ||||||
| 	"net/http" |  | ||||||
| 	"runtime" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var tpl = ` |  | ||||||
| <!DOCTYPE html>  |  | ||||||
| <html>  |  | ||||||
| <head> |  | ||||||
|     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |  | ||||||
|     <title>beego application error</title> |  | ||||||
|     <style> |  | ||||||
|         html, body, body * {padding: 0; margin: 0;} |  | ||||||
|         #header {background:#ffd; border-bottom:solid 2px #A31515; padding: 20px 10px;} |  | ||||||
|         #header h2{ } |  | ||||||
|         #footer {border-top:solid 1px #aaa; padding: 5px 10px; font-size: 12px; color:green;} |  | ||||||
|         #content {padding: 5px;} |  | ||||||
|         #content .stack b{ font-size: 13px; color: red;} |  | ||||||
|         #content .stack pre{padding-left: 10px;} |  | ||||||
|         table {} |  | ||||||
|         td.t {text-align: right; padding-right: 5px; color: #888;} |  | ||||||
|     </style>  |  | ||||||
|     <script type="text/javascript"> |  | ||||||
|     </script> |  | ||||||
| </head>  |  | ||||||
| <body> |  | ||||||
|     <div id="header"> |  | ||||||
|         <h2>{{.AppError}}</h2> |  | ||||||
|     </div> |  | ||||||
|     <div id="content"> |  | ||||||
|         <table> |  | ||||||
|             <tr> |  | ||||||
|                 <td class="t">Request Method: </td><td>{{.RequestMethod}}</td> |  | ||||||
|             </tr> |  | ||||||
|             <tr> |  | ||||||
|                 <td class="t">Request URL: </td><td>{{.RequestURL}}</td> |  | ||||||
|             </tr> |  | ||||||
|             <tr> |  | ||||||
|                 <td class="t">RemoteAddr: </td><td>{{.RemoteAddr }}</td> |  | ||||||
|             </tr> |  | ||||||
|         </table> |  | ||||||
|         <div class="stack"> |  | ||||||
|             <b>Stack</b> |  | ||||||
|             <pre>{{.Stack}}</pre> |  | ||||||
|         </div> |  | ||||||
|     </div> |  | ||||||
|     <div id="footer"> |  | ||||||
|         <p>beego {{ .BeegoVersion }} (beego framework)</p> |  | ||||||
|         <p>golang version: {{.GoVersion}}</p> |  | ||||||
|     </div> |  | ||||||
| </body> |  | ||||||
| </html>         |  | ||||||
| ` |  | ||||||
| 
 |  | ||||||
| func ShowErr(err interface{}, rw http.ResponseWriter, r *http.Request, Stack string) { |  | ||||||
| 	t, _ := template.New("beegoerrortemp").Parse(tpl) |  | ||||||
| 	data := make(map[string]string) |  | ||||||
| 	data["AppError"] = AppName + ":" + fmt.Sprint(err) |  | ||||||
| 	data["RequestMethod"] = r.Method |  | ||||||
| 	data["RequestURL"] = r.RequestURI |  | ||||||
| 	data["RemoteAddr"] = r.RemoteAddr |  | ||||||
| 	data["Stack"] = Stack |  | ||||||
| 	data["BeegoVersion"] = VERSION |  | ||||||
| 	data["GoVersion"] = runtime.Version() |  | ||||||
| 	t.Execute(rw, data) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var errtpl = ` |  | ||||||
| <!DOCTYPE html> |  | ||||||
| <html lang="en"> |  | ||||||
| 	<head> |  | ||||||
| 		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |  | ||||||
| 		<title>{{.Title}}</title> |  | ||||||
| 		<style type="text/css"> |  | ||||||
| 			* { |  | ||||||
| 				margin:0; |  | ||||||
| 				padding:0; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			body { |  | ||||||
| 				background-color:#EFEFEF; |  | ||||||
| 				font: .9em "Lucida Sans Unicode", "Lucida Grande", sans-serif; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			#wrapper{ |  | ||||||
| 				width:600px; |  | ||||||
| 				margin:40px auto 0; |  | ||||||
| 				text-align:center; |  | ||||||
| 				-moz-box-shadow: 5px 5px 10px rgba(0,0,0,0.3); |  | ||||||
| 				-webkit-box-shadow: 5px 5px 10px rgba(0,0,0,0.3); |  | ||||||
| 				box-shadow: 5px 5px 10px rgba(0,0,0,0.3); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			#wrapper h1{ |  | ||||||
| 				color:#FFF; |  | ||||||
| 				text-align:center; |  | ||||||
| 				margin-bottom:20px; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			#wrapper a{ |  | ||||||
| 				display:block; |  | ||||||
| 				font-size:.9em; |  | ||||||
| 				padding-top:20px; |  | ||||||
| 				color:#FFF; |  | ||||||
| 				text-decoration:none; |  | ||||||
| 				text-align:center; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			#container { |  | ||||||
| 				width:600px; |  | ||||||
| 				padding-bottom:15px; |  | ||||||
| 				background-color:#FFFFFF; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			.navtop{ |  | ||||||
| 				height:40px; |  | ||||||
| 				background-color:#24B2EB; |  | ||||||
| 				padding:13px; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			.content { |  | ||||||
| 				padding:10px 10px 25px; |  | ||||||
| 				background: #FFFFFF; |  | ||||||
| 				margin:; |  | ||||||
| 				color:#333; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			a.button{ |  | ||||||
| 				color:white; |  | ||||||
| 				padding:15px 20px; |  | ||||||
| 				text-shadow:1px 1px 0 #00A5FF; |  | ||||||
| 				font-weight:bold; |  | ||||||
| 				text-align:center; |  | ||||||
| 				border:1px solid #24B2EB; |  | ||||||
| 				margin:0px 200px; |  | ||||||
| 				clear:both; |  | ||||||
| 				background-color: #24B2EB; |  | ||||||
| 				border-radius:100px; |  | ||||||
| 				-moz-border-radius:100px; |  | ||||||
| 				-webkit-border-radius:100px; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			a.button:hover{ |  | ||||||
| 				text-decoration:none; |  | ||||||
| 				background-color: #24B2EB; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 		</style> |  | ||||||
| 	</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>power by beego {{.BeegoVersion}} |  | ||||||
| 				</div> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 	</body> |  | ||||||
| </html> |  | ||||||
| ` |  | ||||||
| 
 |  | ||||||
| var ErrorMaps map[string]http.HandlerFunc |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	ErrorMaps = make(map[string]http.HandlerFunc) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| //404 |  | ||||||
| func NotFound(rw http.ResponseWriter, r *http.Request) { |  | ||||||
| 	t, _ := template.New("beegoerrortemp").Parse(errtpl) |  | ||||||
| 	data := make(map[string]interface{}) |  | ||||||
| 	data["Title"] = "Page Not Found" |  | ||||||
| 	data["Content"] = template.HTML("<br>The Page You have requested 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>") |  | ||||||
| 	data["BeegoVersion"] = VERSION |  | ||||||
| 	rw.WriteHeader(http.StatusNotFound) |  | ||||||
| 	t.Execute(rw, data) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| //401 |  | ||||||
| func Unauthorized(rw http.ResponseWriter, r *http.Request) { |  | ||||||
| 	t, _ := template.New("beegoerrortemp").Parse(errtpl) |  | ||||||
| 	data := make(map[string]interface{}) |  | ||||||
| 	data["Title"] = "Unauthorized" |  | ||||||
| 	data["Content"] = template.HTML("<br>The Page You have requested can't authorized." + |  | ||||||
| 		"<br>Perhaps you are here because:" + |  | ||||||
| 		"<br><br><ul>" + |  | ||||||
| 		"<br>Check the credentials that you supplied" + |  | ||||||
| 		"<br>Check the address for errors" + |  | ||||||
| 		"</ul>") |  | ||||||
| 	data["BeegoVersion"] = VERSION |  | ||||||
| 	rw.WriteHeader(http.StatusUnauthorized) |  | ||||||
| 	t.Execute(rw, data) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| //403 |  | ||||||
| func Forbidden(rw http.ResponseWriter, r *http.Request) { |  | ||||||
| 	t, _ := template.New("beegoerrortemp").Parse(errtpl) |  | ||||||
| 	data := make(map[string]interface{}) |  | ||||||
| 	data["Title"] = "Forbidden" |  | ||||||
| 	data["Content"] = template.HTML("<br>The Page You have requested forbidden." + |  | ||||||
| 		"<br>Perhaps you are here because:" + |  | ||||||
| 		"<br><br><ul>" + |  | ||||||
| 		"<br>Your address may be blocked" + |  | ||||||
| 		"<br>The site may be disabled" + |  | ||||||
| 		"<br>You need to log in" + |  | ||||||
| 		"</ul>") |  | ||||||
| 	data["BeegoVersion"] = VERSION |  | ||||||
| 	rw.WriteHeader(http.StatusForbidden) |  | ||||||
| 	t.Execute(rw, data) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| //503 |  | ||||||
| func ServiceUnavailable(rw http.ResponseWriter, r *http.Request) { |  | ||||||
| 	t, _ := template.New("beegoerrortemp").Parse(errtpl) |  | ||||||
| 	data := make(map[string]interface{}) |  | ||||||
| 	data["Title"] = "Service Unavailable" |  | ||||||
| 	data["Content"] = template.HTML("<br>The Page You have requested unavailable." + |  | ||||||
| 		"<br>Perhaps you are here because:" + |  | ||||||
| 		"<br><br><ul>" + |  | ||||||
| 		"<br><br>The page is overloaded" + |  | ||||||
| 		"<br>Please try again later." + |  | ||||||
| 		"</ul>") |  | ||||||
| 	data["BeegoVersion"] = VERSION |  | ||||||
| 	rw.WriteHeader(http.StatusServiceUnavailable) |  | ||||||
| 	t.Execute(rw, data) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| //500 |  | ||||||
| func InternalServerError(rw http.ResponseWriter, r *http.Request) { |  | ||||||
| 	t, _ := template.New("beegoerrortemp").Parse(errtpl) |  | ||||||
| 	data := make(map[string]interface{}) |  | ||||||
| 	data["Title"] = "Internal Server Error" |  | ||||||
| 	data["Content"] = template.HTML("<br>The Page You have requested has down now." + |  | ||||||
| 		"<br><br><ul>" + |  | ||||||
| 		"<br>simply try again later" + |  | ||||||
| 		"<br>you should report the fault to the website administrator" + |  | ||||||
| 		"</ul>") |  | ||||||
| 	data["BeegoVersion"] = VERSION |  | ||||||
| 	rw.WriteHeader(http.StatusInternalServerError) |  | ||||||
| 	t.Execute(rw, data) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func registerErrorHander() { |  | ||||||
| 	if _, ok := ErrorMaps["404"]; !ok { |  | ||||||
| 		ErrorMaps["404"] = NotFound |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if _, ok := ErrorMaps["401"]; !ok { |  | ||||||
| 		ErrorMaps["401"] = Unauthorized |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if _, ok := ErrorMaps["403"]; !ok { |  | ||||||
| 		ErrorMaps["403"] = Forbidden |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if _, ok := ErrorMaps["503"]; !ok { |  | ||||||
| 		ErrorMaps["503"] = ServiceUnavailable |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if _, ok := ErrorMaps["500"]; !ok { |  | ||||||
| 		ErrorMaps["500"] = InternalServerError |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @ -5,6 +5,7 @@ import ( | |||||||
| 	"html/template" | 	"html/template" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"runtime" | 	"runtime" | ||||||
|  | 	"strconv" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -286,3 +287,22 @@ func RegisterErrorHander() { | |||||||
| 		ErrorMaps["500"] = InternalServerError | 		ErrorMaps["500"] = InternalServerError | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func Exception(errcode string, w http.ResponseWriter, r *http.Request, msg string) { | ||||||
|  | 	if h, ok := ErrorMaps[errcode]; ok { | ||||||
|  | 		h(w, r) | ||||||
|  | 		return | ||||||
|  | 	} else { | ||||||
|  | 		isint, err := strconv.Atoi(errcode) | ||||||
|  | 		if err != nil { | ||||||
|  | 			isint = 500 | ||||||
|  | 		} | ||||||
|  | 		if isint == 400 { | ||||||
|  | 			msg = "404 page not found" | ||||||
|  | 		} | ||||||
|  | 		w.Header().Set("Content-Type", "text/plain; charset=utf-8") | ||||||
|  | 		w.WriteHeader(isint) | ||||||
|  | 		fmt.Fprintln(w, msg) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								router.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								router.go
									
									
									
									
									
								
							| @ -3,6 +3,7 @@ package beego | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	beecontext "github.com/astaxie/beego/context" | 	beecontext "github.com/astaxie/beego/context" | ||||||
|  | 	"github.com/astaxie/beego/middleware" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| @ -222,7 +223,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) | |||||||
| 	defer func() { | 	defer func() { | ||||||
| 		if err := recover(); err != nil { | 		if err := recover(); err != nil { | ||||||
| 			errstr := fmt.Sprint(err) | 			errstr := fmt.Sprint(err) | ||||||
| 			if handler, ok := ErrorMaps[errstr]; ok && ErrorsShow { | 			if handler, ok := middleware.ErrorMaps[errstr]; ok && ErrorsShow { | ||||||
| 				handler(rw, r) | 				handler(rw, r) | ||||||
| 			} else { | 			} else { | ||||||
| 				if !RecoverPanic { | 				if !RecoverPanic { | ||||||
| @ -242,7 +243,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) | |||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 					if RunMode == "dev" { | 					if RunMode == "dev" { | ||||||
| 						ShowErr(err, rw, r, stack) | 						middleware.ShowErr(err, rw, r, stack) | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| @ -296,15 +297,8 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) | |||||||
| 			} | 			} | ||||||
| 			//if the request is dir and DirectoryIndex is false then | 			//if the request is dir and DirectoryIndex is false then | ||||||
| 			if finfo.IsDir() && !DirectoryIndex { | 			if finfo.IsDir() && !DirectoryIndex { | ||||||
| 				if h, ok := ErrorMaps["403"]; ok { | 				middleware.Exception("403", rw, r, "403 Forbidden") | ||||||
| 					h(w, r) | 				return | ||||||
| 					return |  | ||||||
| 				} else { |  | ||||||
| 					w.Header().Set("Content-Type", "text/plain; charset=utf-8") |  | ||||||
| 					w.WriteHeader(403) |  | ||||||
| 					fmt.Fprintln(w, "403 Forbidden") |  | ||||||
| 					return |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 			http.ServeFile(w, r, file) | 			http.ServeFile(w, r, file) | ||||||
| 			w.started = true | 			w.started = true | ||||||
| @ -641,12 +635,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) | |||||||
| Last: | Last: | ||||||
| 	//if no matches to url, throw a not found exception | 	//if no matches to url, throw a not found exception | ||||||
| 	if !findrouter { | 	if !findrouter { | ||||||
| 		if h, ok := ErrorMaps["404"]; ok { | 		middleware.Exception("404", rw, r, "") | ||||||
| 			w.status = 404 |  | ||||||
| 			h(w, r) |  | ||||||
| 		} else { |  | ||||||
| 			http.NotFound(w, r) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user