Index: net/quic/core/quic_spdy_stream.cc |
diff --git a/net/quic/core/quic_spdy_stream.cc b/net/quic/core/quic_spdy_stream.cc |
index 3777177c1bfae9a449f2dd5a5d5ba2b6d1d219bd..502145c66de315a6500f3412cbd1ad03535c73bb 100644 |
--- a/net/quic/core/quic_spdy_stream.cc |
+++ b/net/quic/core/quic_spdy_stream.cc |
@@ -29,6 +29,7 @@ QuicSpdyStream::QuicSpdyStream(QuicStreamId id, QuicSpdySession* spdy_session) |
: ReliableQuicStream(id, spdy_session), |
spdy_session_(spdy_session), |
visitor_(nullptr), |
+ allow_bidirectional_data_(false), |
headers_decompressed_(false), |
priority_(kDefaultPriority), |
trailers_decompressed_(false), |
@@ -204,6 +205,16 @@ void QuicSpdyStream::OnStreamHeadersComplete(bool fin, size_t frame_len) { |
void QuicSpdyStream::OnStreamHeaderList(bool fin, |
size_t frame_len, |
const QuicHeaderList& header_list) { |
+ // The headers list avoid infinite buffering by clearing the headers list |
+ // if the current headers are too large. So if the list is empty here |
+ // then the headers list must have been too large, and the stream should |
+ // be reset. |
+ if (FLAGS_quic_limit_uncompressed_headers && header_list.empty()) { |
+ OnHeadersTooLarge(); |
+ if (IsDoneReading()) { |
+ return; |
+ } |
+ } |
if (!headers_decompressed_) { |
OnInitialHeadersComplete(fin, frame_len, header_list); |
} else { |
@@ -211,6 +222,10 @@ void QuicSpdyStream::OnStreamHeaderList(bool fin, |
} |
} |
+void QuicSpdyStream::OnHeadersTooLarge() { |
+ Reset(QUIC_HEADERS_TOO_LARGE); |
+} |
+ |
void QuicSpdyStream::OnInitialHeadersComplete(bool fin, size_t /*frame_len*/) { |
headers_decompressed_ = true; |
if (fin) { |