summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_binary_generator.erl9
-rw-r--r--src/rabbit_framing_channel.erl11
-rw-r--r--src/rabbit_reader.erl11
3 files changed, 28 insertions, 3 deletions
diff --git a/src/rabbit_binary_generator.erl b/src/rabbit_binary_generator.erl
index 81cf3ceec7..cd8b44d15f 100644
--- a/src/rabbit_binary_generator.erl
+++ b/src/rabbit_binary_generator.erl
@@ -73,10 +73,17 @@
build_simple_method_frame(ChannelInt, MethodRecord) ->
MethodFields = rabbit_framing:encode_method_fields(MethodRecord),
- MethodName = rabbit_misc:method_record_type(MethodRecord),
+ MethodName = adjust_close(rabbit_misc:method_record_type(MethodRecord)),
{ClassId, MethodId} = rabbit_framing:method_id(MethodName),
create_frame(1, ChannelInt, [<<ClassId:16, MethodId:16>>, MethodFields]).
+adjust_close('connection.close') ->
+ 'connection.close08';
+adjust_close('connection.close_ok') ->
+ 'connection.close08_ok';
+adjust_close(MethodName) ->
+ MethodName.
+
build_simple_content_frames(ChannelInt,
#content{class_id = ClassId,
properties = ContentProperties,
diff --git a/src/rabbit_framing_channel.erl b/src/rabbit_framing_channel.erl
index b7c6aa96fa..8eabf42bdc 100644
--- a/src/rabbit_framing_channel.erl
+++ b/src/rabbit_framing_channel.erl
@@ -74,7 +74,7 @@ read_frame(ChannelPid) ->
mainloop(ChannelPid) ->
{method, MethodName, FieldsBin} = read_frame(ChannelPid),
- Method = rabbit_framing:decode_method_fields(MethodName, FieldsBin),
+ Method = decode_method_fields(MethodName, FieldsBin),
case rabbit_framing:method_has_content(MethodName) of
true -> rabbit_channel:do(ChannelPid, Method,
collect_content(ChannelPid, MethodName));
@@ -82,6 +82,15 @@ mainloop(ChannelPid) ->
end,
?MODULE:mainloop(ChannelPid).
+%% Handle 0-8 version of basic.consume, which doesn't have a table on the end
+decode_method_fields('basic.consume', FieldsBin) ->
+ T = rabbit_binary_generator:generate_table([]),
+ TLen = size(T),
+ rabbit_framing:decode_method_fields(
+ 'basic.consume', <<FieldsBin/binary, TLen:32/unsigned, T:TLen/binary>>);
+decode_method_fields(MethodName, FieldsBin) ->
+ rabbit_framing:decode_method_fields(MethodName, FieldsBin).
+
collect_content(ChannelPid, MethodName) ->
{ClassId, _MethodId} = rabbit_framing:method_id(MethodName),
case read_frame(ChannelPid) of
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 20aacf33b2..f83f932db9 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -502,7 +502,9 @@ handle_frame(Type, Channel, Payload, State) ->
end.
analyze_frame(?FRAME_METHOD, <<ClassId:16, MethodId:16, MethodFields/binary>>) ->
- {method, rabbit_framing:lookup_method_name({ClassId, MethodId}), MethodFields};
+ {method, adjust_close(rabbit_framing:lookup_method_name({ClassId,
+ MethodId})),
+ MethodFields};
analyze_frame(?FRAME_HEADER, <<ClassId:16, Weight:16, BodySize:64, Properties/binary>>) ->
{content_header, ClassId, Weight, BodySize, Properties};
analyze_frame(?FRAME_BODY, Body) ->
@@ -512,6 +514,13 @@ analyze_frame(?FRAME_HEARTBEAT, <<>>) ->
analyze_frame(_Type, _Body) ->
error.
+adjust_close('connection.close08') ->
+ 'connection.close';
+adjust_close('connection.close08_ok') ->
+ 'connection.close_ok';
+adjust_close(MethodName) ->
+ MethodName.
+
handle_input(frame_header, <<Type:8,Channel:16,PayloadSize:32>>, State) ->
%%?LOGDEBUG("Got frame header: ~p/~p/~p~n", [Type, Channel, PayloadSize]),
{State, {frame_payload, Type, Channel, PayloadSize}, PayloadSize + 1};