http-2 0.7.0 → 0.8.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.
@@ -1,6 +1,6 @@
1
- require "helper"
1
+ require 'helper'
2
2
 
3
- describe HTTP2::Emitter do
3
+ RSpec.describe HTTP2::Emitter do
4
4
  class Worker
5
5
  include Emitter
6
6
  end
@@ -10,45 +10,45 @@ describe HTTP2::Emitter do
10
10
  @cnt = 0
11
11
  end
12
12
 
13
- it "should raise error on missing callback" do
13
+ it 'should raise error on missing callback' do
14
14
  expect { @w.on(:a) {} }.to_not raise_error
15
15
  expect { @w.on(:a) }.to raise_error
16
16
  end
17
17
 
18
- it "should allow multiple callbacks on single event" do
18
+ it 'should allow multiple callbacks on single event' do
19
19
  @w.on(:a) { @cnt += 1 }
20
20
  @w.on(:a) { @cnt += 1 }
21
21
  @w.emit(:a)
22
22
 
23
- @cnt.should eq 2
23
+ expect(@cnt).to eq 2
24
24
  end
25
25
 
26
- it "should execute callback with optional args" do
26
+ it 'should execute callback with optional args' do
27
27
  args = nil
28
28
  @w.on(:a) { |a| args = a }
29
29
  @w.emit(:a, 123)
30
30
 
31
- args.should eq 123
31
+ expect(args).to eq 123
32
32
  end
33
33
 
34
- it "should pass emitted callbacks to listeners" do
34
+ it 'should pass emitted callbacks to listeners' do
35
35
  @w.on(:a) { |&block| block.call }
36
36
  @w.once(:a) { |&block| block.call }
37
37
  @w.emit(:a) { @cnt += 1 }
38
38
 
39
- @cnt.should eq 2
39
+ expect(@cnt).to eq 2
40
40
  end
41
41
 
42
- it "should allow events with no callbacks" do
42
+ it 'should allow events with no callbacks' do
43
43
  expect { @w.emit(:missing) }.to_not raise_error
44
44
  end
45
45
 
46
- it "should execute callback exactly once" do
46
+ it 'should execute callback exactly once' do
47
47
  @w.on(:a) { @cnt += 1 }
48
48
  @w.once(:a) { @cnt += 1 }
49
49
  @w.emit(:a)
50
50
  @w.emit(:a)
51
51
 
52
- @cnt.should eq 3
52
+ expect(@cnt).to eq 3
53
53
  end
54
54
  end
@@ -1,105 +1,104 @@
1
- require "helper"
2
-
3
- describe HTTP2::Framer do
1
+ require 'helper'
4
2
 
3
+ RSpec.describe HTTP2::Framer do
5
4
  let(:f) { Framer.new }
6
5
 
7
- context "common header" do
8
- let(:frame) {
6
+ context 'common header' do
7
+ let(:frame) do
9
8
  {
10
9
  length: 4,
11
10
  type: :headers,
12
11
  flags: [:end_stream, :end_headers],
13
12
  stream: 15,
14
13
  }
15
- }
14
+ end
16
15
 
17
- let(:bytes) { [0,0x04, 0x01, 0x5, 0x0000000F].pack("CnCCN") }
16
+ let(:bytes) { [0, 0x04, 0x01, 0x5, 0x0000000F].pack('CnCCN') }
18
17
 
19
- it "should generate common 9 byte header" do
20
- f.commonHeader(frame).should eq bytes
18
+ it 'should generate common 9 byte header' do
19
+ expect(f.common_header(frame)).to eq bytes
21
20
  end
22
21
 
23
- it "should parse common 9 byte header" do
24
- f.readCommonHeader(Buffer.new(bytes)).should eq frame
22
+ it 'should parse common 9 byte header' do
23
+ expect(f.read_common_header(Buffer.new(bytes))).to eq frame
25
24
  end
26
25
 
27
- it "should generate a large frame" do
26
+ it 'should generate a large frame' do
28
27
  f = Framer.new
29
- f.max_frame_size = 2**24-1
28
+ f.max_frame_size = 2**24 - 1
30
29
  frame = {
31
30
  length: 2**18 + 2**16 + 17,
32
31
  type: :headers,
33
32
  flags: [:end_stream, :end_headers],
34
33
  stream: 15,
35
34
  }
36
- bytes = [5, 17, 0x01, 0x5, 0x0000000F].pack("CnCCN")
37
- f.commonHeader(frame).should eq bytes
38
- f.readCommonHeader(Buffer.new(bytes)).should eq frame
35
+ bytes = [5, 17, 0x01, 0x5, 0x0000000F].pack('CnCCN')
36
+ expect(f.common_header(frame)).to eq bytes
37
+ expect(f.read_common_header(Buffer.new(bytes))).to eq frame
39
38
  end
40
39
 
41
- it "should raise exception on invalid frame type when sending" do
42
- expect {
40
+ it 'should raise exception on invalid frame type when sending' do
41
+ expect do
43
42
  frame[:type] = :bogus
44
- f.commonHeader(frame)
45
- }.to raise_error(CompressionError, /invalid.*type/i)
43
+ f.common_header(frame)
44
+ end.to raise_error(CompressionError, /invalid.*type/i)
46
45
  end
47
46
 
48
- it "should raise exception on invalid stream ID" do
49
- expect {
47
+ it 'should raise exception on invalid stream ID' do
48
+ expect do
50
49
  frame[:stream] = Framer::MAX_STREAM_ID + 1
51
- f.commonHeader(frame)
52
- }.to raise_error(CompressionError, /stream/i)
50
+ f.common_header(frame)
51
+ end.to raise_error(CompressionError, /stream/i)
53
52
  end
54
53
 
55
- it "should raise exception on invalid frame flag" do
56
- expect {
54
+ it 'should raise exception on invalid frame flag' do
55
+ expect do
57
56
  frame[:flags] = [:bogus]
58
- f.commonHeader(frame)
59
- }.to raise_error(CompressionError, /frame flag/)
57
+ f.common_header(frame)
58
+ end.to raise_error(CompressionError, /frame flag/)
60
59
  end
61
60
 
62
- it "should raise exception on invalid frame size" do
63
- expect {
61
+ it 'should raise exception on invalid frame size' do
62
+ expect do
64
63
  frame[:length] = 2**24
65
- f.commonHeader(frame)
66
- }.to raise_error(CompressionError, /too large/)
64
+ f.common_header(frame)
65
+ end.to raise_error(CompressionError, /too large/)
67
66
  end
68
67
  end
69
68
 
70
- context "DATA" do
71
- it "should generate and parse bytes" do
69
+ context 'DATA' do
70
+ it 'should generate and parse bytes' do
72
71
  frame = {
73
72
  length: 4,
74
73
  type: :data,
75
74
  flags: [:end_stream],
76
75
  stream: 1,
77
- payload: 'text'
76
+ payload: 'text',
78
77
  }
79
78
 
80
79
  bytes = f.generate(frame)
81
- bytes.should eq [0,0x4,0x0,0x1,0x1,*'text'.bytes].pack("CnCCNC*")
80
+ expect(bytes).to eq [0, 0x4, 0x0, 0x1, 0x1, *'text'.bytes].pack('CnCCNC*')
82
81
 
83
- f.parse(bytes).should eq frame
82
+ expect(f.parse(bytes)).to eq frame
84
83
  end
85
84
  end
86
85
 
87
- context "HEADERS" do
88
- it "should generate and parse bytes" do
86
+ context 'HEADERS' do
87
+ it 'should generate and parse bytes' do
89
88
  frame = {
90
89
  length: 12,
91
90
  type: :headers,
92
91
  flags: [:end_stream, :end_headers],
93
92
  stream: 1,
94
- payload: 'header-block'
93
+ payload: 'header-block',
95
94
  }
96
95
 
97
96
  bytes = f.generate(frame)
98
- bytes.should eq [0,0xc,0x1,0x5,0x1,*'header-block'.bytes].pack("CnCCNC*")
99
- f.parse(bytes).should eq frame
97
+ expect(bytes).to eq [0, 0xc, 0x1, 0x5, 0x1, *'header-block'.bytes].pack('CnCCNC*')
98
+ expect(f.parse(bytes)).to eq frame
100
99
  end
101
100
 
102
- it "should carry an optional stream priority" do
101
+ it 'should carry an optional stream priority' do
103
102
  frame = {
104
103
  length: 16,
105
104
  type: :headers,
@@ -108,17 +107,17 @@ describe HTTP2::Framer do
108
107
  stream_dependency: 15,
109
108
  weight: 12,
110
109
  exclusive: false,
111
- payload: 'header-block'
110
+ payload: 'header-block',
112
111
  }
113
112
 
114
113
  bytes = f.generate(frame)
115
- bytes.should eq [0,0x11,0x1,0x24,0x1,0xf,0xb,*'header-block'.bytes].pack("CnCCNNCC*")
116
- f.parse(bytes).should eq frame
114
+ expect(bytes).to eq [0, 0x11, 0x1, 0x24, 0x1, 0xf, 0xb, *'header-block'.bytes].pack('CnCCNNCC*')
115
+ expect(f.parse(bytes)).to eq frame
117
116
  end
118
117
  end
119
118
 
120
- context "PRIORITY" do
121
- it "should generate and parse bytes" do
119
+ context 'PRIORITY' do
120
+ it 'should generate and parse bytes' do
122
121
  frame = {
123
122
  length: 5,
124
123
  type: :priority,
@@ -129,28 +128,28 @@ describe HTTP2::Framer do
129
128
  }
130
129
 
131
130
  bytes = f.generate(frame)
132
- bytes.should eq [0,0x5,0x2,0x0,0x1,0x8000000f,0xb].pack("CnCCNNC")
133
- f.parse(bytes).should eq frame
131
+ expect(bytes).to eq [0, 0x5, 0x2, 0x0, 0x1, 0x8000000f, 0xb].pack('CnCCNNC')
132
+ expect(f.parse(bytes)).to eq frame
134
133
  end
135
134
  end
136
135
 
137
- context "RST_STREAM" do
138
- it "should generate and parse bytes" do
136
+ context 'RST_STREAM' do
137
+ it 'should generate and parse bytes' do
139
138
  frame = {
140
139
  length: 4,
141
140
  type: :rst_stream,
142
141
  stream: 1,
143
- error: :stream_closed
142
+ error: :stream_closed,
144
143
  }
145
144
 
146
145
  bytes = f.generate(frame)
147
- bytes.should eq [0,0x4,0x3,0x0,0x1,0x5].pack("CnCCNN")
148
- f.parse(bytes).should eq frame
146
+ expect(bytes).to eq [0, 0x4, 0x3, 0x0, 0x1, 0x5].pack('CnCCNN')
147
+ expect(f.parse(bytes)).to eq frame
149
148
  end
150
149
  end
151
150
 
152
- context "SETTINGS" do
153
- let(:frame) {
151
+ context 'SETTINGS' do
152
+ let(:frame) do
154
153
  {
155
154
  type: :settings,
156
155
  flags: [],
@@ -158,26 +157,26 @@ describe HTTP2::Framer do
158
157
  payload: [
159
158
  [:settings_max_concurrent_streams, 10],
160
159
  [:settings_header_table_size, 2048],
161
- ]
160
+ ],
162
161
  }
163
- }
162
+ end
164
163
 
165
- it "should generate and parse bytes" do
164
+ it 'should generate and parse bytes' do
166
165
  bytes = f.generate(frame)
167
- bytes.should eq [0,12,0x4,0x0,0x0,3,10,1,2048].pack("CnCCNnNnN")
166
+ expect(bytes).to eq [0, 12, 0x4, 0x0, 0x0, 3, 10, 1, 2048].pack('CnCCNnNnN')
168
167
  parsed = f.parse(bytes)
169
168
  parsed.delete(:length)
170
169
  frame.delete(:length)
171
- parsed.should eq frame
170
+ expect(parsed).to eq frame
172
171
  end
173
172
 
174
- it "should generate settings when id is given as an integer" do
173
+ it 'should generate settings when id is given as an integer' do
175
174
  frame[:payload][1][0] = 1
176
175
  bytes = f.generate(frame)
177
- bytes.should eq [0,12,0x4,0x0,0x0,3,10,1,2048].pack("CnCCNnNnN")
176
+ expect(bytes).to eq [0, 12, 0x4, 0x0, 0x0, 3, 10, 1, 2048].pack('CnCCNnNnN')
178
177
  end
179
178
 
180
- it "should ignore custom settings when sending" do
179
+ it 'should ignore custom settings when sending' do
181
180
  frame[:payload] = [
182
181
  [:settings_max_concurrent_streams, 10],
183
182
  [:settings_initial_window_size, 20],
@@ -187,10 +186,10 @@ describe HTTP2::Framer do
187
186
  buf = f.generate(frame)
188
187
  frame[:payload].slice!(2) # cut off the extension
189
188
  frame[:length] = 12 # frame length should be computed WITHOUT extensions
190
- f.parse(buf).should eq frame
189
+ expect(f.parse(buf)).to eq frame
191
190
  end
192
191
 
193
- it "should ignore custom settings when receiving" do
192
+ it 'should ignore custom settings when receiving' do
194
193
  frame[:payload] = [
195
194
  [:settings_max_concurrent_streams, 10],
196
195
  [:settings_initial_window_size, 20],
@@ -202,165 +201,165 @@ describe HTTP2::Framer do
202
201
  parsed = f.parse(buf)
203
202
  parsed.delete(:length)
204
203
  frame.delete(:length)
205
- parsed.should eq frame
204
+ expect(parsed).to eq frame
206
205
  end
207
206
 
208
- it "should raise exception on sending invalid stream ID" do
209
- expect {
207
+ it 'should raise exception on sending invalid stream ID' do
208
+ expect do
210
209
  frame[:stream] = 1
211
210
  f.generate(frame)
212
- }.to raise_error(CompressionError, /Invalid stream ID/)
211
+ end.to raise_error(CompressionError, /Invalid stream ID/)
213
212
  end
214
213
 
215
- it "should raise exception on receiving invalid stream ID" do
216
- expect {
214
+ it 'should raise exception on receiving invalid stream ID' do
215
+ expect do
217
216
  buf = f.generate(frame)
218
217
  buf.setbyte(8, 1)
219
218
  f.parse(buf)
220
- }.to raise_error(ProtocolError, /Invalid stream ID/)
219
+ end.to raise_error(ProtocolError, /Invalid stream ID/)
221
220
  end
222
221
 
223
- it "should raise exception on sending invalid setting" do
224
- expect {
222
+ it 'should raise exception on sending invalid setting' do
223
+ expect do
225
224
  frame[:payload] = [[:random, 23]]
226
225
  f.generate(frame)
227
- }.to raise_error(CompressionError, /Unknown settings ID/)
226
+ end.to raise_error(CompressionError, /Unknown settings ID/)
228
227
  end
229
228
 
230
- it "should raise exception on receiving invalid payload length" do
231
- expect {
229
+ it 'should raise exception on receiving invalid payload length' do
230
+ expect do
232
231
  buf = f.generate(frame)
233
232
  buf.setbyte(2, 11) # change payload length
234
233
  f.parse(buf)
235
- }.to raise_error(ProtocolError, /Invalid settings payload length/)
234
+ end.to raise_error(ProtocolError, /Invalid settings payload length/)
236
235
  end
237
236
  end
238
237
 
239
- context "PUSH_PROMISE" do
240
- it "should generate and parse bytes" do
238
+ context 'PUSH_PROMISE' do
239
+ it 'should generate and parse bytes' do
241
240
  frame = {
242
241
  length: 11,
243
242
  type: :push_promise,
244
243
  flags: [:end_headers],
245
244
  stream: 1,
246
245
  promise_stream: 2,
247
- payload: 'headers'
246
+ payload: 'headers',
248
247
  }
249
248
 
250
249
  bytes = f.generate(frame)
251
- bytes.should eq [0,0xb,0x5,0x4,0x1,0x2,*'headers'.bytes].pack("CnCCNNC*")
252
- f.parse(bytes).should eq frame
250
+ expect(bytes).to eq [0, 0xb, 0x5, 0x4, 0x1, 0x2, *'headers'.bytes].pack('CnCCNNC*')
251
+ expect(f.parse(bytes)).to eq frame
253
252
  end
254
253
  end
255
254
 
256
- context "PING" do
257
- let(:frame) {
255
+ context 'PING' do
256
+ let(:frame) do
258
257
  {
259
258
  length: 8,
260
259
  stream: 1,
261
260
  type: :ping,
262
261
  flags: [:ack],
263
- payload: '12345678'
262
+ payload: '12345678',
264
263
  }
265
- }
264
+ end
266
265
 
267
- it "should generate and parse bytes" do
266
+ it 'should generate and parse bytes' do
268
267
  bytes = f.generate(frame)
269
- bytes.should eq [0,0x8,0x6,0x1,0x1,*'12345678'.bytes].pack("CnCCNC*")
270
- f.parse(bytes).should eq frame
268
+ expect(bytes).to eq [0, 0x8, 0x6, 0x1, 0x1, *'12345678'.bytes].pack('CnCCNC*')
269
+ expect(f.parse(bytes)).to eq frame
271
270
  end
272
271
 
273
- it "should raise exception on invalid payload" do
274
- expect {
275
- frame[:payload] = "1234"
272
+ it 'should raise exception on invalid payload' do
273
+ expect do
274
+ frame[:payload] = '1234'
276
275
  f.generate(frame)
277
- }.to raise_error(CompressionError, /Invalid payload size/)
276
+ end.to raise_error(CompressionError, /Invalid payload size/)
278
277
  end
279
278
  end
280
279
 
281
- context "GOAWAY" do
282
- let(:frame) {
280
+ context 'GOAWAY' do
281
+ let(:frame) do
283
282
  {
284
283
  length: 13,
285
284
  stream: 1,
286
285
  type: :goaway,
287
286
  last_stream: 2,
288
287
  error: :no_error,
289
- payload: 'debug'
288
+ payload: 'debug',
290
289
  }
291
- }
290
+ end
292
291
 
293
- it "should generate and parse bytes" do
292
+ it 'should generate and parse bytes' do
294
293
  bytes = f.generate(frame)
295
- bytes.should eq [0,0xd,0x7,0x0,0x1,0x2,0x0,*'debug'.bytes].pack("CnCCNNNC*")
296
- f.parse(bytes).should eq frame
294
+ expect(bytes).to eq [0, 0xd, 0x7, 0x0, 0x1, 0x2, 0x0, *'debug'.bytes].pack('CnCCNNNC*')
295
+ expect(f.parse(bytes)).to eq frame
297
296
  end
298
297
 
299
- it "should treat debug payload as optional" do
298
+ it 'should treat debug payload as optional' do
300
299
  frame.delete :payload
301
300
  frame[:length] = 0x8
302
301
 
303
302
  bytes = f.generate(frame)
304
- bytes.should eq [0,0x8,0x7,0x0,0x1,0x2,0x0].pack("CnCCNNN")
305
- f.parse(bytes).should eq frame
303
+ expect(bytes).to eq [0, 0x8, 0x7, 0x0, 0x1, 0x2, 0x0].pack('CnCCNNN')
304
+ expect(f.parse(bytes)).to eq frame
306
305
  end
307
306
  end
308
307
 
309
- context "WINDOW_UPDATE" do
310
- it "should generate and parse bytes" do
308
+ context 'WINDOW_UPDATE' do
309
+ it 'should generate and parse bytes' do
311
310
  frame = {
312
311
  length: 4,
313
312
  type: :window_update,
314
- increment: 10
313
+ increment: 10,
315
314
  }
316
315
 
317
316
  bytes = f.generate(frame)
318
- bytes.should eq [0,0x4,0x8,0x0,0x0,0xa].pack("CnCCNN")
319
- f.parse(bytes).should eq frame
317
+ expect(bytes).to eq [0, 0x4, 0x8, 0x0, 0x0, 0xa].pack('CnCCNN')
318
+ expect(f.parse(bytes)).to eq frame
320
319
  end
321
320
  end
322
321
 
323
- context "CONTINUATION" do
324
- it "should generate and parse bytes" do
322
+ context 'CONTINUATION' do
323
+ it 'should generate and parse bytes' do
325
324
  frame = {
326
325
  length: 12,
327
326
  type: :continuation,
328
327
  stream: 1,
329
328
  flags: [:end_headers],
330
- payload: 'header-block'
329
+ payload: 'header-block',
331
330
  }
332
331
 
333
332
  bytes = f.generate(frame)
334
- bytes.should eq [0,0xc,0x9,0x4,0x1,*'header-block'.bytes].pack("CnCCNC*")
335
- f.parse(bytes).should eq frame
333
+ expect(bytes).to eq [0, 0xc, 0x9, 0x4, 0x1, *'header-block'.bytes].pack('CnCCNC*')
334
+ expect(f.parse(bytes)).to eq frame
336
335
  end
337
336
  end
338
337
 
339
- context "ALTSVC" do
340
- it "should generate and parse bytes" do
338
+ context 'ALTSVC' do
339
+ it 'should generate and parse bytes' do
341
340
  frame = {
342
341
  length: 44,
343
342
  type: :altsvc,
344
343
  stream: 1,
345
- max_age: 1402290402, # 4
344
+ max_age: 1_402_290_402, # 4
346
345
  port: 8080, # 2
347
346
  proto: 'h2-13', # 1 + 5
348
347
  host: 'www.example.com', # 1 + 15
349
348
  origin: 'www.example.com', # 15
350
349
  }
351
350
  bytes = f.generate(frame)
352
- expected = [0, 43, 0xa, 0, 1, 1402290402, 8080].pack("CnCCNNn")
353
- expected << [5, *'h2-13'.bytes].pack("CC*")
354
- expected << [15, *'www.example.com'.bytes].pack("CC*")
355
- expected << [*'www.example.com'.bytes].pack("C*")
356
- bytes.should eq expected
357
- f.parse(bytes).should eq frame
351
+ expected = [0, 43, 0xa, 0, 1, 1_402_290_402, 8080].pack('CnCCNNn')
352
+ expected << [5, *'h2-13'.bytes].pack('CC*')
353
+ expected << [15, *'www.example.com'.bytes].pack('CC*')
354
+ expected << [*'www.example.com'.bytes].pack('C*')
355
+ expect(bytes).to eq expected
356
+ expect(f.parse(bytes)).to eq frame
358
357
  end
359
358
  end
360
359
 
361
- context "Padding" do
360
+ context 'Padding' do
362
361
  [:data, :headers, :push_promise].each do |type|
363
- [1,256].each do |padlen|
362
+ [1, 256].each do |padlen|
364
363
  context "generating #{type} frame padded #{padlen}" do
365
364
  before do
366
365
  @frame = {
@@ -369,28 +368,28 @@ describe HTTP2::Framer do
369
368
  stream: 1,
370
369
  payload: 'example data',
371
370
  }
372
- type == :push_promise and @frame[:promise_stream] = 2
371
+ @frame[:promise_stream] = 2 if type == :push_promise
373
372
  @normal = f.generate(@frame)
374
- @padded = f.generate(@frame.merge(:padding => padlen))
373
+ @padded = f.generate(@frame.merge(padding: padlen))
375
374
  end
376
- it "should generate a frame with padding" do
377
- @padded.bytesize.should eq @normal.bytesize + padlen
375
+ it 'should generate a frame with padding' do
376
+ expect(@padded.bytesize).to eq @normal.bytesize + padlen
378
377
  end
379
- it "should fill padded octets with zero" do
378
+ it 'should fill padded octets with zero' do
380
379
  trailer_len = padlen - 1
381
- @padded[-trailer_len, trailer_len].should match(/\A\0*\z/)
380
+ expect(@padded[-trailer_len, trailer_len]).to match(/\A\0*\z/)
382
381
  end
383
- it "should parse a frame with padding" do
384
- f.parse(Buffer.new(@padded)).should eq \
385
- f.parse(Buffer.new(@normal)).merge(:padding => padlen)
382
+ it 'should parse a frame with padding' do
383
+ expect(f.parse(Buffer.new(@padded))).to eq \
384
+ f.parse(Buffer.new(@normal)).merge(padding: padlen)
386
385
  end
387
- it "should preserve payload" do
388
- f.parse(Buffer.new(@padded))[:payload].should eq @frame[:payload]
386
+ it 'should preserve payload' do
387
+ expect(f.parse(Buffer.new(@padded))[:payload]).to eq @frame[:payload]
389
388
  end
390
389
  end
391
390
  end
392
391
  end
393
- context "generating with invalid padding length" do
392
+ context 'generating with invalid padding length' do
394
393
  before do
395
394
  @frame = {
396
395
  length: 12,
@@ -399,23 +398,23 @@ describe HTTP2::Framer do
399
398
  payload: 'example data',
400
399
  }
401
400
  end
402
- [0, 257,1334].each do |padlen|
401
+ [0, 257, 1334].each do |padlen|
403
402
  it "should raise error on trying to generate data frame padded with invalid #{padlen}" do
404
- expect {
405
- f.generate(@frame.merge(:padding => padlen))
406
- }.to raise_error(CompressionError, /padding/i)
403
+ expect do
404
+ f.generate(@frame.merge(padding: padlen))
405
+ end.to raise_error(CompressionError, /padding/i)
407
406
  end
408
407
  end
409
- it "should raise error when adding a padding would make frame too large" do
408
+ it 'should raise error when adding a padding would make frame too large' do
410
409
  @frame[:payload] = 'q' * (f.max_frame_size - 200)
411
410
  @frame[:length] = @frame[:payload].size
412
411
  @frame[:padding] = 210 # would exceed 4096
413
- expect {
412
+ expect do
414
413
  f.generate(@frame)
415
- }.to raise_error(CompressionError, /padding/i)
414
+ end.to raise_error(CompressionError, /padding/i)
416
415
  end
417
416
  end
418
- context "parsing frames with invalid paddings" do
417
+ context 'parsing frames with invalid paddings' do
419
418
  before do
420
419
  @frame = {
421
420
  length: 12,
@@ -424,66 +423,65 @@ describe HTTP2::Framer do
424
423
  payload: 'example data',
425
424
  }
426
425
  @padlen = 123
427
- @padded = f.generate(@frame.merge(:padding => @padlen))
426
+ @padded = f.generate(@frame.merge(padding: @padlen))
428
427
  end
429
- it "should raise exception when the given padding is longer than the payload" do
430
- @padded.setbyte(9,240)
428
+ it 'should raise exception when the given padding is longer than the payload' do
429
+ @padded.setbyte(9, 240)
431
430
  expect { f.parse(Buffer.new(@padded)) }.to raise_error(ProtocolError, /padding/)
432
431
  end
433
432
  end
434
433
  end
435
434
 
436
- it "should determine frame length" do
435
+ it 'should determine frame length' do
437
436
  frames = [
438
- [{type: :data, stream: 1, flags: [:end_stream], payload: "abc"}, 3],
439
- [{type: :headers, stream: 1, payload: "abc"}, 3],
440
- [{type: :priority, stream: 3, stream_dependency: 30, exclusive: false, weight: 1}, 5],
441
- [{type: :rst_stream, stream: 3, error: 100}, 4],
442
- [{type: :settings, payload: [[:settings_max_concurrent_streams, 10]]}, 6],
443
- [{type: :push_promise, promise_stream: 5, payload: "abc"}, 7],
444
- [{type: :ping, payload: "blob"*2}, 8],
445
- [{type: :goaway, last_stream: 5, error: 20, payload: "blob"}, 12],
446
- [{type: :window_update, stream: 1, increment: 1024}, 4],
447
- [{type: :continuation, stream: 1, payload: "abc"}, 3]
437
+ [{ type: :data, stream: 1, flags: [:end_stream], payload: 'abc' }, 3],
438
+ [{ type: :headers, stream: 1, payload: 'abc' }, 3],
439
+ [{ type: :priority, stream: 3, stream_dependency: 30, exclusive: false, weight: 1 }, 5],
440
+ [{ type: :rst_stream, stream: 3, error: 100 }, 4],
441
+ [{ type: :settings, payload: [[:settings_max_concurrent_streams, 10]] }, 6],
442
+ [{ type: :push_promise, promise_stream: 5, payload: 'abc' }, 7],
443
+ [{ type: :ping, payload: 'blob' * 2 }, 8],
444
+ [{ type: :goaway, last_stream: 5, error: 20, payload: 'blob' }, 12],
445
+ [{ type: :window_update, stream: 1, increment: 1024 }, 4],
446
+ [{ type: :continuation, stream: 1, payload: 'abc' }, 3],
448
447
  ]
449
448
 
450
449
  frames.each do |(frame, size)|
451
450
  bytes = f.generate(frame)
452
- bytes.slice(1,2).unpack("n").first.should eq size
453
- bytes.readbyte(0).should eq 0
451
+ expect(bytes.slice(1, 2).unpack('n').first).to eq size
452
+ expect(bytes.readbyte(0)).to eq 0
454
453
  end
455
454
  end
456
455
 
457
- it "should parse single frame at a time" do
456
+ it 'should parse single frame at a time' do
458
457
  frames = [
459
- {type: :headers, stream: 1, payload: "headers"},
460
- {type: :data, stream: 1, flags: [:end_stream], payload: "abc"}
458
+ { type: :headers, stream: 1, payload: 'headers' },
459
+ { type: :data, stream: 1, flags: [:end_stream], payload: 'abc' },
461
460
  ]
462
461
 
463
462
  buf = f.generate(frames[0]) << f.generate(frames[1])
464
463
 
465
- f.parse(buf).should eq frames[0]
466
- f.parse(buf).should eq frames[1]
464
+ expect(f.parse(buf)).to eq frames[0]
465
+ expect(f.parse(buf)).to eq frames[1]
467
466
  end
468
467
 
469
- it "should process full frames only" do
470
- frame = {type: :headers, stream: 1, payload: "headers"}
468
+ it 'should process full frames only' do
469
+ frame = { type: :headers, stream: 1, payload: 'headers' }
471
470
  bytes = f.generate(frame)
472
471
 
473
- f.parse(bytes[0...-1]).should be_nil
474
- f.parse(bytes).should eq frame
475
- bytes.should be_empty
472
+ expect(f.parse(bytes[0...-1])).to be_nil
473
+ expect(f.parse(bytes)).to eq frame
474
+ expect(bytes).to be_empty
476
475
  end
477
476
 
478
- it "should ignore unknown extension frames" do
479
- frame = {type: :headers, stream: 1, payload: "headers"}
477
+ it 'should ignore unknown extension frames' do
478
+ frame = { type: :headers, stream: 1, payload: 'headers' }
480
479
  bytes = f.generate(frame)
481
480
  bytes = Buffer.new(bytes + bytes) # Two HEADERS frames in bytes
482
481
  bytes.setbyte(3, 42) # Make the first unknown type 42
483
482
 
484
- f.parse(bytes).should be_nil # first frame should be ignored
485
- f.parse(bytes).should eq frame # should generate only one HEADERS
486
- bytes.should be_empty
483
+ expect(f.parse(bytes)).to be_nil # first frame should be ignored
484
+ expect(f.parse(bytes)).to eq frame # should generate only one HEADERS
485
+ expect(bytes).to be_empty
487
486
  end
488
-
489
487
  end