http-2-next 0.1.2 → 0.2.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.
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: