Skip to content

Commit

Permalink
feat: add recover middleware
Browse files Browse the repository at this point in the history
recover middleware wraps other middlewares and recover from panics
  • Loading branch information
aymanbagabas committed Jan 28, 2022
1 parent 3907d12 commit 1b9edfe
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 0 deletions.
35 changes: 35 additions & 0 deletions recover/recover.go
@@ -0,0 +1,35 @@
package recover

import (
"log"
"runtime/debug"

"github.com/charmbracelet/wish"
"github.com/gliderlabs/ssh"
)

// Middleware is a wish middleware that recover from panics. The default logger
// is used to log panics.
func Middleware(mw ...wish.Middleware) wish.Middleware {
return MiddlewareWithLogger(log.Default(), mw...)
}

// MiddlewareWithLogger is a wish middleware that recover from panics and log to
// the provided logger.
func MiddlewareWithLogger(logger *log.Logger, mw ...wish.Middleware) wish.Middleware {
return func(sh ssh.Handler) ssh.Handler {
return func(s ssh.Session) {
func() {
defer func() {
if r := recover(); r != nil {
logger.Printf("panic: %v\n%s", r, string(debug.Stack()))
}
}()
for _, m := range mw {
m(sh)(s)
}
sh(s)
}()
}
}
}
42 changes: 42 additions & 0 deletions recover/recover_test.go
@@ -0,0 +1,42 @@
package recover

import (
"fmt"
"strings"
"testing"

"github.com/charmbracelet/wish/testsession"
"github.com/gliderlabs/ssh"
gossh "golang.org/x/crypto/ssh"
)

func TestMiddleware(t *testing.T) {
t.Run("recover session", func(t *testing.T) {
_, err := setup(t).Output("")
defer func() {
if r := recover(); r != nil {
if strings.HasPrefix(fmt.Sprint(r), "panic: hello\n") {
t.Errorf("session should be recovered")
}
}
}()
requireNoError(t, err)
})
}

func setup(tb testing.TB) *gossh.Session {
tb.Helper()
return testsession.New(tb, &ssh.Server{
Handler: Middleware()(func(s ssh.Session) {
panic("hello")
}),
}, nil)
}

func requireNoError(t *testing.T, err error) {
t.Helper()

if err != nil {
t.Fatalf("expected no error, got %q", err.Error())
}
}

0 comments on commit 1b9edfe

Please sign in to comment.