summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Garnock-Jones <tonyg@kcbbs.gen.nz>2009-05-12 06:26:57 +0100
committerTony Garnock-Jones <tonyg@kcbbs.gen.nz>2009-05-12 06:26:57 +0100
commit7f2f5663d5a4b8c80e12d47608aa33241677d101 (patch)
tree7d5a60978e8f8a3383913aeed38ee6d31b85d022
parent9d08293b8e27defb7dba4d84d9f7c11d3520d995 (diff)
downloadrabbitmq-c-github-ask-7f2f5663d5a4b8c80e12d47608aa33241677d101.tar.gz
Correct test for connection exception frames.
-rw-r--r--librabbitmq/amqp_socket.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/librabbitmq/amqp_socket.c b/librabbitmq/amqp_socket.c
index 60911d1..b42ba47 100644
--- a/librabbitmq/amqp_socket.c
+++ b/librabbitmq/amqp_socket.c
@@ -223,12 +223,22 @@ amqp_rpc_reply_t amqp_simple_rpc(amqp_connection_state_t state,
return result;
}
- if (!((frame.frame_type == AMQP_FRAME_METHOD) &&
- (frame.channel == channel) &&
- ((frame.payload.method.id == expected_reply_id) ||
- (frame.payload.method.id == AMQP_CONNECTION_CLOSE_METHOD) ||
- (frame.payload.method.id == AMQP_CHANNEL_CLOSE_METHOD))))
- {
+ /*
+ * We store the frame for later processing unless it's something
+ * that directly affects us here, namely a method frame that is
+ * either
+ * - on the channel we want, and of the expected type, or
+ * - on the channel we want, and a channel.close frame, or
+ * - on channel zero, and a connection.close frame.
+ */
+ if (!( (frame.frame_type == AMQP_FRAME_METHOD) &&
+ ( ((frame.channel == channel) &&
+ ((frame.payload.method.id == expected_reply_id) ||
+ (frame.payload.method.id == AMQP_CHANNEL_CLOSE_METHOD)))
+ ||
+ ((frame.channel == 0) &&
+ (frame.payload.method.id == AMQP_CONNECTION_CLOSE_METHOD)) ) ))
+ {
amqp_frame_t *frame_copy = amqp_pool_alloc(&state->decoding_pool, sizeof(amqp_frame_t));
amqp_link_t *link = amqp_pool_alloc(&state->decoding_pool, sizeof(amqp_link_t));