12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- package tango
- import (
- "fmt"
- "net/http"
- "runtime"
- )
- type Recovery struct {
- debug bool
- logger Logger
- }
- func (recovery *Recovery) SetLogger(logger Logger) {
- recovery.logger = logger
- }
- func NewRecovery(debug bool) *Recovery {
- return &Recovery{debug: debug}
- }
- func (recovery *Recovery) Handle(ctx *Context) {
- defer func() {
- if e := recover(); e != nil {
- content := fmt.Sprintf("Handler crashed with error: %v", e)
- for i := 1; ;i += 1 {
- _, file, line, ok := runtime.Caller(i)
- if !ok {
- break
- } else {
- content += "\n"
- }
- content += fmt.Sprintf("%v %v", file, line)
- }
- if recovery.logger != nil {
- recovery.logger.Error(content)
- }
- if !ctx.Written() {
- ctx.WriteHeader(http.StatusInternalServerError)
- if !recovery.debug {
- content = http.StatusText(http.StatusInternalServerError)
- }
- ctx.Write([]byte(content))
- }
- }
- }()
- ctx.Next()
- }
|