Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: net/quic/quic_chromium_client_stream.cc

Issue 1961573002: Avoids the "re-encode HPACK as SPDY3" step. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Avoids the "re-encode HPACK as SPDY3" step. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_chromium_client_stream.h" 5 #include "net/quic/quic_chromium_client_stream.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/threading/thread_task_runner_handle.h" 9 #include "base/threading/thread_task_runner_handle.h"
10 #include "net/base/io_buffer.h" 10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 #include "net/quic/quic_chromium_client_session.h" 12 #include "net/quic/quic_chromium_client_session.h"
13 #include "net/quic/quic_http_utils.h" 13 #include "net/quic/quic_http_utils.h"
14 #include "net/quic/quic_spdy_session.h" 14 #include "net/quic/quic_spdy_session.h"
15 #include "net/quic/quic_write_blocked_list.h" 15 #include "net/quic/quic_write_blocked_list.h"
16 #include "net/quic/spdy_utils.h" 16 #include "net/quic/spdy_utils.h"
17 #include "net/spdy/header_coalescer.h"
17 18
18 namespace net { 19 namespace net {
19 20
20 QuicChromiumClientStream::QuicChromiumClientStream( 21 QuicChromiumClientStream::QuicChromiumClientStream(
21 QuicStreamId id, 22 QuicStreamId id,
22 QuicClientSessionBase* session, 23 QuicClientSessionBase* session,
23 const BoundNetLog& net_log) 24 const BoundNetLog& net_log)
24 : QuicSpdyStream(id, session), 25 : QuicSpdyStream(id, session),
25 net_log_(net_log), 26 net_log_(net_log),
26 delegate_(nullptr), 27 delegate_(nullptr),
(...skipping 26 matching lines...) Expand all
53 return; 54 return;
54 } 55 }
55 MarkHeadersConsumed(headers_len); 56 MarkHeadersConsumed(headers_len);
56 session_->OnInitialHeadersComplete(id(), headers); 57 session_->OnInitialHeadersComplete(id(), headers);
57 58
58 // The delegate will read the headers via a posted task. 59 // The delegate will read the headers via a posted task.
59 NotifyDelegateOfHeadersCompleteLater(headers, frame_len); 60 NotifyDelegateOfHeadersCompleteLater(headers, frame_len);
60 } 61 }
61 } 62 }
62 63
64 void QuicChromiumClientStream::OnStreamHeaderList(
65 bool fin,
66 size_t frame_len,
67 const QuicHeaderList& header_list) {
68 QuicSpdyStream::OnStreamHeaderList(fin, frame_len, header_list);
69
70 if (headers_delivered_) {
71 // The delegate will read the trailers via a posted task.
72 NotifyDelegateOfHeadersCompleteLater(received_trailers(), frame_len);
73 } else {
74 HeaderCoalescer coalescer;
75 for (const auto& header : header_list) {
76 coalescer.OnHeader(header.first, header.second);
77 }
78 ConsumeHeaderList();
79 session_->OnInitialHeadersComplete(id(), coalescer.headers());
80
81 // The delegate will read the headers via a posted task.
82 NotifyDelegateOfHeadersCompleteLater(coalescer.headers(), frame_len);
83 }
84 }
85
63 void QuicChromiumClientStream::OnPromiseHeadersComplete( 86 void QuicChromiumClientStream::OnPromiseHeadersComplete(
64 QuicStreamId promised_id, 87 QuicStreamId promised_id,
65 size_t frame_len) { 88 size_t frame_len) {
66 size_t headers_len = decompressed_headers().length(); 89 size_t headers_len = decompressed_headers().length();
67 SpdyHeaderBlock headers; 90 SpdyHeaderBlock headers;
68 SpdyFramer framer(HTTP2); 91 SpdyFramer framer(HTTP2);
69 if (!framer.ParseHeaderBlockInBuffer(decompressed_headers().data(), 92 if (!framer.ParseHeaderBlockInBuffer(decompressed_headers().data(),
70 headers_len, &headers)) { 93 headers_len, &headers)) {
71 DLOG(WARNING) << "Invalid headers"; 94 DLOG(WARNING) << "Invalid headers";
72 Reset(QUIC_BAD_APPLICATION_PAYLOAD); 95 Reset(QUIC_BAD_APPLICATION_PAYLOAD);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 } 238 }
216 239
217 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete( 240 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete(
218 SpdyHeaderBlock headers, 241 SpdyHeaderBlock headers,
219 size_t frame_len) { 242 size_t frame_len) {
220 if (!delegate_) 243 if (!delegate_)
221 return; 244 return;
222 // Only mark trailers consumed when we are about to notify delegate. 245 // Only mark trailers consumed when we are about to notify delegate.
223 if (headers_delivered_) { 246 if (headers_delivered_) {
224 MarkTrailersConsumed(decompressed_trailers().length()); 247 MarkTrailersConsumed(decompressed_trailers().length());
248 MarkTrailersDelivered();
225 net_log_.AddEvent( 249 net_log_.AddEvent(
226 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS, 250 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS,
227 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); 251 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers));
228 } else { 252 } else {
229 headers_delivered_ = true; 253 headers_delivered_ = true;
230 net_log_.AddEvent( 254 net_log_.AddEvent(
231 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS, 255 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS,
232 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); 256 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers));
233 } 257 }
234 258
(...skipping 17 matching lines...) Expand all
252 } else { 276 } else {
253 delegate_tasks_.push_back(closure); 277 delegate_tasks_.push_back(closure);
254 } 278 }
255 } 279 }
256 280
257 void QuicChromiumClientStream::DisableConnectionMigration() { 281 void QuicChromiumClientStream::DisableConnectionMigration() {
258 can_migrate_ = false; 282 can_migrate_ = false;
259 } 283 }
260 284
261 } // namespace net 285 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698