Index: net/quic/quic_chromium_client_stream.cc |
diff --git a/net/quic/quic_chromium_client_stream.cc b/net/quic/quic_chromium_client_stream.cc |
index 1aa8e531fcfe01f530896168256a801ba5d84c30..cd883149a3263f4e2602e407f7983ba309764294 100644 |
--- a/net/quic/quic_chromium_client_stream.cc |
+++ b/net/quic/quic_chromium_client_stream.cc |
@@ -14,6 +14,7 @@ |
#include "net/quic/quic_spdy_session.h" |
#include "net/quic/quic_write_blocked_list.h" |
#include "net/quic/spdy_utils.h" |
+#include "net/spdy/header_coalescer.h" |
namespace net { |
@@ -60,6 +61,28 @@ void QuicChromiumClientStream::OnStreamHeadersComplete(bool fin, |
} |
} |
+void QuicChromiumClientStream::OnStreamHeaderList( |
+ bool fin, |
+ size_t frame_len, |
+ const QuicHeaderList& header_list) { |
+ QuicSpdyStream::OnStreamHeaderList(fin, frame_len, header_list); |
+ |
+ if (headers_delivered_) { |
+ // The delegate will read the trailers via a posted task. |
+ NotifyDelegateOfHeadersCompleteLater(received_trailers(), frame_len); |
+ } else { |
+ HeaderCoalescer coalescer; |
+ for (const auto& header : header_list) { |
+ coalescer.OnHeader(header.first, header.second); |
+ } |
+ ConsumeHeaderList(); |
+ session_->OnInitialHeadersComplete(id(), coalescer.headers()); |
+ |
+ // The delegate will read the headers via a posted task. |
+ NotifyDelegateOfHeadersCompleteLater(coalescer.headers(), frame_len); |
+ } |
+} |
+ |
void QuicChromiumClientStream::OnPromiseHeadersComplete( |
QuicStreamId promised_id, |
size_t frame_len) { |
@@ -222,6 +245,7 @@ void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete( |
// Only mark trailers consumed when we are about to notify delegate. |
if (headers_delivered_) { |
MarkTrailersConsumed(decompressed_trailers().length()); |
+ MarkTrailersDelivered(); |
net_log_.AddEvent( |
NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS, |
base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); |