diff --git a/.changelog/19172.txt b/.changelog/19172.txt new file mode 100644 index 000000000..15443ba4b --- /dev/null +++ b/.changelog/19172.txt @@ -0,0 +1,3 @@ +```release-note:bug +agent: Correct websocket status code handling +``` diff --git a/command/agent/alloc_endpoint.go b/command/agent/alloc_endpoint.go index 656e6dd95..8d6992343 100644 --- a/command/agent/alloc_endpoint.go +++ b/command/agent/alloc_endpoint.go @@ -10,6 +10,7 @@ import ( "io" "net" "net/http" + "slices" "strconv" "strings" @@ -671,6 +672,15 @@ func isClosedError(err error) bool { return false } + // check if the websocket "error" is one of the benign "close" status codes + if codedErr, ok := err.(HTTPCodedError); ok { + return slices.ContainsFunc([]string{ + "close 1000", // CLOSE_NORMAL + "close 1001", // CLOSE_GOING_AWAY + "close 1005", // CLOSED_NO_STATUS + }, func(s string) bool { return strings.Contains(codedErr.Error(), s) }) + } + return err == io.EOF || err == io.ErrClosedPipe || strings.Contains(err.Error(), "closed") ||