http-2-next 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8cac338f26bfa2ca51f886570bbc356633d54723f64f0d1ba34907b0e91f3ce5
4
- data.tar.gz: dd327e341f813616855c6900106c994e23a3c689c9d6079856be7be25bc39bbb
3
+ metadata.gz: 875825ebea128127df77ca3dda0f1a541b1a04329fd210c1e833e188b61fb6fd
4
+ data.tar.gz: 257aa0e0296ecb15eeb819aa828d0b80f09e88890c7888f886741bf84da58c81
5
5
  SHA512:
6
- metadata.gz: 7681ff7d121ad5e916f925eadf8d804913db66268bf1a97ded833ffe6b312ef7f2d731c08ed7ecf5e600c196fc331ba2f0643ae0f5e12cf9ff0591f9ab78d338
7
- data.tar.gz: eec8fa81a714882f23192b463f47ec2dfea4c4ea85400d9c59d3b14849a66d00ab22a8d405c4ec656e6e77f6ebae6b36707a87be04b66c1b65a0a31bb1a3cef0
6
+ metadata.gz: 56d023be9199b34436061f3f24c47a2a79914d86dbcf45535ae46983a905c6cf84160263a5576ad79e59319ba2470d1c0e6e5e55eb4e8f90a7a46b0d2530a2fb
7
+ data.tar.gz: db01e4e809a622908eacdb55f4c9b739f34afa8cb825aa63be9ef3b2aadb4c1e8d02ee2a5459d5492abc27df82108be5fd60e66ba77402a836aa12a7be64c7e7
@@ -47,10 +47,13 @@ module HTTP2Next
47
47
 
48
48
  # sends the preface and initializes the first stream in half-closed state
49
49
  def upgrade
50
+ @h2c_upgrade = :start
50
51
  raise ProtocolError unless @stream_id == 1
51
52
 
52
53
  send_connection_preface
53
- new_stream(state: :half_closed_local)
54
+ stream = new_stream(state: :half_closed_local)
55
+ @h2c_upgrade = :finished
56
+ stream
54
57
  end
55
58
 
56
59
  # Emit the connection preface if not yet
@@ -478,6 +478,12 @@ module HTTP2Next
478
478
  # An ALTSVC frame on stream 0 with empty (length 0) "Origin"
479
479
  # information is invalid and MUST be ignored.
480
480
  emit(frame[:type], frame) if frame[:origin] && !frame[:origin].empty?
481
+ when :origin
482
+ return if @h2c_upgrade || !frame[:flags].empty?
483
+
484
+ frame[:payload].each do |origin|
485
+ emit(frame[:type], origin)
486
+ end
481
487
  when :blocked
482
488
  emit(frame[:type], frame)
483
489
  else
@@ -30,7 +30,8 @@ module HTTP2Next
30
30
  goaway: 0x7,
31
31
  window_update: 0x8,
32
32
  continuation: 0x9,
33
- altsvc: 0xa
33
+ altsvc: 0xa,
34
+ origin: 0xc
34
35
  }.freeze
35
36
 
36
37
  FRAME_TYPES_WITH_PADDING = %i[data headers push_promise].freeze
@@ -59,7 +60,13 @@ module HTTP2Next
59
60
  goaway: {},
60
61
  window_update: {},
61
62
  continuation: { end_headers: 2 },
62
- altsvc: {}
63
+ altsvc: {},
64
+ origin: {
65
+ reserved: 1,
66
+ reserved2: 2,
67
+ reserved3: 4,
68
+ reserved4: 8
69
+ }
63
70
  }.each_value(&:freeze).freeze
64
71
 
65
72
  # Default settings as defined by the spec
@@ -285,6 +292,14 @@ module HTTP2Next
285
292
  bytes << frame[:origin]
286
293
  length += frame[:origin].bytesize
287
294
  end
295
+
296
+ when :origin
297
+ frame[:payload].each do |origin|
298
+ bytes << [origin.bytesize].pack(UINT16)
299
+ bytes << origin
300
+ length += 2 + origin.bytesize
301
+ end
302
+
288
303
  end
289
304
 
290
305
  # Process padding.
@@ -419,6 +434,16 @@ module HTTP2Next
419
434
  frame[:host] = payload.read(len) if len > 0
420
435
 
421
436
  frame[:origin] = payload.read(payload.size) unless payload.empty?
437
+
438
+ when :origin
439
+ origins = []
440
+
441
+ until payload.empty?
442
+ len = payload.read(2).unpack(UINT16).first
443
+ origins << payload.read(len)
444
+ end
445
+
446
+ frame[:payload] = origins
422
447
  # else # Unknown frame type is explicitly allowed
423
448
  end
424
449
 
@@ -22,6 +22,8 @@ module HTTP2Next
22
22
  # end
23
23
  #
24
24
  class Server < Connection
25
+ attr_reader :origin_set
26
+
25
27
  # Initialize new HTTP 2.0 server object.
26
28
  def initialize(**settings)
27
29
  @stream_id = 2
@@ -30,6 +32,9 @@ module HTTP2Next
30
32
  @local_role = :server
31
33
  @remote_role = :client
32
34
 
35
+ @origin_set = []
36
+ @origins_sent = true
37
+
33
38
  super
34
39
  end
35
40
 
@@ -112,8 +117,20 @@ module HTTP2Next
112
117
  @state = :waiting_magic
113
118
  end
114
119
 
120
+ def origin_set=(origins)
121
+ @origin_set = Array(origins).map(&:to_s)
122
+ @origins_sent = @origin_set.empty?
123
+ end
124
+
115
125
  private
116
126
 
127
+ def connection_settings(frame)
128
+ super
129
+ return unless frame[:flags].include?(:ack) && !@origins_sent
130
+
131
+ send(type: :origin, stream: 0, payload: @origin_set)
132
+ end
133
+
117
134
  def verify_pseudo_headers(frame, mandatory_headers = REQUEST_MANDATORY_HEADERS)
118
135
  super(frame, mandatory_headers)
119
136
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTP2Next
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http-2-next
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-11-22 00:00:00.000000000 Z
13
+ date: 2019-12-14 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Pure-ruby HTTP 2.0 protocol implementation
16
16
  email: