@@ -41,7 +41,7 @@ def initialize(framer, local_stream_id)
4141 @decoder = HPACK ::Context . new
4242 @encoder = HPACK ::Context . new
4343
44- @local_window = LocalWindow . new
44+ @local_window = LocalWindow . new ( )
4545 @remote_window = Window . new
4646 end
4747
@@ -287,9 +287,10 @@ def send_ping(data)
287287
288288 def receive_ping ( frame )
289289 if @state != :closed
290- if frame . stream_id != 0
291- raise ProtocolError , "Ping received for non-zero stream!"
292- end
290+ # This is handled in `read_payload`:
291+ # if frame.stream_id != 0
292+ # raise ProtocolError, "Ping received for non-zero stream!"
293+ # end
293294
294295 unless frame . acknowledgement?
295296 reply = frame . acknowledge
@@ -313,7 +314,7 @@ def receive_data(frame)
313314 end
314315 end
315316
316- def valid_remote_stream_id?
317+ def valid_remote_stream_id? ( stream_id )
317318 false
318319 end
319320
@@ -338,6 +339,10 @@ def accept_push_promise_stream(stream_id, &block)
338339 # On the client side, we create requests.
339340 # @return [Stream] the created stream.
340341 def create_stream ( id = next_stream_id , &block )
342+ if @streams . key? ( id )
343+ raise ProtocolError , "Cannot create stream with id #{ id } , already exists!"
344+ end
345+
341346 if block_given?
342347 return yield ( self , id )
343348 else
@@ -382,24 +387,6 @@ def send_priority(stream_id, priority)
382387 write_frame ( frame )
383388 end
384389
385- def idle_stream_id? ( id )
386- if id . even?
387- # Server-initiated streams are even.
388- if @local_stream_id . even?
389- id >= @local_stream_id
390- else
391- id > @remote_stream_id
392- end
393- elsif id . odd?
394- # Client-initiated streams are odd.
395- if @local_stream_id . odd?
396- id >= @local_stream_id
397- else
398- id > @remote_stream_id
399- end
400- end
401- end
402-
403390 # Sets the priority for an incoming stream.
404391 def receive_priority ( frame )
405392 if dependency = @dependencies [ frame . stream_id ]
@@ -421,27 +408,34 @@ def server_stream_id?(id)
421408 id . even?
422409 end
423410
424- def closed_stream_id? ( id )
425- if id . zero?
426- # The connection "stream id" can never be closed:
427- false
428- elsif id . even?
411+ def idle_stream_id? ( id )
412+ if id . even?
429413 # Server-initiated streams are even.
430414 if @local_stream_id . even?
431- id < @local_stream_id
415+ id >= @local_stream_id
432416 else
433- id <= @remote_stream_id
417+ id > @remote_stream_id
434418 end
435419 elsif id . odd?
436420 # Client-initiated streams are odd.
437421 if @local_stream_id . odd?
438- id < @local_stream_id
422+ id >= @local_stream_id
439423 else
440- id <= @remote_stream_id
424+ id > @remote_stream_id
441425 end
442426 end
443427 end
444428
429+ # This is only valid if the stream doesn't exist in `@streams`.
430+ def closed_stream_id? ( id )
431+ if id . zero?
432+ # The connection "stream id" can never be closed:
433+ false
434+ else
435+ !idle_stream_id? ( id )
436+ end
437+ end
438+
445439 def receive_reset_stream ( frame )
446440 if frame . connection?
447441 raise ProtocolError , "Cannot reset connection!"
0 commit comments