protocol-http2 0.4.1 → 0.5.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/protocol/http2/client.rb +11 -0
- data/lib/protocol/http2/connection.rb +34 -6
- data/lib/protocol/http2/server.rb +4 -4
- data/lib/protocol/http2/stream.rb +24 -18
- data/lib/protocol/http2/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d2e544f1541f928ab172ef078d2a6ef3350bef0db9e1bbd40d3fb3755501e7f
|
4
|
+
data.tar.gz: a161a66c0f62eb669d9527dee36753b2e63a653aa9e242ed554916d140f8cd65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d2bfcf4a4d488978283147d468c1a2afc6aecc94043e626a555e154d4e826e38c79a76092b9c13cc2aad9c3e7d75fc9c9ccae45fdcbbb6d29610bb1630bab0e
|
7
|
+
data.tar.gz: b638a3348b28f9491958a5748dc884b34d2129248744832858fcd1368bad55cfe0da4d18540632414820383dff53c7cb746a69a95e5a5a39423d6f7af00a948f
|
@@ -47,6 +47,17 @@ module Protocol
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
# Accept an incoming push promise from the other side of the connection.
|
51
|
+
# On the client side, we accept push promise streams.
|
52
|
+
# On the server side, streams create push promise streams.
|
53
|
+
def accept_push_promise_stream(stream_id, &block)
|
54
|
+
accept_stream(stream_id, &block)
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_push_promise_stream
|
58
|
+
raise ProtocolError, "Cannot create push promises from client!"
|
59
|
+
end
|
60
|
+
|
50
61
|
def receive_push_promise(frame)
|
51
62
|
if frame.stream_id == 0
|
52
63
|
raise ProtocolError, "Cannot receive headers for stream 0!"
|
@@ -274,8 +274,9 @@ module Protocol
|
|
274
274
|
false
|
275
275
|
end
|
276
276
|
|
277
|
-
# Accept
|
278
|
-
|
277
|
+
# Accept an incoming stream from the other side of the connnection.
|
278
|
+
# On the server side, we accept requests.
|
279
|
+
def accept_stream(stream_id, &block)
|
279
280
|
unless valid_remote_stream_id?(stream_id)
|
280
281
|
raise ProtocolError, "Invalid remote stream id: #{stream_id}"
|
281
282
|
end
|
@@ -285,14 +286,36 @@ module Protocol
|
|
285
286
|
end
|
286
287
|
|
287
288
|
@remote_stream_id = stream_id
|
288
|
-
|
289
|
+
|
290
|
+
create_stream(stream_id, &block)
|
291
|
+
end
|
292
|
+
|
293
|
+
def accept_push_promise_stream(stream_id, &block)
|
294
|
+
accept_stream(stream_id, &block)
|
295
|
+
end
|
296
|
+
|
297
|
+
# Create a stream, defaults to an outgoing stream.
|
298
|
+
# On the client side, we create requests.
|
299
|
+
# @return [Stream] the created stream.
|
300
|
+
def create_stream(stream_id = next_stream_id, &block)
|
301
|
+
if block_given?
|
302
|
+
yield(stream_id)
|
303
|
+
else
|
304
|
+
return Stream.new(self, stream_id)
|
305
|
+
end
|
306
|
+
|
307
|
+
if stream = @streams[stream_id]
|
308
|
+
return stream
|
309
|
+
else
|
310
|
+
raise ProtocolError, "Stream creation failed!"
|
311
|
+
end
|
289
312
|
end
|
290
313
|
|
291
|
-
|
292
|
-
|
293
|
-
@streams[stream_id] = Stream.new(self, stream_id)
|
314
|
+
def create_push_promise_stream(&block)
|
315
|
+
create_stream(&block)
|
294
316
|
end
|
295
317
|
|
318
|
+
# On the server side, starts a new request.
|
296
319
|
def receive_headers(frame)
|
297
320
|
if frame.stream_id == 0
|
298
321
|
raise ProtocolError, "Cannot receive headers for stream 0!"
|
@@ -310,6 +333,7 @@ module Protocol
|
|
310
333
|
end
|
311
334
|
end
|
312
335
|
|
336
|
+
# On the client and server side, sets the priority for an incoming stream.
|
313
337
|
def receive_priority(frame)
|
314
338
|
if stream = @streams[frame.stream_id]
|
315
339
|
stream.receive_priority(frame)
|
@@ -319,6 +343,10 @@ module Protocol
|
|
319
343
|
end
|
320
344
|
end
|
321
345
|
|
346
|
+
def receive_push_promise(frame)
|
347
|
+
raise ProtocolError, "Unable to receive push promise!"
|
348
|
+
end
|
349
|
+
|
322
350
|
def receive_reset_stream(frame)
|
323
351
|
if stream = @streams[frame.stream_id]
|
324
352
|
stream.receive_reset_stream(frame)
|
@@ -45,12 +45,12 @@ module Protocol
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
49
|
-
|
48
|
+
def accept_push_promise_stream(stream_id, &block)
|
49
|
+
raise ProtocolError, "Cannot accept push promises on server!"
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
53
|
-
|
52
|
+
def enable_push?
|
53
|
+
@remote_settings.enable_push?
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -70,6 +70,7 @@ module Protocol
|
|
70
70
|
# ES: END_STREAM flag
|
71
71
|
# R: RST_STREAM frame
|
72
72
|
#
|
73
|
+
# State transition methods use a trailing "!".
|
73
74
|
class Stream
|
74
75
|
include FlowControl
|
75
76
|
|
@@ -85,6 +86,8 @@ module Protocol
|
|
85
86
|
|
86
87
|
@headers = nil
|
87
88
|
@data = nil
|
89
|
+
|
90
|
+
@connection.streams[@id] = self
|
88
91
|
end
|
89
92
|
|
90
93
|
# Stream ID (odd for client initiated streams, even otherwise).
|
@@ -116,7 +119,7 @@ module Protocol
|
|
116
119
|
end
|
117
120
|
|
118
121
|
def closed?
|
119
|
-
@state == :closed
|
122
|
+
@state == :closed
|
120
123
|
end
|
121
124
|
|
122
125
|
def send_headers?
|
@@ -171,7 +174,7 @@ module Protocol
|
|
171
174
|
frame = write_headers(*args)
|
172
175
|
|
173
176
|
if frame.end_stream?
|
174
|
-
close
|
177
|
+
close!
|
175
178
|
end
|
176
179
|
else
|
177
180
|
raise ProtocolError, "Cannot send headers in state: #{@state}"
|
@@ -207,15 +210,16 @@ module Protocol
|
|
207
210
|
frame = write_data(*args)
|
208
211
|
|
209
212
|
if frame.end_stream?
|
210
|
-
close
|
213
|
+
close!
|
211
214
|
end
|
212
215
|
else
|
213
216
|
raise ProtocolError, "Cannot send data in state: #{@state}"
|
214
217
|
end
|
215
218
|
end
|
216
219
|
|
217
|
-
|
218
|
-
|
220
|
+
# This is not the same as a `close` method. If you are looking for that, use `send_stream_reset`.
|
221
|
+
def close!
|
222
|
+
@state = :closed
|
219
223
|
end
|
220
224
|
|
221
225
|
def send_reset_stream(error_code = 0)
|
@@ -225,7 +229,7 @@ module Protocol
|
|
225
229
|
|
226
230
|
write_frame(frame)
|
227
231
|
|
228
|
-
close
|
232
|
+
close!
|
229
233
|
else
|
230
234
|
raise ProtocolError, "Cannot reset stream in state: #{@state}"
|
231
235
|
end
|
@@ -263,12 +267,10 @@ module Protocol
|
|
263
267
|
@headers = process_headers(frame)
|
264
268
|
elsif @state == :half_closed_local
|
265
269
|
if frame.end_stream?
|
266
|
-
close
|
270
|
+
close!
|
267
271
|
end
|
268
272
|
|
269
273
|
@headers = process_headers(frame)
|
270
|
-
elsif @state == :reset
|
271
|
-
# ignore...
|
272
274
|
else
|
273
275
|
raise ProtocolError, "Cannot receive headers in state: #{@state}"
|
274
276
|
end
|
@@ -288,12 +290,10 @@ module Protocol
|
|
288
290
|
consume_local_window(frame)
|
289
291
|
|
290
292
|
if frame.end_stream?
|
291
|
-
close
|
293
|
+
close!
|
292
294
|
end
|
293
295
|
|
294
296
|
@data = frame.unpack
|
295
|
-
elsif @state == :reset
|
296
|
-
# ignore...
|
297
297
|
else
|
298
298
|
raise ProtocolError, "Cannot receive data in state: #{@state}"
|
299
299
|
end
|
@@ -305,7 +305,7 @@ module Protocol
|
|
305
305
|
|
306
306
|
def receive_reset_stream(frame)
|
307
307
|
if @state != :idle and @state != :closed
|
308
|
-
close
|
308
|
+
close!
|
309
309
|
|
310
310
|
return frame.unpack
|
311
311
|
else
|
@@ -343,15 +343,16 @@ module Protocol
|
|
343
343
|
end
|
344
344
|
end
|
345
345
|
|
346
|
-
|
347
|
-
|
346
|
+
# Override this function to implement your own push promise logic.
|
347
|
+
def create_push_promise_stream(headers)
|
348
|
+
@connection.create_push_promise_stream
|
348
349
|
end
|
349
350
|
|
350
351
|
# Server push is semantically equivalent to a server responding to a request; however, in this case, that request is also sent by the server, as a PUSH_PROMISE frame.
|
351
352
|
# @param headers [Hash] contains a complete set of request header fields that the server attributes to the request.
|
352
|
-
def send_push_promise(headers
|
353
|
+
def send_push_promise(headers)
|
353
354
|
if @state == :open or @state == :half_closed_remote
|
354
|
-
promised_stream = self.
|
355
|
+
promised_stream = self.create_push_promise_stream(headers)
|
355
356
|
promised_stream.reserved_local!
|
356
357
|
|
357
358
|
write_push_promise(promised_stream.id, headers)
|
@@ -362,11 +363,16 @@ module Protocol
|
|
362
363
|
end
|
363
364
|
end
|
364
365
|
|
366
|
+
# Override this function to implement your own push promise logic.
|
367
|
+
def accept_push_promise_stream(stream_id, headers)
|
368
|
+
@connection.accept_push_promise_stream(stream_id)
|
369
|
+
end
|
370
|
+
|
365
371
|
def receive_push_promise(frame)
|
366
372
|
promised_stream_id, data = frame.unpack
|
367
373
|
headers = @connection.decode_headers(data)
|
368
374
|
|
369
|
-
stream = self.
|
375
|
+
stream = self.accept_push_promise_stream(promised_stream_id, headers)
|
370
376
|
stream.reserved_remote!
|
371
377
|
|
372
378
|
return stream, headers
|