From d48c91ecba2ea50cd732db309a13cbbc2a25262b Mon Sep 17 00:00:00 2001 From: Kale Blankenship Date: Tue, 29 Jan 2019 19:02:08 -0800 Subject: [PATCH] Handle server initiated connection close. Server initaited close frames were being treated as an unexpected frame and did not correctly propagate the contained error to the user. Resolves #151 --- conn.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/conn.go b/conn.go index 512577bc..4305c437 100644 --- a/conn.go +++ b/conn.go @@ -23,7 +23,8 @@ var ( ErrTimeout = errors.New("amqp: timeout waiting for response") // ErrConnClosed is propagated to Session and Senders/Receivers - // when Client.Close() is called. + // when Client.Close() is called or the server closes the connection + // without specifying an error. ErrConnClosed = errors.New("amqp: connection closed") ) @@ -358,6 +359,15 @@ func (c *conn) mux() { ) switch body := fr.body.(type) { + // Server initiated close. + case *performClose: + if body.Error != nil { + c.err = body.Error + } else { + c.err = ErrConnClosed + } + return + // RemoteChannel should be used when frame is Begin case *performBegin: session, ok = sessionsByChannel[body.RemoteChannel]