diff --git a/conn.go b/conn.go
index 7d48b8aa1de1c131e919f79f094660969c16a217..df3a4044e37799441ed218d94ce31312a8238b79 100644
--- a/conn.go
+++ b/conn.go
@@ -236,6 +236,10 @@ func (c *Conn) readTillMsg(ctx context.Context) (header, error) {
 		if h.opcode.controlOp() {
 			err = c.handleControl(ctx, h)
 			if err != nil {
+				// Pass through CloseErrors when receiving a close frame.
+				if h.opcode == opClose && CloseStatus(err) != -1 {
+					return header{}, err
+				}
 				return header{}, fmt.Errorf("failed to handle control frame %v: %w", h.opcode, err)
 			}
 			continue