-
Notifications
You must be signed in to change notification settings - Fork 69
/
Copy pathhttp2_frame_size_SUITE.erl
106 lines (89 loc) · 3.42 KB
/
http2_frame_size_SUITE.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
-module(http2_frame_size_SUITE).
-include("http2.hrl").
-include_lib("eunit/include/eunit.hrl").
-include_lib("common_test/include/ct.hrl").
-compile([export_all]).
all() -> [
frame_too_big,
euc
%% TODO: Tests break because I'm having trouble sending broken data.
% wrong_size_priority,
% wrong_size_rst_stream,
% wrong_size_ping,
% wrong_size_window_update
].
init_per_testcase(_, Config) ->
Config0 = chatterbox_test_buddy:start(Config),
Config0.
end_per_testcase(_, Config) ->
chatterbox_test_buddy:stop(Config),
ok.
wrong_size_priority(Config) ->
send_wrong_size(?PRIORITY, Config).
wrong_size_rst_stream(Config) ->
send_wrong_size(?RST_STREAM, Config).
wrong_size_ping(Config) ->
send_wrong_size(?PING, Config).
wrong_size_window_update(Config) ->
send_wrong_size(?WINDOW_UPDATE, Config).
send_wrong_size(Type, _Config) ->
{ok, Client} = http2c:start_link(),
http2c:send_binary(Client, <<10:24,Type:8,0:1,0:31,0:104>>),
Resp = http2c:wait_for_n_frames(Client, 0, 1),
ct:pal("Resp: ~p", [Resp]),
?assertEqual(1, (length(Resp))),
[{GoAwayH, GoAway}] = Resp,
?assertEqual(?GOAWAY, (GoAwayH#frame_header.type)),
?assertEqual(?FRAME_SIZE_ERROR, (h2_frame_goaway:error_code(GoAway))),
ok.
frame_too_big(_Config) ->
{ok, Client} = http2c:start_link(),
Frames = [
{
#frame_header{
length=16392,
type=?HEADERS,
flags=?FLAG_END_HEADERS,
stream_id=3},
h2_frame_headers:new(<<1:131136>>)}
],
http2c:send_unaltered_frames(Client, Frames),
Resp = http2c:wait_for_n_frames(Client, 0, 1),
ct:pal("Resp: ~p", [Resp]),
?assertEqual(1, (length(Resp))),
[{GoAwayH, GoAway}] = Resp,
?assertEqual(?GOAWAY, (GoAwayH#frame_header.type)),
?assertEqual(?FRAME_SIZE_ERROR, (h2_frame_goaway:error_code(GoAway))),
ok.
euc(_Config) ->
{ok, Client} = http2c:start_link(),
Headers1 = [
{<<":path">>, <<"/">>},
{<<"user-agent">>, <<"my cool browser">>},
{<<"x-custom-header">>, <<"some custom value">>}
],
HeaderContext1 = hpack:new_context(),
{ok, {HeadersBin1, HeaderContext2}} = hpack:encode(Headers1, HeaderContext1),
Headers2 = [
{<<":path">>, <<"/some_file.html">>},
{<<"user-agent">>, <<"my cool browser">>},
{<<"x-custom-header">>, <<"some custom value">>}
],
{ok, {HeadersBin2, HeaderContext3}} = hpack:encode(Headers2, HeaderContext2),
Headers3 = [
{<<":path">>, <<"/some_file.html">>},
{<<"user-agent">>, <<"my cool browser">>},
{<<"x-custom-header">>, <<"new value">>}
],
{ok, {HeadersBin3, _HeaderContext4}} = hpack:encode(Headers3, HeaderContext3),
Frames = [
{#frame_header{length=byte_size(HeadersBin1),type=?HEADERS,flags=?FLAG_END_HEADERS,stream_id=3},
h2_frame_headers:new(HeadersBin1)},
{#frame_header{length=byte_size(HeadersBin2),type=?HEADERS,flags=?FLAG_END_HEADERS,stream_id=5},
h2_frame_headers:new(HeadersBin2)},
{#frame_header{length=byte_size(HeadersBin3),type=?HEADERS,flags=?FLAG_END_HEADERS,stream_id=7},
h2_frame_headers:new(HeadersBin3)}
],
http2c:send_unaltered_frames(Client, Frames),
Resp = http2c:wait_for_n_frames(Client, 0, 0),
?assertEqual(0, (length(Resp))).