2017-06-29 07:09:15 -07:00
|
|
|
package stack
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
2017-07-03 09:10:46 -07:00
|
|
|
"github.com/tendermint/tmlibs/log"
|
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
"github.com/tendermint/basecoin"
|
|
|
|
"github.com/tendermint/basecoin/errors"
|
|
|
|
"github.com/tendermint/basecoin/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
NameRecovery = "rcvr"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Recovery catches any panics and returns them as errors instead
|
|
|
|
type Recovery struct{}
|
|
|
|
|
|
|
|
func (_ Recovery) Name() string {
|
|
|
|
return NameRecovery
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ Middleware = Recovery{}
|
|
|
|
|
|
|
|
func (_ Recovery) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Checker) (res basecoin.Result, err error) {
|
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
err = normalizePanic(r)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
return next.CheckTx(ctx, store, tx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (_ Recovery) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.Result, err error) {
|
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
err = normalizePanic(r)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
return next.DeliverTx(ctx, store, tx)
|
|
|
|
}
|
|
|
|
|
2017-07-04 03:22:06 -07:00
|
|
|
func (_ Recovery) SetOption(l log.Logger, store types.KVStore, module, key, value string, next basecoin.SetOptioner) (log string, err error) {
|
2017-07-03 09:10:46 -07:00
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
err = normalizePanic(r)
|
|
|
|
}
|
|
|
|
}()
|
2017-07-04 03:22:06 -07:00
|
|
|
return next.SetOption(l, store, module, key, value)
|
2017-07-03 09:10:46 -07:00
|
|
|
}
|
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
// normalizePanic makes sure we can get a nice TMError (with stack) out of it
|
|
|
|
func normalizePanic(p interface{}) error {
|
|
|
|
if err, isErr := p.(error); isErr {
|
|
|
|
return errors.Wrap(err)
|
|
|
|
}
|
|
|
|
msg := fmt.Sprintf("%v", p)
|
2017-07-03 05:50:33 -07:00
|
|
|
return errors.ErrInternal(msg)
|
2017-06-29 07:09:15 -07:00
|
|
|
}
|