2015-03-01 3 views
0

Я хочу отправить электронное письмо себе с ошибкой на странице http://localhost:3000/panic с указанием ошибки URL-адреса - /panic в нашем случае. Но я не могу понять, как получить URL-адрес от c martini.Context внутри метода RecoverWrap.получить запрос url в martini.Context

package main 

import (
    "errors" 
    "github.com/go-martini/martini" 
    "net/http" 
) 

func main() { 
    m := martini.Classic() 
    m.Use(RecoverWrap) 
    m.Get("/panic", func() { 
     panic("some panic") 
    }) 

    m.Get("/", func(req *http.Request, res http.ResponseWriter) { 
     res.Write([]byte("mainPage")) 
    }) 

    m.Run() 
} 

func RecoverWrap(c martini.Context, w http.ResponseWriter) { 
    var err error 
    defer func(w http.ResponseWriter) { 
     r := recover() 
     if r != nil { 
      switch t := r.(type) { 
      case string: 
       err = errors.New(t) 
      case error: 
       err = t 
      default: 
       err = errors.New("Unknown error") 
      } 
      // how to get request url here 
      // I want to send email with error url 
      http.Error(w, "Something goes wrong", http.StatusInternalServerError) 
     } 
    }(w) 
    c.Next() 
} 

ответ

0

Ответ в добавлении req *http.Request параметр в func RecoverWrap(c martini.Context, req *http.Request, w http.ResponseWriter)

Полный код:

package main 

import (
    "errors" 
    "fmt" 
    "github.com/go-martini/martini" 
    "net/http" 
) 

func main() { 
    m := martini.Classic() 
    m.Use(RecoverWrap) 
    m.Get("/panic", func() { 
     panic("some panic") 
    }) 

    m.Get("/", func(req *http.Request, res http.ResponseWriter) { 
     res.Write([]byte("mainPage")) 
    }) 

    m.Run() 
} 

func RecoverWrap(c martini.Context, req *http.Request, w http.ResponseWriter) { 
    var err error 
    defer func(w http.ResponseWriter) { 
     r := recover() 
     if r != nil { 
      switch t := r.(type) { 
      case string: 
       err = errors.New(t) 
      case error: 
       err = t 
      default: 
       err = errors.New("Unknown error") 
      } 

      fmt.Println("req.URL.Path") 
      fmt.Println(req.URL.Path) 
      http.Error(w, "Something goes wrong", http.StatusInternalServerError) 
     } 
    }(w) 
    c.Next() 
}