Index: net/quic/quic_session.cc |
diff --git a/net/quic/quic_session.cc b/net/quic/quic_session.cc |
index 167141f8f92003eddea8f989aef9f8ff7b77370b..ddc55f6ab11024ff7d01b566fdf0b013b4d324a0 100644 |
--- a/net/quic/quic_session.cc |
+++ b/net/quic/quic_session.cc |
@@ -598,20 +598,42 @@ ReliableQuicStream* QuicSession::GetIncomingDynamicStream( |
if (IsClosedStream(stream_id)) { |
return nullptr; |
} |
- |
implicitly_created_streams_.erase(stream_id); |
if (stream_id > largest_peer_created_stream_id_) { |
- if (stream_id - largest_peer_created_stream_id_ > kMaxStreamIdDelta) { |
- // We may already have sent a connection close due to multiple reset |
- // streams in the same packet. |
- if (connection()->connected()) { |
- LOG(ERROR) << "Trying to get stream: " << stream_id |
- << ", largest peer created stream: " |
- << largest_peer_created_stream_id_ |
- << ", max delta: " << kMaxStreamIdDelta; |
- connection()->SendConnectionClose(QUIC_INVALID_STREAM_ID); |
+ if (FLAGS_exact_stream_id_delta) { |
+ // Check if the number of streams that will be created (including |
+ // implicitly open streams) would cause the number of open streams to |
+ // exceed the limit. Note that the peer can create only |
+ // alternately-numbered streams. |
+ if ((stream_id - largest_peer_created_stream_id_) / 2 + |
+ GetNumOpenStreams() > |
+ get_max_open_streams()) { |
+ DVLOG(1) << "Failed to create a new incoming stream with id:" |
+ << stream_id << ". Already " << GetNumOpenStreams() |
+ << " streams open, would exceed max " << get_max_open_streams() |
+ << "."; |
+ // We may already have sent a connection close due to multiple reset |
+ // streams in the same packet. |
+ if (connection()->connected()) { |
+ connection()->SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS); |
+ } |
+ return nullptr; |
+ } |
+ } else { |
+ // Limit on the delta between stream IDs. |
+ const QuicStreamId kMaxStreamIdDelta = 200; |
+ if (stream_id - largest_peer_created_stream_id_ > kMaxStreamIdDelta) { |
+ // We may already have sent a connection close due to multiple reset |
+ // streams in the same packet. |
+ if (connection()->connected()) { |
+ LOG(ERROR) << "Trying to get stream: " << stream_id |
+ << ", largest peer created stream: " |
+ << largest_peer_created_stream_id_ |
+ << ", max delta: " << kMaxStreamIdDelta; |
+ connection()->SendConnectionClose(QUIC_INVALID_STREAM_ID); |
+ } |
+ return nullptr; |
} |
- return nullptr; |
} |
for (QuicStreamId id = largest_peer_created_stream_id_ + 2; |
id < stream_id; |