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 +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:
|