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 +4 -4
- data/lib/http/2/next/client.rb +4 -1
- data/lib/http/2/next/connection.rb +6 -0
- data/lib/http/2/next/framer.rb +27 -2
- data/lib/http/2/next/server.rb +17 -0
- data/lib/http/2/next/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 875825ebea128127df77ca3dda0f1a541b1a04329fd210c1e833e188b61fb6fd
|
4
|
+
data.tar.gz: 257aa0e0296ecb15eeb819aa828d0b80f09e88890c7888f886741bf84da58c81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56d023be9199b34436061f3f24c47a2a79914d86dbcf45535ae46983a905c6cf84160263a5576ad79e59319ba2470d1c0e6e5e55eb4e8f90a7a46b0d2530a2fb
|
7
|
+
data.tar.gz: db01e4e809a622908eacdb55f4c9b739f34afa8cb825aa63be9ef3b2aadb4c1e8d02ee2a5459d5492abc27df82108be5fd60e66ba77402a836aa12a7be64c7e7
|
data/lib/http/2/next/client.rb
CHANGED
@@ -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
|
data/lib/http/2/next/framer.rb
CHANGED
@@ -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
|
|
data/lib/http/2/next/server.rb
CHANGED
@@ -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
|
data/lib/http/2/next/version.rb
CHANGED
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.
|
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-
|
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:
|