Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions webhook/forward.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ func NewCmdForward() *cobra.Command {
)

cmd := &cobra.Command{
Use: "forward --events=<types> [--url=<url>]",
Short: "Receive test events locally",
Use: "forward --events=<types> [--url=<url>]",
Short: "Receive test events locally",
SilenceUsage: true,
Example: heredoc.Doc(`
# create a dev webhook for the 'issue_open' event in the monalisa/smile repo in GitHub running locally, and
# forward payloads for the triggered event to http://localhost:9999/webhooks
Expand Down Expand Up @@ -90,10 +91,10 @@ func runFwd(out io.Writer, url, token, wsURL string, activateHook func() error)
err := handleWebsocket(out, url, token, wsURL, activateHook)
if err != nil {
// If the error is a server disconnect (1006), retry connecting
if websocket.IsCloseError(err, websocket.CloseAbnormalClosure) {
if isWebsocketCloseError(err, websocket.CloseAbnormalClosure) {
time.Sleep(5 * time.Second)
continue
} else if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
} else if isWebsocketCloseError(err, websocket.CloseNormalClosure) {
return nil
}
return err
Expand All @@ -102,6 +103,11 @@ func runFwd(out io.Writer, url, token, wsURL string, activateHook func() error)
return fmt.Errorf("unable to connect to webhooks server, forwarding stopped")
}

func isWebsocketCloseError(err error, code int) bool {
var closeError *websocket.CloseError
return errors.As(err, &closeError) && closeError.Code == code
}

// handleWebsocket mediates between websocket server and local web server
func handleWebsocket(out io.Writer, url, token, wsURL string, activateHook func() error) error {
c, err := dial(token, wsURL)
Expand Down
38 changes: 38 additions & 0 deletions webhook/forward_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package webhook

import (
"fmt"
"testing"

"github.com/gorilla/websocket"
)

func TestNewCmdForwardSilencesUsage(t *testing.T) {
cmd := NewCmdForward()

if !cmd.SilenceUsage {
t.Fatal("expected runtime errors not to print command usage")
}
}

func TestIsWebsocketCloseErrorUnwrapsError(t *testing.T) {
err := fmt.Errorf(
"error receiving json event: %w",
&websocket.CloseError{Code: websocket.CloseAbnormalClosure},
)

if !isWebsocketCloseError(err, websocket.CloseAbnormalClosure) {
t.Fatal("expected wrapped abnormal closure to be recognized")
}
}

func TestIsWebsocketCloseErrorRejectsDifferentCode(t *testing.T) {
err := fmt.Errorf(
"error receiving json event: %w",
&websocket.CloseError{Code: websocket.CloseNormalClosure},
)

if isWebsocketCloseError(err, websocket.CloseAbnormalClosure) {
t.Fatal("expected close error with a different code not to match")
}
}