Skip to content

Commit

Permalink
Fix a bug that make data to be considered as masked
Browse files Browse the repository at this point in the history
  • Loading branch information
madtrick committed Sep 2, 2013
1 parent d98ef82 commit fcc1f37
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
2 changes: 2 additions & 0 deletions src/wsock_framing.erl
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ from_binary(<<ExtendedPayloadLengthCont:64, Rest/binary>>, extended_payload_leng
from_binary(Rest, next_piece_from_binary(Rest, 4, masking_key), NewFrame);
from_binary(Data, masking_key, Frame = #frame{ mask = 0 })->
from_binary(Data, next_piece_from_binary(Data, real_payload_length(Frame), payload), Frame);
from_binary(Data, masking_key, Frame = #frame{ mask = 0 }) ->
from_binary(Data, next_piece_from_binary(Data, real_payload_length(Frame), payload), Frame);
from_binary(<<MaskKey:32, Rest/binary>>, masking_key, Frame)->
NewFrame = Frame#frame{ masking_key = MaskKey },
from_binary(Rest, next_piece_from_binary(Rest, real_payload_length(Frame), payload), NewFrame);
Expand Down
25 changes: 14 additions & 11 deletions test/spec/wsock_framing_spec.erl
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,8 @@ spec() ->
X when X > 65536 -> 127
end,
BinFrame = get_binary_frame(Fin, Rsv, Rsv, Rsv, Opcode, Mask, DataLen, ByteSize, Data),
wsock_framing:from_binary(BinFrame)
[Frame] = wsock_framing:from_binary(BinFrame),
{BinFrame, Frame}
end)
end),
describe("non payload fields", fun() ->
Expand All @@ -216,7 +217,6 @@ spec() ->


BinFrame = get_binary_frame(1, 0, 0, 0, 1, 0, DataLen, 0, Data),
io:format("Byte size ~w Bit size ~w~n", [byte_size(BinFrame), bit_size(BinFrame)]),
[Frame] = wsock_framing:from_binary(BinFrame),
assert_that(Frame#frame.fin, is(1))
end)
Expand Down Expand Up @@ -278,7 +278,7 @@ spec() ->
describe("mask", fun() ->
before_all(fun() ->
spec_set(validator, fun(Mask) ->
[Frame] = (spec_get(frame_builder))(0, 0, 1, Mask, crypto:rand_bytes(20)),
{_BinFrame, Frame} = (spec_get(frame_builder))(0, 0, 1, Mask, crypto:rand_bytes(20)),
assert_that(Frame#frame.mask, is(Mask))
end)
end),
Expand All @@ -292,22 +292,23 @@ spec() ->
describe("payoad lenght", fun()->
before_all(fun() ->
spec_set(frame, fun(Size) ->
(spec_get(frame_builder))(0, 0, 2, 0, crypto:rand_bytes(Size))
{_BinFrame, Frame} = (spec_get(frame_builder))(0, 0, 2, 0, crypto:rand_bytes(Size)),
Frame
end)
end),
it("set payload length of data with <= 125 bytes", fun() ->
[Frame] = (spec_get(frame))(100),
Frame = (spec_get(frame))(100),

assert_that(Frame#frame.payload_len, is(100))
end),
it("set payload length of data with > 125 <= 65536 bytes", fun() ->
[Frame] = (spec_get(frame))(200),
Frame = (spec_get(frame))(200),

assert_that(Frame#frame.payload_len, is(126)),
assert_that(Frame#frame.extended_payload_len, is(200))
end),
it("set payload length of data with > 65536 bytes", fun() ->
[Frame] = (spec_get(frame))(70000),
Frame = (spec_get(frame))(70000),

assert_that(Frame#frame.payload_len, is(127)),
assert_that(Frame#frame.extended_payload_len_cont, is(70000))
Expand All @@ -320,22 +321,24 @@ spec() ->
end)
end),
it("should be undefined if data is unmasked", fun() ->
[Frame] = (spec_get(frame))(0),
{_, Frame} = (spec_get(frame))(0),

assert_that(Frame#frame.masking_key, is(undefined))
end),
it("should be set if data is masked", fun() ->
[Frame] = (spec_get(frame))(1),
{BinFrame, Frame} = (spec_get(frame))(1),
<<_:2/binary, MK:32/integer, _/binary>> = BinFrame,

assert_that(Frame#frame.masking_key, is_not(undefined))
assert_that(Frame#frame.masking_key, is_not(undefined)),
assert_that(Frame#frame.masking_key, is(MK))
end)
end)
end),
describe("payload", fun() ->
before_all(fun() ->
spec_set(validator, fun(Mask, Size) ->
Data = crypto:rand_bytes(Size),
[Frame] = (spec_get(frame_builder))(0, 0, 2, Mask, Data),
{_BinFrame, Frame} = (spec_get(frame_builder))(0, 0, 2, Mask, Data),

assert_that(Frame#frame.payload, is(Data))
end)
Expand Down

0 comments on commit fcc1f37

Please sign in to comment.