Packages
bandit
0.6.8
1.12.0
1.11.1
1.11.0
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
retired
1.9.0
1.8.0
1.7.0
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.0
1.2.3
1.2.2
1.2.1
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-pre.18
1.0.0-pre.17
1.0.0-pre.16
1.0.0-pre.15
1.0.0-pre.14
1.0.0-pre.13
1.0.0-pre.12
1.0.0-pre.11
1.0.0-pre.10
1.0.0-pre.9
1.0.0-pre.8
1.0.0-pre.7
1.0.0-pre.6
1.0.0-pre.5
1.0.0-pre.4
1.0.0-pre.3
1.0.0-pre.2
1.0.0-pre.1
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
A pure-Elixir HTTP server built for Plug & WebSock apps
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
test/bandit/http2/frame_serialization_test.exs
defmodule HTTP2FrameSerializationTest do
use ExUnit.Case, async: true
alias Bandit.HTTP2.{Frame, Settings}
describe "DATA frames" do
test "serializes frames" do
frame = %Frame.Data{
stream_id: 123,
end_stream: false,
data: <<1, 2, 3>>
}
assert Frame.serialize(frame, 16_384) == [[<<0, 0, 3, 0, 0, 0, 0, 0, 123>>, <<1, 2, 3>>]]
end
test "serializes frames into multiple size-respecting frames" do
frame = %Frame.Data{
stream_id: 123,
end_stream: false,
data: <<1, 2, 3>>
}
assert Frame.serialize(frame, 2) == [
[<<0, 0, 2, 0, 0, 0, 0, 0, 123>>, <<1, 2>>],
[<<0, 0, 1, 0, 0, 0, 0, 0, 123>>, <<3>>]
]
end
test "serializes frames with end_stream set" do
frame = %Frame.Data{
stream_id: 123,
end_stream: true,
data: <<1, 2, 3>>
}
assert Frame.serialize(frame, 16_384) == [[<<0, 0, 3, 0, 1, 0, 0, 0, 123>>, <<1, 2, 3>>]]
end
test "serializes frames with end_stream set into multiple size-respecting frames" do
frame = %Frame.Data{
stream_id: 123,
end_stream: true,
data: <<1, 2, 3>>
}
assert Frame.serialize(frame, 2) == [
[<<0, 0, 2, 0, 0, 0, 0, 0, 123>>, <<1, 2>>],
[<<0, 0, 1, 0, 1, 0, 0, 0, 123>>, <<3>>]
]
end
end
describe "HEADERS frames" do
test "serializes frames" do
frame = %Frame.Headers{
stream_id: 123,
end_stream: false,
fragment: <<1, 2, 3>>
}
assert Frame.serialize(frame, 16_384) == [[<<0, 0, 3, 1, 4, 0, 0, 0, 123>>, <<1, 2, 3>>]]
end
test "serializes frames into multiple size-respecting frames" do
frame = %Frame.Headers{
stream_id: 123,
end_stream: false,
fragment: <<1, 2, 3>>
}
assert Frame.serialize(frame, 2) == [
[<<0, 0, 2, 1, 0, 0, 0, 0, 123>>, <<1, 2>>],
[<<0, 0, 1, 9, 4, 0, 0, 0, 123>>, <<3>>]
]
end
test "serializes frames with end_stream set" do
frame = %Frame.Headers{
stream_id: 123,
end_stream: true,
fragment: <<1, 2, 3>>
}
assert Frame.serialize(frame, 16_384) == [[<<0, 0, 3, 1, 5, 0, 0, 0, 123>>, <<1, 2, 3>>]]
end
test "serializes frames with end_stream set into multiple size-respecting frames" do
frame = %Frame.Headers{
stream_id: 123,
end_stream: true,
fragment: <<1, 2, 3>>
}
assert Frame.serialize(frame, 2) == [
[<<0, 0, 2, 1, 1, 0, 0, 0, 123>>, <<1, 2>>],
[<<0, 0, 1, 9, 4, 0, 0, 0, 123>>, <<3>>]
]
end
end
describe "PRIORITY frames" do
test "serializes frames" do
frame = %Frame.Priority{
stream_id: 123,
dependent_stream_id: 456,
weight: 78
}
assert Frame.serialize(frame, 16_384) == [
[<<0, 0, 5, 2, 0, 0, 0, 0, 123>>, <<0::1, 456::31, 78::8>>]
]
end
end
describe "RST_STREAM frames" do
test "serializes frames" do
frame = %Frame.RstStream{
stream_id: 123,
error_code: 456
}
assert Frame.serialize(frame, 16_384) == [[<<0, 0, 4, 3, 0, 0, 0, 0, 123>>, <<456::32>>]]
end
end
describe "SETTINGS frames" do
test "serializes non-ack frames when there are no non-default settings" do
frame = %Frame.Settings{ack: false, settings: %Settings{}}
assert Frame.serialize(frame, 16_384) == [
[<<0, 0, 0, 4, 0, 0, 0, 0, 0>>, [<<>>, <<>>, <<>>, <<>>, <<>>]]
]
end
test "serializes non-ack frames when there are non-default settings" do
frame = %Frame.Settings{
ack: false,
settings: %Settings{
header_table_size: 1000,
max_concurrent_streams: 2000,
initial_window_size: 3000,
max_frame_size: 40_000,
max_header_list_size: 5000
}
}
assert Frame.serialize(frame, 16_384) ==
[
[
<<0, 0, 30, 4, 0, 0, 0, 0, 0>>,
[
<<1::16, 1000::32>>,
<<4::16, 3000::32>>,
<<3::16, 2000::32>>,
<<5::16, 40_000::32>>,
<<6::16, 5000::32>>
]
]
]
end
test "serializes ack frames" do
frame = %Frame.Settings{ack: true, settings: %{}}
assert Frame.serialize(frame, 16_384) == [[<<0, 0, 0, 4, 1, 0, 0, 0, 0>>, <<>>]]
end
end
describe "PING frames" do
test "serializes non-ack frames" do
frame = %Frame.Ping{ack: false, payload: <<1, 2, 3, 4, 5, 6, 7, 8>>}
assert Frame.serialize(frame, 16_384) == [
[<<0, 0, 8, 6, 0, 0, 0, 0, 0>>, <<1, 2, 3, 4, 5, 6, 7, 8>>]
]
end
test "serializes ack frames" do
frame = %Frame.Ping{ack: true, payload: <<1, 2, 3, 4, 5, 6, 7, 8>>}
assert Frame.serialize(frame, 16_384) == [
[<<0, 0, 8, 6, 1, 0, 0, 0, 0>>, <<1, 2, 3, 4, 5, 6, 7, 8>>]
]
end
end
describe "GOAWAY frames" do
test "serializes frames without debug data" do
frame = %Frame.Goaway{last_stream_id: 1, error_code: 2}
assert Frame.serialize(frame, 16_384) == [
[<<0, 0, 8, 7, 0, 0, 0, 0, 0>>, <<0, 0, 0, 1, 0, 0, 0, 2>>]
]
end
test "serializes frames with debug data" do
frame = %Frame.Goaway{last_stream_id: 1, error_code: 2, debug_data: <<3, 4>>}
assert Frame.serialize(frame, 16_384) ==
[[<<0, 0, 10, 7, 0, 0, 0, 0, 0>>, <<0, 0, 0, 1, 0, 0, 0, 2, 3, 4>>]]
end
end
describe "WINDOW_UPDATE frames" do
test "serializes frames" do
frame = %Frame.WindowUpdate{
stream_id: 123,
size_increment: 234
}
assert Frame.serialize(frame, 16_384) == [
[<<0, 0, 4, 8, 0, 0, 0, 0, 123>>, <<0, 0, 0, 234>>]
]
end
end
describe "CONTINUATION frames" do
test "serializes frames" do
frame = %Frame.Continuation{
stream_id: 123,
fragment: <<1, 2, 3>>
}
assert Frame.serialize(frame, 16_384) == [[<<0, 0, 3, 9, 4, 0, 0, 0, 123>>, <<1, 2, 3>>]]
end
end
end