Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index f4d3c5967784e6544ae40d836ca90b134465a992..8d0a310ec0f824ad60eb15e4059a401d65bdae14 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -1121,6 +1121,31 @@ void QuicConnection::SendRstStream(QuicStreamId id, |
ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); |
packet_generator_.AddControlFrame(QuicFrame(new QuicRstStreamFrame( |
id, AdjustErrorForVersion(error, version()), bytes_written))); |
+ if (!FLAGS_quic_do_not_retransmit_for_reset_streams) { |
+ return; |
+ } |
+ |
+ sent_packet_manager_.CancelRetransmissionsForStream(id); |
+ // Remove all queued packets which only contain data for the reset stream. |
+ QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); |
+ while (packet_iterator != queued_packets_.end()) { |
+ RetransmittableFrames* retransmittable_frames = |
+ packet_iterator->serialized_packet.retransmittable_frames; |
+ if (!retransmittable_frames) { |
+ ++packet_iterator; |
+ continue; |
+ } |
+ retransmittable_frames->RemoveFramesForStream(id); |
+ if (!retransmittable_frames->frames().empty()) { |
+ ++packet_iterator; |
+ continue; |
+ } |
+ delete packet_iterator->serialized_packet.retransmittable_frames; |
+ delete packet_iterator->serialized_packet.packet; |
+ packet_iterator->serialized_packet.retransmittable_frames = nullptr; |
+ packet_iterator->serialized_packet.packet = nullptr; |
+ packet_iterator = queued_packets_.erase(packet_iterator); |
+ } |
} |
void QuicConnection::SendWindowUpdate(QuicStreamId id, |