http-2 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -341,11 +341,11 @@ RSpec.describe HTTP2::Framer do
341
341
  length: 44,
342
342
  type: :altsvc,
343
343
  stream: 1,
344
- max_age: 1_402_290_402, # 4
345
- port: 8080, # 2
346
- proto: 'h2-13', # 1 + 5
347
- host: 'www.example.com', # 1 + 15
348
- origin: 'www.example.com', # 15
344
+ max_age: 1_402_290_402, # 4
345
+ port: 8080, # 2
346
+ proto: 'h2-13', # 1 + 5
347
+ host: 'www.example.com', # 1 + 15
348
+ origin: 'www.example.com', # 15
349
349
  }
350
350
  bytes = f.generate(frame)
351
351
  expected = [0, 43, 0xa, 0, 1, 1_402_290_402, 8080].pack('CnCCNNn')
@@ -8,117 +8,135 @@ require 'coveralls'
8
8
 
9
9
  Coveralls.wear! if ENV['CI']
10
10
 
11
+ # rubocop: disable Style/MixinUsage
11
12
  require 'http/2'
12
-
13
13
  include HTTP2
14
14
  include HTTP2::Header
15
15
  include HTTP2::Error
16
-
17
- DATA = {
18
- type: :data,
19
- flags: [:end_stream].freeze,
20
- stream: 1,
21
- payload: 'text'.freeze,
22
- }.freeze
23
-
24
- HEADERS = {
25
- type: :headers,
26
- flags: [:end_headers].freeze,
27
- stream: 1,
28
- payload: Compressor.new.encode([%w(a b)]).freeze,
29
- }.freeze
30
-
31
- HEADERS_END_STREAM = {
32
- type: :headers,
33
- flags: [:end_headers, :end_stream].freeze,
34
- stream: 1,
35
- payload: Compressor.new.encode([%w(a b)]).freeze,
36
- }.freeze
37
-
38
- PRIORITY = {
39
- type: :priority,
40
- stream: 1,
41
- exclusive: false,
42
- stream_dependency: 0,
43
- weight: 20,
44
- }.freeze
45
-
46
- RST_STREAM = {
47
- type: :rst_stream,
48
- stream: 1,
49
- error: :stream_closed,
50
- }.freeze
51
-
52
- SETTINGS = {
53
- type: :settings,
54
- stream: 0,
55
- payload: [
56
- [:settings_max_concurrent_streams, 10].freeze,
57
- [:settings_initial_window_size, 0x7fffffff].freeze,
58
- ].freeze,
59
- }.freeze
60
-
61
- PUSH_PROMISE = {
62
- type: :push_promise,
63
- flags: [:end_headers].freeze,
64
- stream: 1,
65
- promise_stream: 2,
66
- payload: Compressor.new.encode([%w(a b)]).freeze,
67
- }.freeze
68
-
69
- PING = {
70
- stream: 0,
71
- type: :ping,
72
- payload: '12345678'.freeze,
73
- }.freeze
74
-
75
- PONG = {
76
- stream: 0,
77
- type: :ping,
78
- flags: [:ack].freeze,
79
- payload: '12345678'.freeze,
80
- }.freeze
81
-
82
- GOAWAY = {
83
- type: :goaway,
84
- last_stream: 2,
85
- error: :no_error,
86
- payload: 'debug'.freeze,
87
- }.freeze
88
-
89
- WINDOW_UPDATE = {
90
- type: :window_update,
91
- increment: 10,
92
- }.freeze
93
-
94
- CONTINUATION = {
95
- type: :continuation,
96
- flags: [:end_headers].freeze,
97
- payload: '-second-block'.freeze,
98
- }.freeze
99
-
100
- ALTSVC = {
101
- type: :altsvc,
102
- max_age: 1_402_290_402, # 4
103
- port: 8080, # 2 reserved 1
104
- proto: 'h2-12'.freeze, # 1 + 5
105
- host: 'www.example.com'.freeze, # 1 + 15
106
- origin: 'www.example.com'.freeze, # 15
107
- }.freeze
108
-
109
- FRAME_TYPES = [
110
- DATA,
111
- HEADERS,
112
- PRIORITY,
113
- RST_STREAM,
114
- SETTINGS,
115
- PUSH_PROMISE,
116
- PING,
117
- GOAWAY,
118
- WINDOW_UPDATE,
119
- CONTINUATION,
120
- ALTSVC,
121
- ].freeze
16
+ # rubocop: enable Style/MixinUsage
17
+
18
+ REQUEST_HEADERS = [%w(:scheme https),
19
+ %w(:path /),
20
+ %w(:authority example.com),
21
+ %w(:method GET),
22
+ %w(a b)].freeze
23
+ RESPONSE_HEADERS = [%w(:status 200)].freeze
24
+
25
+ module FrameHelpers
26
+ def data_frame
27
+ {
28
+ type: :data,
29
+ flags: [:end_stream],
30
+ stream: 1,
31
+ payload: 'text',
32
+ }
33
+ end
34
+
35
+ def headers_frame
36
+ {
37
+ type: :headers,
38
+ flags: [:end_headers].freeze,
39
+ stream: 1,
40
+ payload: Compressor.new.encode(REQUEST_HEADERS),
41
+ }
42
+ end
43
+
44
+ def priority_frame
45
+ {
46
+ type: :priority,
47
+ stream: 1,
48
+ exclusive: false,
49
+ stream_dependency: 0,
50
+ weight: 20,
51
+ }
52
+ end
53
+
54
+ def rst_stream_frame
55
+ {
56
+ type: :rst_stream,
57
+ stream: 1,
58
+ error: :stream_closed,
59
+ }
60
+ end
61
+
62
+ def settings_frame
63
+ {
64
+ type: :settings,
65
+ stream: 0,
66
+ payload: [
67
+ [:settings_max_concurrent_streams, 10],
68
+ [:settings_initial_window_size, 0x7fffffff],
69
+ ],
70
+ }
71
+ end
72
+
73
+ def push_promise_frame
74
+ {
75
+ type: :push_promise,
76
+ flags: [:end_headers],
77
+ stream: 1,
78
+ promise_stream: 2,
79
+ payload: Compressor.new.encode([%w(a b)]),
80
+ }
81
+ end
82
+
83
+ def ping_frame
84
+ {
85
+ stream: 0,
86
+ type: :ping,
87
+ payload: '12345678',
88
+ }
89
+ end
90
+
91
+ def pong_frame
92
+ {
93
+ stream: 0,
94
+ type: :ping,
95
+ flags: [:ack],
96
+ payload: '12345678',
97
+ }
98
+ end
99
+
100
+ def goaway_frame
101
+ {
102
+ type: :goaway,
103
+ last_stream: 2,
104
+ error: :no_error,
105
+ payload: 'debug',
106
+ }
107
+ end
108
+
109
+ def window_update_frame
110
+ {
111
+ type: :window_update,
112
+ increment: 10,
113
+ }
114
+ end
115
+
116
+ def continuation_frame
117
+ {
118
+ type: :continuation,
119
+ flags: [:end_headers],
120
+ payload: '-second-block',
121
+ }
122
+ end
123
+
124
+ def altsvc_frame
125
+ {
126
+ type: :altsvc,
127
+ max_age: 1_402_290_402, # 4
128
+ port: 8080, # 2 reserved 1
129
+ proto: 'h2-12', # 1 + 5
130
+ host: 'www.example.com', # 1 + 15
131
+ origin: 'www.example.com' # 15
132
+ }
133
+ end
134
+
135
+ def frame_types
136
+ methods.select { |meth| meth.to_s.end_with?('_frame') }
137
+ .map { |meth| __send__(meth) }
138
+ end
139
+ end
122
140
 
123
141
  def set_stream_id(bytes, id)
124
142
  scheme = 'CnCCN'.freeze
@@ -1,6 +1,7 @@
1
1
  require 'helper'
2
2
 
3
3
  RSpec.describe HTTP2::Server do
4
+ include FrameHelpers
4
5
  before(:each) do
5
6
  @srv = Server.new
6
7
  end
@@ -41,11 +42,11 @@ RSpec.describe HTTP2::Server do
41
42
 
42
43
  @srv.on(:stream) do |stream|
43
44
  expect do
44
- stream.promise(':method' => 'GET') {}
45
+ stream.promise({ ':method' => 'GET' }) {}
45
46
  end.to_not raise_error
46
47
  end
47
48
 
48
49
  client.new_stream
49
- client.send HEADERS.deep_dup
50
+ client.send headers_frame
50
51
  end
51
52
  end
@@ -1,6 +1,7 @@
1
1
  require 'helper'
2
2
 
3
3
  RSpec.describe HTTP2::Stream do
4
+ include FrameHelpers
4
5
  before(:each) do
5
6
  @client = Client.new
6
7
  @stream = @client.new_stream
@@ -18,57 +19,57 @@ RSpec.describe HTTP2::Stream do
18
19
 
19
20
  context 'idle' do
20
21
  it 'should transition to open on sent HEADERS' do
21
- @stream.send HEADERS.deep_dup
22
+ @stream.send headers_frame
22
23
  expect(@stream.state).to eq :open
23
24
  end
24
25
  it 'should transition to open on received HEADERS' do
25
- @stream.receive HEADERS
26
+ @stream.receive headers_frame
26
27
  expect(@stream.state).to eq :open
27
28
  end
28
29
  it 'should transition to reserved (local) on sent PUSH_PROMISE' do
29
- @stream.send PUSH_PROMISE.deep_dup
30
+ @stream.send push_promise_frame
30
31
  expect(@stream.state).to eq :reserved_local
31
32
  end
32
33
  it 'should transition to reserved (remote) on received PUSH_PROMISE' do
33
- @stream.receive PUSH_PROMISE
34
+ @stream.receive push_promise_frame
34
35
  expect(@stream.state).to eq :reserved_remote
35
36
  end
36
37
  it 'should reprioritize stream on sent PRIORITY' do
37
- expect { @stream.send PRIORITY.dup }.to_not raise_error
38
+ expect { @stream.send priority_frame }.to_not raise_error
38
39
  expect(@stream.weight).to eq 20
39
40
  end
40
41
  it 'should reprioritize stream on received PRIORITY' do
41
- expect { @stream.send PRIORITY.dup }.to_not raise_error
42
+ expect { @stream.send priority_frame }.to_not raise_error
42
43
  expect(@stream.weight).to eq 20
43
44
  end
44
45
  end
45
46
 
46
47
  context 'reserved (local)' do
47
- before(:each) { @stream.send PUSH_PROMISE.deep_dup }
48
+ before(:each) { @stream.send push_promise_frame }
48
49
 
49
50
  it 'should transition on sent PUSH_PROMISE' do
50
51
  expect(@stream.state).to eq :reserved_local
51
52
  end
52
53
 
53
54
  it 'should allow HEADERS to be sent' do
54
- expect { @stream.send HEADERS.deep_dup }.to_not raise_error
55
+ expect { @stream.send headers_frame }.to_not raise_error
55
56
  end
56
57
 
57
58
  it 'should raise error if sending invalid frames' do
58
- (FRAME_TYPES - [HEADERS, RST_STREAM]).each do |type|
59
+ frame_types.reject { |frame| %i[headers rst_stream].include?(frame[:type]) }.each do |type|
59
60
  expect { @stream.dup.send type }.to raise_error InternalError
60
61
  end
61
62
  end
62
63
 
63
64
  it 'should raise error on receipt of invalid frames' do
64
- what_types = (FRAME_TYPES - [PRIORITY, RST_STREAM, WINDOW_UPDATE])
65
+ what_types = frame_types.reject { |frame| %i[priority window_update rst_stream].include?(frame[:type]) }
65
66
  what_types.each do |type|
66
67
  expect { @stream.dup.receive type }.to raise_error InternalError
67
68
  end
68
69
  end
69
70
 
70
71
  it 'should transition to half closed (remote) on sent HEADERS' do
71
- @stream.send HEADERS.deep_dup
72
+ @stream.send headers_frame
72
73
  expect(@stream.state).to eq :half_closed_remote
73
74
  end
74
75
 
@@ -78,42 +79,42 @@ RSpec.describe HTTP2::Stream do
78
79
  end
79
80
 
80
81
  it 'should transition to closed on received RST_STREAM' do
81
- @stream.receive RST_STREAM
82
+ @stream.receive rst_stream_frame
82
83
  expect(@stream.state).to eq :closed
83
84
  end
84
85
 
85
86
  it 'should reprioritize stream on PRIORITY' do
86
- expect { @stream.receive PRIORITY }.to_not raise_error
87
+ expect { @stream.receive priority_frame }.to_not raise_error
87
88
  expect(@stream.weight).to eq 20
88
89
  end
89
90
 
90
91
  it 'should increment remote_window on received WINDOW_UPDATE' do
91
- expect { @stream.receive WINDOW_UPDATE }.to_not raise_error
92
- expect(@stream.remote_window).to eq DEFAULT_FLOW_WINDOW + WINDOW_UPDATE[:increment]
92
+ expect { @stream.receive window_update_frame }.to_not raise_error
93
+ expect(@stream.remote_window).to eq DEFAULT_FLOW_WINDOW + window_update_frame[:increment]
93
94
  end
94
95
  end
95
96
 
96
97
  context 'reserved (remote)' do
97
- before(:each) { @stream.receive PUSH_PROMISE }
98
+ before(:each) { @stream.receive push_promise_frame }
98
99
 
99
100
  it 'should transition on received PUSH_PROMISE' do
100
101
  expect(@stream.state).to eq :reserved_remote
101
102
  end
102
103
 
103
104
  it 'should raise error if sending invalid frames' do
104
- (FRAME_TYPES - [PRIORITY, RST_STREAM, WINDOW_UPDATE]).each do |type|
105
+ frame_types.reject { |frame| %i[priority rst_stream window_update].include?(frame[:type]) }.each do |type|
105
106
  expect { @stream.dup.send type }.to raise_error InternalError
106
107
  end
107
108
  end
108
109
 
109
110
  it 'should raise error on receipt of invalid frames' do
110
- (FRAME_TYPES - [HEADERS, RST_STREAM]).each do |type|
111
+ frame_types.reject { |frame| %i[headers rst_stream].include?(frame[:type]) }.each do |type|
111
112
  expect { @stream.dup.receive type }.to raise_error InternalError
112
113
  end
113
114
  end
114
115
 
115
116
  it 'should transition to half closed (local) on received HEADERS' do
116
- @stream.receive HEADERS
117
+ @stream.receive headers_frame
117
118
  expect(@stream.state).to eq :half_closed_local
118
119
  end
119
120
 
@@ -123,38 +124,38 @@ RSpec.describe HTTP2::Stream do
123
124
  end
124
125
 
125
126
  it 'should transition to closed on received RST_STREAM' do
126
- @stream.receive RST_STREAM
127
+ @stream.receive rst_stream_frame
127
128
  expect(@stream.state).to eq :closed
128
129
  end
129
130
 
130
131
  it 'should reprioritize stream on PRIORITY' do
131
- expect { @stream.send PRIORITY.dup }.to_not raise_error
132
+ expect { @stream.send priority_frame }.to_not raise_error
132
133
  expect(@stream.weight).to eq 20
133
134
  end
134
135
 
135
136
  it 'should increment local_window on sent WINDOW_UPDATE' do
136
- expect { @stream.send WINDOW_UPDATE.dup }.to_not raise_error
137
- expect(@stream.local_window).to eq DEFAULT_FLOW_WINDOW + WINDOW_UPDATE[:increment]
137
+ expect { @stream.send window_update_frame }.to_not raise_error
138
+ expect(@stream.local_window).to eq DEFAULT_FLOW_WINDOW + window_update_frame[:increment]
138
139
  end
139
140
  end
140
141
 
141
142
  context 'open' do
142
- before(:each) { @stream.receive HEADERS }
143
+ before(:each) { @stream.receive headers_frame }
143
144
 
144
145
  it 'should allow any valid frames types to be sent' do
145
- (FRAME_TYPES - [PING, GOAWAY, SETTINGS]).each do |type|
146
+ (frame_types - [ping_frame, goaway_frame, settings_frame]).each do |type|
146
147
  expect { @stream.dup.send type.deep_dup }.to_not raise_error
147
148
  end
148
149
  end
149
150
 
150
151
  it 'should allow frames of any type to be received' do
151
- FRAME_TYPES.each do |type|
152
+ frame_types.each do |type|
152
153
  expect { @stream.dup.receive type }.to_not raise_error
153
154
  end
154
155
  end
155
156
 
156
157
  it 'should transition to half closed (local) if sending END_STREAM' do
157
- [DATA, HEADERS].each do |frame|
158
+ [data_frame, headers_frame].each do |frame|
158
159
  s, f = @stream.dup, frame.deep_dup
159
160
  f[:flags] = [:end_stream]
160
161
 
@@ -164,7 +165,7 @@ RSpec.describe HTTP2::Stream do
164
165
  end
165
166
 
166
167
  it 'should transition to half closed (remote) if receiving END_STREAM' do
167
- [DATA, HEADERS].each do |frame|
168
+ [data_frame, headers_frame].each do |frame|
168
169
  s, f = @stream.dup, frame.dup
169
170
  f[:flags] = [:end_stream]
170
171
 
@@ -175,7 +176,7 @@ RSpec.describe HTTP2::Stream do
175
176
 
176
177
  it 'should transition to half closed if remote opened with END_STREAM' do
177
178
  s = @client.new_stream
178
- hclose = HEADERS.dup
179
+ hclose = headers_frame
179
180
  hclose[:flags] = [:end_stream]
180
181
 
181
182
  s.receive hclose
@@ -184,7 +185,7 @@ RSpec.describe HTTP2::Stream do
184
185
 
185
186
  it 'should transition to half closed if local opened with END_STREAM' do
186
187
  s = @client.new_stream
187
- hclose = HEADERS.deep_dup
188
+ hclose = headers_frame
188
189
  hclose[:flags] = [:end_stream]
189
190
 
190
191
  s.send hclose
@@ -194,10 +195,11 @@ RSpec.describe HTTP2::Stream do
194
195
  it 'should transition to closed if sending RST_STREAM' do
195
196
  @stream.close
196
197
  expect(@stream.state).to eq :closed
198
+ expect(@stream).to be_closed
197
199
  end
198
200
 
199
201
  it 'should transition to closed if receiving RST_STREAM' do
200
- @stream.receive RST_STREAM
202
+ @stream.receive rst_stream_frame
201
203
  expect(@stream.state).to eq :closed
202
204
  end
203
205
 
@@ -208,8 +210,8 @@ RSpec.describe HTTP2::Stream do
208
210
  sp.on(:active) { openp = true }
209
211
  sr.on(:active) { openr = true }
210
212
 
211
- sp.receive HEADERS
212
- sr.send HEADERS.deep_dup
213
+ sp.receive headers_frame
214
+ sr.send headers_frame
213
215
 
214
216
  expect(openp).to be_truthy
215
217
  expect(openr).to be_truthy
@@ -222,11 +224,11 @@ RSpec.describe HTTP2::Stream do
222
224
  stream.on(:half_close) { order << :half_close }
223
225
  stream.on(:close) { order << :close }
224
226
 
225
- req = HEADERS.deep_dup
227
+ req = headers_frame
226
228
  req[:flags] = [:end_headers]
227
229
 
228
230
  stream.send req
229
- stream.send DATA.dup
231
+ stream.send data_frame
230
232
  expect(order).to eq [:active, :half_close]
231
233
  end
232
234
 
@@ -237,7 +239,7 @@ RSpec.describe HTTP2::Stream do
237
239
  sp.on(:close) { closep = true }
238
240
  sr.on(:close) { closer = true }
239
241
 
240
- sp.receive RST_STREAM
242
+ sp.receive rst_stream_frame
241
243
  sr.close
242
244
 
243
245
  expect(closep).to be_truthy
@@ -252,12 +254,12 @@ RSpec.describe HTTP2::Stream do
252
254
  stream.on(:half_close) { order << :half_close }
253
255
  stream.on(:close) { order << :close }
254
256
 
255
- req = HEADERS.deep_dup
257
+ req = headers_frame
256
258
  req[:flags] = [:end_stream, :end_headers]
257
259
 
258
260
  stream.send req
259
- stream.receive HEADERS
260
- stream.receive DATA
261
+ stream.receive headers_frame
262
+ stream.receive data_frame
261
263
 
262
264
  expect(order).to eq [:active, :half_close, :data, :close]
263
265
  end
@@ -265,31 +267,31 @@ RSpec.describe HTTP2::Stream do
265
267
  it 'should emit :close with reason' do
266
268
  reason = nil
267
269
  @stream.on(:close) { |r| reason = r }
268
- @stream.receive RST_STREAM
270
+ @stream.receive rst_stream_frame
269
271
  expect(reason).not_to be_nil
270
272
  end
271
273
 
272
274
  it 'should reprioritize stream on sent PRIORITY' do
273
- expect { @stream.send PRIORITY.dup }.to_not raise_error
275
+ expect { @stream.send priority_frame }.to_not raise_error
274
276
  expect(@stream.weight).to eq 20
275
277
  end
276
278
  it 'should reprioritize stream on received PRIORITY' do
277
- expect { @stream.receive PRIORITY }.to_not raise_error
279
+ expect { @stream.receive priority_frame }.to_not raise_error
278
280
  expect(@stream.weight).to eq 20
279
281
  end
280
282
  end
281
283
 
282
284
  context 'half closed (local)' do
283
- before(:each) { @stream.send HEADERS_END_STREAM.deep_dup }
285
+ before(:each) { @stream.send headers_frame.merge(flags: [:end_headers, :end_stream]) }
284
286
 
285
287
  it 'should raise error on attempt to send invalid frames' do
286
- (FRAME_TYPES - [PRIORITY, RST_STREAM, WINDOW_UPDATE]).each do |frame|
288
+ frame_types.reject { |frame| %i[priority rst_stream window_update].include?(frame[:type]) }.each do |frame|
287
289
  expect { @stream.dup.send frame }.to raise_error InternalError
288
290
  end
289
291
  end
290
292
 
291
293
  it 'should transition to closed on receipt of END_STREAM flag' do
292
- [DATA, HEADERS, CONTINUATION].each do |frame|
294
+ [data_frame, headers_frame, continuation_frame].each do |frame|
293
295
  s, f = @stream.dup, frame.dup
294
296
  f[:flags] = [:end_stream]
295
297
 
@@ -299,38 +301,38 @@ RSpec.describe HTTP2::Stream do
299
301
  end
300
302
 
301
303
  it 'should transition to closed on receipt of RST_STREAM frame' do
302
- @stream.receive RST_STREAM
304
+ @stream.receive rst_stream_frame
303
305
  expect(@stream.state).to eq :closed
304
306
  end
305
307
 
306
308
  it 'should transition to closed if RST_STREAM frame is sent' do
307
- @stream.send RST_STREAM.deep_dup
309
+ @stream.send rst_stream_frame
308
310
  expect(@stream.state).to eq :closed
309
311
  end
310
312
 
311
313
  it 'should ignore received WINDOW_UPDATE frames' do
312
- expect { @stream.receive WINDOW_UPDATE }.to_not raise_error
314
+ expect { @stream.receive window_update_frame }.to_not raise_error
313
315
  expect(@stream.state).to eq :half_closed_local
314
316
  end
315
317
 
316
318
  it 'should ignore received PRIORITY frames' do
317
- expect { @stream.receive PRIORITY }.to_not raise_error
319
+ expect { @stream.receive priority_frame }.to_not raise_error
318
320
  expect(@stream.state).to eq :half_closed_local
319
321
  end
320
322
 
321
323
  it 'should reprioritize stream on sent PRIORITY' do
322
- expect { @stream.send PRIORITY.dup }.to_not raise_error
324
+ expect { @stream.send priority_frame }.to_not raise_error
323
325
  expect(@stream.weight).to eq 20
324
326
  end
325
327
 
326
328
  it 'should reprioritize stream (and decendants) on received PRIORITY' do
327
- expect { @stream.receive PRIORITY }.to_not raise_error
329
+ expect { @stream.receive priority_frame }.to_not raise_error
328
330
  expect(@stream.weight).to eq 20
329
331
  end
330
332
 
331
333
  it 'should increment local_window on sent WINDOW_UPDATE' do
332
- expect { @stream.send WINDOW_UPDATE.dup }.to_not raise_error
333
- expect(@stream.local_window).to eq DEFAULT_FLOW_WINDOW + WINDOW_UPDATE[:increment]
334
+ expect { @stream.send window_update_frame }.to_not raise_error
335
+ expect(@stream.local_window).to eq DEFAULT_FLOW_WINDOW + window_update_frame[:increment]
334
336
  end
335
337
 
336
338
  it 'should emit :half_close event on transition' do
@@ -339,7 +341,7 @@ RSpec.describe HTTP2::Stream do
339
341
  stream.on(:active) { order << :active }
340
342
  stream.on(:half_close) { order << :half_close }
341
343
 
342
- req = HEADERS.deep_dup
344
+ req = headers_frame
343
345
  req[:flags] = [:end_stream, :end_headers]
344
346
 
345
347
  stream.send req
@@ -349,7 +351,7 @@ RSpec.describe HTTP2::Stream do
349
351
  it 'should emit :close event on transition to closed' do
350
352
  closed = false
351
353
  @stream.on(:close) { closed = true }
352
- @stream.receive RST_STREAM
354
+ @stream.receive rst_stream_frame
353
355
 
354
356
  expect(@stream.state).to eq :closed
355
357
  expect(closed).to be_truthy
@@ -357,10 +359,10 @@ RSpec.describe HTTP2::Stream do
357
359
  end
358
360
 
359
361
  context 'half closed (remote)' do
360
- before(:each) { @stream.receive HEADERS_END_STREAM }
362
+ before(:each) { @stream.receive headers_frame.merge(flags: [:end_headers, :end_stream]) }
361
363
 
362
364
  it 'should raise STREAM_CLOSED error on reciept of frames' do
363
- (FRAME_TYPES - [PRIORITY, RST_STREAM, WINDOW_UPDATE]).each do |frame|
365
+ (frame_types - [priority_frame, rst_stream_frame, window_update_frame]).each do |frame|
364
366
  expect do
365
367
  @stream.dup.receive frame
366
368
  end.to raise_error(StreamClosed)
@@ -368,7 +370,7 @@ RSpec.describe HTTP2::Stream do
368
370
  end
369
371
 
370
372
  it 'should transition to closed if END_STREAM flag is sent' do
371
- [DATA, HEADERS].each do |frame|
373
+ [data_frame, headers_frame].each do |frame|
372
374
  s, f = @stream.dup, frame.deep_dup
373
375
  f[:flags] = [:end_stream]
374
376
 
@@ -408,26 +410,26 @@ RSpec.describe HTTP2::Stream do
408
410
  end
409
411
 
410
412
  it 'should transition to closed on reciept of RST_STREAM frame' do
411
- @stream.receive RST_STREAM
413
+ @stream.receive rst_stream_frame
412
414
  expect(@stream.state).to eq :closed
413
415
  end
414
416
 
415
417
  it 'should ignore sent WINDOW_UPDATE frames' do
416
- expect { @stream.send WINDOW_UPDATE.dup }.to_not raise_error
418
+ expect { @stream.send window_update_frame }.to_not raise_error
417
419
  expect(@stream.state).to eq :half_closed_remote
418
420
  end
419
421
 
420
422
  it 'should increment remote_window on received WINDOW_UPDATE' do
421
- expect { @stream.receive WINDOW_UPDATE }.to_not raise_error
422
- expect(@stream.remote_window).to eq DEFAULT_FLOW_WINDOW + WINDOW_UPDATE[:increment]
423
+ expect { @stream.receive window_update_frame }.to_not raise_error
424
+ expect(@stream.remote_window).to eq DEFAULT_FLOW_WINDOW + window_update_frame[:increment]
423
425
  end
424
426
 
425
427
  it 'should reprioritize stream on sent PRIORITY' do
426
- expect { @stream.send PRIORITY.dup }.to_not raise_error
428
+ expect { @stream.send priority_frame }.to_not raise_error
427
429
  expect(@stream.weight).to eq 20
428
430
  end
429
431
  it 'should reprioritize stream on received PRIORITY' do
430
- expect { @stream.receive PRIORITY }.to_not raise_error
432
+ expect { @stream.receive priority_frame }.to_not raise_error
431
433
  expect(@stream.weight).to eq 20
432
434
  end
433
435
 
@@ -437,7 +439,7 @@ RSpec.describe HTTP2::Stream do
437
439
  stream.on(:active) { order << :active }
438
440
  stream.on(:half_close) { order << :half_close }
439
441
 
440
- req = HEADERS.dup
442
+ req = headers_frame
441
443
  req[:flags] = [:end_stream, :end_headers]
442
444
 
443
445
  stream.receive req
@@ -457,12 +459,12 @@ RSpec.describe HTTP2::Stream do
457
459
  context 'closed' do
458
460
  context 'remote closed stream' do
459
461
  before(:each) do
460
- @stream.send HEADERS_END_STREAM.deep_dup # half closed local
461
- @stream.receive HEADERS_END_STREAM # closed by remote
462
+ @stream.send headers_frame.merge(flags: [:end_headers, :end_stream]) # half closed local
463
+ @stream.receive headers_frame.merge(flags: [:end_headers, :end_stream]) # closed by remote
462
464
  end
463
465
 
464
466
  it 'should raise STREAM_CLOSED on attempt to send frames' do
465
- (FRAME_TYPES - [PRIORITY, RST_STREAM]).each do |frame|
467
+ (frame_types - [priority_frame, rst_stream_frame]).each do |frame|
466
468
  expect do
467
469
  @stream.dup.send frame
468
470
  end.to raise_error(StreamClosed)
@@ -470,7 +472,7 @@ RSpec.describe HTTP2::Stream do
470
472
  end
471
473
 
472
474
  it 'should raise STREAM_CLOSED on receipt of frame' do
473
- (FRAME_TYPES - [PRIORITY, RST_STREAM, WINDOW_UPDATE]).each do |frame|
475
+ (frame_types - [priority_frame, rst_stream_frame, window_update_frame]).each do |frame|
474
476
  expect do
475
477
  @stream.dup.receive frame
476
478
  end.to raise_error(StreamClosed)
@@ -478,38 +480,38 @@ RSpec.describe HTTP2::Stream do
478
480
  end
479
481
 
480
482
  it 'should allow PRIORITY, RST_STREAM to be sent' do
481
- expect { @stream.send PRIORITY.dup }.to_not raise_error
482
- expect { @stream.send RST_STREAM.dup }.to_not raise_error
483
+ expect { @stream.send priority_frame }.to_not raise_error
484
+ expect { @stream.send rst_stream_frame }.to_not raise_error
483
485
  end
484
486
 
485
487
  it 'should allow PRIORITY, RST_STREAM to be received' do
486
- expect { @stream.receive PRIORITY }.to_not raise_error
487
- expect { @stream.receive RST_STREAM }.to_not raise_error
488
+ expect { @stream.receive priority_frame }.to_not raise_error
489
+ expect { @stream.receive rst_stream_frame }.to_not raise_error
488
490
  end
489
491
 
490
492
  it 'should reprioritize stream on sent PRIORITY' do
491
- expect { @stream.send PRIORITY.dup }.to_not raise_error
493
+ expect { @stream.send priority_frame }.to_not raise_error
492
494
  expect(@stream.weight).to eq 20
493
495
  end
494
496
  it 'should reprioritize stream on received PRIORITY' do
495
- expect { @stream.receive PRIORITY }.to_not raise_error
497
+ expect { @stream.receive priority_frame }.to_not raise_error
496
498
  expect(@stream.weight).to eq 20
497
499
  end
498
500
 
499
501
  it 'should ignore received WINDOW_UPDATE frames' do
500
- expect { @stream.receive WINDOW_UPDATE }.to_not raise_error
502
+ expect { @stream.receive window_update_frame }.to_not raise_error
501
503
  expect(@stream.state).to eq :closed
502
504
  end
503
505
  end
504
506
 
505
507
  context 'local closed via RST_STREAM frame' do
506
508
  before(:each) do
507
- @stream.send HEADERS.deep_dup # open
508
- @stream.send RST_STREAM.deep_dup # closed by local
509
+ @stream.send headers_frame # open
510
+ @stream.send rst_stream_frame # closed by local
509
511
  end
510
512
 
511
513
  it 'should ignore received frames' do
512
- (FRAME_TYPES - [PUSH_PROMISE]).each do |frame|
514
+ (frame_types - [push_promise_frame]).each do |frame|
513
515
  expect do
514
516
  cb = []
515
517
  @stream.on(:data) { cb << :data }
@@ -532,12 +534,12 @@ RSpec.describe HTTP2::Stream do
532
534
  # FIXME: Isn't this test same as "half closed (local)"?
533
535
  # context "local closed via END_STREAM flag" do
534
536
  # before(:each) do
535
- # @stream.send HEADERS # open
536
- # @stream.send DATA # contains end_stream flag
537
+ # @stream.send headers_frame # open
538
+ # @stream.send data_frame # contains end_stream flag
537
539
  # end
538
540
 
539
541
  # it "should ignore received frames" do
540
- # FRAME_TYPES.each do |frame|
542
+ # frame_types.each do |frame|
541
543
  # expect { @stream.dup.receive frame }.to_not raise_error
542
544
  # end
543
545
  # end
@@ -553,31 +555,31 @@ RSpec.describe HTTP2::Stream do
553
555
  end
554
556
 
555
557
  it 'should update window size on DATA frames only' do
556
- @stream.send HEADERS.deep_dup # go to open
558
+ @stream.send headers_frame # go to open
557
559
  expect(@stream.remote_window).to eq DEFAULT_FLOW_WINDOW
558
560
 
559
- (FRAME_TYPES - [DATA, PING, GOAWAY, SETTINGS]).each do |frame|
561
+ (frame_types - [data_frame, ping_frame, goaway_frame, settings_frame]).each do |frame|
560
562
  s = @stream.dup
561
563
  s.send frame.deep_dup
562
564
  expect(s.remote_window).to eq DEFAULT_FLOW_WINDOW
563
565
  end
564
566
 
565
- @stream.send DATA.dup
566
- expect(@stream.remote_window).to eq DEFAULT_FLOW_WINDOW - DATA[:payload].bytesize
567
+ @stream.send data_frame
568
+ expect(@stream.remote_window).to eq DEFAULT_FLOW_WINDOW - data_frame[:payload].bytesize
567
569
  end
568
570
 
569
571
  it 'should update window size on receipt of WINDOW_UPDATE' do
570
- @stream.send HEADERS.deep_dup
571
- @stream.send DATA.dup
572
- @stream.receive WINDOW_UPDATE
572
+ @stream.send headers_frame
573
+ @stream.send data_frame
574
+ @stream.receive window_update_frame
573
575
 
574
576
  expect(@stream.remote_window).to eq(
575
- DEFAULT_FLOW_WINDOW - DATA[:payload].bytesize + WINDOW_UPDATE[:increment],
577
+ DEFAULT_FLOW_WINDOW - data_frame[:payload].bytesize + window_update_frame[:increment],
576
578
  )
577
579
  end
578
580
 
579
581
  it 'should observe session flow control' do
580
- settings, data = SETTINGS.dup, DATA.dup
582
+ settings, data = settings_frame, data_frame
581
583
  settings[:payload] = [[:settings_initial_window_size, 1000]]
582
584
  settings[:stream] = 0
583
585
 
@@ -585,7 +587,7 @@ RSpec.describe HTTP2::Stream do
585
587
  @client << framer.generate(settings)
586
588
 
587
589
  s1 = @client.new_stream
588
- s1.send HEADERS.deep_dup
590
+ s1.send headers_frame
589
591
  s1.send data.merge(payload: 'x' * 900, flags: [])
590
592
  expect(s1.remote_window).to eq 100
591
593
 
@@ -593,31 +595,31 @@ RSpec.describe HTTP2::Stream do
593
595
  expect(s1.remote_window).to eq 0
594
596
  expect(s1.buffered_amount).to eq 100
595
597
 
596
- @client << framer.generate(WINDOW_UPDATE.merge(stream: s1.id, increment: 1000))
598
+ @client << framer.generate(window_update_frame.merge(stream: s1.id, increment: 1000))
597
599
  expect(s1.buffered_amount).to eq 0
598
600
  expect(s1.remote_window).to eq 900
599
601
  end
600
602
 
601
603
  it 'should not update window when data received is less than half of maximum local window size' do
602
- data = DATA.deep_dup
604
+ data = data_frame
603
605
  datalen = data[:payload].bytesize
604
606
  expect(@stream).not_to receive(:send) do |frame|
605
607
  expect(frame[:type]).to eq :window_update
606
608
  expect(frame[:increment]).to eq datalen
607
609
  end
608
- @stream.receive HEADERS.deep_dup
610
+ @stream.receive headers_frame
609
611
  @stream.receive data
610
612
  end
611
613
 
612
614
  it 'should update window when data received is over half of the maximum local window size' do
613
- data1 = DATA.merge(payload: 'a'*16_384, flags: [])
614
- data2 = DATA.merge(payload: 'a'*16_384)
615
+ data1 = data_frame.merge(payload: 'a'*16_384, flags: [])
616
+ data2 = data_frame.merge(payload: 'a'*16_384)
615
617
  datalen = 16_384 * 2
616
618
  expect(@stream).to receive(:send) do |frame|
617
619
  expect(frame[:type]).to eq :window_update
618
620
  expect(frame[:increment]).to eq datalen
619
621
  end
620
- @stream.receive HEADERS.deep_dup
622
+ @stream.receive headers_frame
621
623
  @stream.receive data1
622
624
  @stream.receive data2
623
625
  end
@@ -749,7 +751,7 @@ RSpec.describe HTTP2::Stream do
749
751
  end
750
752
 
751
753
  it 'should emit received headers via on(:headers)' do
752
- headers, recv = [%w(header value)], nil
754
+ headers, recv = REQUEST_HEADERS, nil
753
755
  @srv.on(:stream) do |stream|
754
756
  stream.on(:headers) { |h| recv = h }
755
757
  end
@@ -766,7 +768,7 @@ RSpec.describe HTTP2::Stream do
766
768
  end
767
769
  end
768
770
 
769
- @client_stream.headers('key' => 'value')
771
+ @client_stream.headers(REQUEST_HEADERS)
770
772
  @client_stream.data(payload)
771
773
  end
772
774
 
@@ -782,7 +784,7 @@ RSpec.describe HTTP2::Stream do
782
784
  end
783
785
  end
784
786
 
785
- @client_stream.headers('key' => 'value')
787
+ @client_stream.headers(REQUEST_HEADERS)
786
788
  @client_stream.reprioritize(weight: new_weight, dependency: new_dependency)
787
789
  expect(callback_called).to be
788
790
  end
@@ -794,18 +796,18 @@ RSpec.describe HTTP2::Stream do
794
796
  @server_stream = stream
795
797
  end
796
798
 
797
- @client_stream.headers('key' => 'value')
799
+ @client_stream.headers(REQUEST_HEADERS)
798
800
  end
799
801
 
800
802
  it '.promise should emit server initiated stream' do
801
803
  push = nil
802
- @server_stream.promise('key' => 'val') { |pstream| push = pstream }
804
+ @server_stream.promise(REQUEST_HEADERS) { |pstream| push = pstream }
803
805
  expect(push.id).to eq 2
804
806
  end
805
807
 
806
808
  it '.promise push stream should have parent stream' do
807
809
  push = nil
808
- @server_stream.promise('key' => 'val') { |pstream| push = pstream }
810
+ @server_stream.promise(REQUEST_HEADERS) { |pstream| push = pstream }
809
811
 
810
812
  expect(push.state).to eq :reserved_local
811
813
  expect(push.parent.id).to eq @server_stream.id
@@ -814,7 +816,7 @@ RSpec.describe HTTP2::Stream do
814
816
  context 'stream states' do
815
817
  it 'server: active > half close > close' do
816
818
  order = []
817
- @server_stream.promise('key' => 'val') do |push|
819
+ @server_stream.promise(REQUEST_HEADERS) do |push|
818
820
  stream = push
819
821
 
820
822
  expect(push.state).to eq :reserved_local
@@ -824,8 +826,8 @@ RSpec.describe HTTP2::Stream do
824
826
  push.on(:half_close) { order << :half_close }
825
827
  push.on(:close) { order << :close }
826
828
 
827
- push.headers('key2' => 'val2')
828
- push.send DATA.merge(stream: stream.id)
829
+ push.headers(RESPONSE_HEADERS)
830
+ push.send data_frame.merge(stream: stream.id)
829
831
  end
830
832
 
831
833
  expect(order).to eq [:reserved, :active, :half_close, :close]
@@ -853,13 +855,13 @@ RSpec.describe HTTP2::Stream do
853
855
  expect(push.id).to be_even
854
856
  end
855
857
 
856
- @server_stream.promise('key' => 'val') do |push|
857
- push.headers('key2' => 'val2')
858
+ @server_stream.promise(REQUEST_HEADERS) do |push|
859
+ push.headers(RESPONSE_HEADERS)
858
860
  push.data('somedata')
859
861
  end
860
862
 
861
- expect(promise_headers).to eq([%w(key val)])
862
- expect(headers).to eq([%w(key2 val2)])
863
+ expect(promise_headers).to eq(REQUEST_HEADERS)
864
+ expect(headers).to eq(RESPONSE_HEADERS)
863
865
  expect(order).to eq [
864
866
  :reserved,
865
867
  :promise_headers,