OLD | NEW |
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/chromium/quic_chromium_client_stream.h" | 5 #include "net/quic/chromium/quic_chromium_client_stream.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 headers_delivered_(false), | 31 headers_delivered_(false), |
32 session_(session), | 32 session_(session), |
33 can_migrate_(true), | 33 can_migrate_(true), |
34 weak_factory_(this) {} | 34 weak_factory_(this) {} |
35 | 35 |
36 QuicChromiumClientStream::~QuicChromiumClientStream() { | 36 QuicChromiumClientStream::~QuicChromiumClientStream() { |
37 if (delegate_) | 37 if (delegate_) |
38 delegate_->OnClose(); | 38 delegate_->OnClose(); |
39 } | 39 } |
40 | 40 |
41 void QuicChromiumClientStream::OnStreamHeadersComplete(bool fin, | |
42 size_t frame_len) { | |
43 QuicSpdyStream::OnStreamHeadersComplete(fin, frame_len); | |
44 if (decompressed_headers().empty() && !decompressed_trailers().empty()) { | |
45 DCHECK(trailers_decompressed()); | |
46 // The delegate will read the trailers via a posted task. | |
47 NotifyDelegateOfHeadersCompleteLater(received_trailers().Clone(), | |
48 frame_len); | |
49 } else { | |
50 DCHECK(!headers_delivered_); | |
51 SpdyHeaderBlock headers; | |
52 SpdyFramer framer(HTTP2); | |
53 size_t headers_len = decompressed_headers().length(); | |
54 const char* header_data = decompressed_headers().data(); | |
55 if (!framer.ParseHeaderBlockInBuffer(header_data, headers_len, &headers)) { | |
56 DLOG(WARNING) << "Invalid headers"; | |
57 Reset(QUIC_BAD_APPLICATION_PAYLOAD); | |
58 return; | |
59 } | |
60 MarkHeadersConsumed(headers_len); | |
61 session_->OnInitialHeadersComplete(id(), headers); | |
62 | |
63 // The delegate will read the headers via a posted task. | |
64 NotifyDelegateOfHeadersCompleteLater(std::move(headers), frame_len); | |
65 } | |
66 } | |
67 | |
68 void QuicChromiumClientStream::OnInitialHeadersComplete( | 41 void QuicChromiumClientStream::OnInitialHeadersComplete( |
69 bool fin, | 42 bool fin, |
70 size_t frame_len, | 43 size_t frame_len, |
71 const QuicHeaderList& header_list) { | 44 const QuicHeaderList& header_list) { |
72 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len, header_list); | 45 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len, header_list); |
73 | 46 |
74 SpdyHeaderBlock header_block; | 47 SpdyHeaderBlock header_block; |
75 int64_t length = -1; | 48 int64_t length = -1; |
76 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &length, &header_block)) { | 49 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &length, &header_block)) { |
77 DLOG(ERROR) << "Failed to parse header list: " << header_list.DebugString(); | 50 DLOG(ERROR) << "Failed to parse header list: " << header_list.DebugString(); |
(...skipping 10 matching lines...) Expand all Loading... |
88 } | 61 } |
89 | 62 |
90 void QuicChromiumClientStream::OnTrailingHeadersComplete( | 63 void QuicChromiumClientStream::OnTrailingHeadersComplete( |
91 bool fin, | 64 bool fin, |
92 size_t frame_len, | 65 size_t frame_len, |
93 const QuicHeaderList& header_list) { | 66 const QuicHeaderList& header_list) { |
94 QuicSpdyStream::OnTrailingHeadersComplete(fin, frame_len, header_list); | 67 QuicSpdyStream::OnTrailingHeadersComplete(fin, frame_len, header_list); |
95 NotifyDelegateOfHeadersCompleteLater(received_trailers().Clone(), frame_len); | 68 NotifyDelegateOfHeadersCompleteLater(received_trailers().Clone(), frame_len); |
96 } | 69 } |
97 | 70 |
98 void QuicChromiumClientStream::OnPromiseHeadersComplete( | |
99 QuicStreamId promised_id, | |
100 size_t frame_len) { | |
101 size_t headers_len = decompressed_headers().length(); | |
102 SpdyHeaderBlock headers; | |
103 SpdyFramer framer(HTTP2); | |
104 if (!framer.ParseHeaderBlockInBuffer(decompressed_headers().data(), | |
105 headers_len, &headers)) { | |
106 DLOG(WARNING) << "Invalid headers"; | |
107 Reset(QUIC_BAD_APPLICATION_PAYLOAD); | |
108 return; | |
109 } | |
110 MarkHeadersConsumed(headers_len); | |
111 | |
112 session_->HandlePromised(id(), promised_id, headers); | |
113 } | |
114 | |
115 void QuicChromiumClientStream::OnPromiseHeaderList( | 71 void QuicChromiumClientStream::OnPromiseHeaderList( |
116 QuicStreamId promised_id, | 72 QuicStreamId promised_id, |
117 size_t frame_len, | 73 size_t frame_len, |
118 const QuicHeaderList& header_list) { | 74 const QuicHeaderList& header_list) { |
119 SpdyHeaderBlock promise_headers; | 75 SpdyHeaderBlock promise_headers; |
120 int64_t content_length = -1; | 76 int64_t content_length = -1; |
121 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length, | 77 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length, |
122 &promise_headers)) { | 78 &promise_headers)) { |
123 DLOG(ERROR) << "Failed to parse header list: " << header_list.DebugString(); | 79 DLOG(ERROR) << "Failed to parse header list: " << header_list.DebugString(); |
124 ConsumeHeaderList(); | 80 ConsumeHeaderList(); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), frame_len)); | 240 weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), frame_len)); |
285 } | 241 } |
286 | 242 |
287 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete( | 243 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete( |
288 SpdyHeaderBlock headers, | 244 SpdyHeaderBlock headers, |
289 size_t frame_len) { | 245 size_t frame_len) { |
290 if (!delegate_) | 246 if (!delegate_) |
291 return; | 247 return; |
292 // Only mark trailers consumed when we are about to notify delegate. | 248 // Only mark trailers consumed when we are about to notify delegate. |
293 if (headers_delivered_) { | 249 if (headers_delivered_) { |
294 MarkTrailersConsumed(decompressed_trailers().length()); | |
295 MarkTrailersConsumed(); | 250 MarkTrailersConsumed(); |
296 // Post an async task to notify delegate of the FIN flag. | 251 // Post an async task to notify delegate of the FIN flag. |
297 NotifyDelegateOfDataAvailableLater(); | 252 NotifyDelegateOfDataAvailableLater(); |
298 net_log_.AddEvent( | 253 net_log_.AddEvent( |
299 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS, | 254 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS, |
300 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); | 255 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); |
301 } else { | 256 } else { |
302 headers_delivered_ = true; | 257 headers_delivered_ = true; |
303 net_log_.AddEvent( | 258 net_log_.AddEvent( |
304 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS, | 259 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS, |
(...skipping 24 matching lines...) Expand all Loading... |
329 | 284 |
330 void QuicChromiumClientStream::DisableConnectionMigration() { | 285 void QuicChromiumClientStream::DisableConnectionMigration() { |
331 can_migrate_ = false; | 286 can_migrate_ = false; |
332 } | 287 } |
333 | 288 |
334 bool QuicChromiumClientStream::IsFirstStream() { | 289 bool QuicChromiumClientStream::IsFirstStream() { |
335 return id() == kHeadersStreamId + 2; | 290 return id() == kHeadersStreamId + 2; |
336 } | 291 } |
337 | 292 |
338 } // namespace net | 293 } // namespace net |
OLD | NEW |