OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/core/quic_spdy_stream.h" | 5 #include "net/quic/core/quic_spdy_stream.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 namespace net { | 22 namespace net { |
23 | 23 |
24 #define ENDPOINT \ | 24 #define ENDPOINT \ |
25 (session()->perspective() == Perspective::IS_SERVER ? "Server: " : "Client:" \ | 25 (session()->perspective() == Perspective::IS_SERVER ? "Server: " : "Client:" \ |
26 " ") | 26 " ") |
27 | 27 |
28 QuicSpdyStream::QuicSpdyStream(QuicStreamId id, QuicSpdySession* spdy_session) | 28 QuicSpdyStream::QuicSpdyStream(QuicStreamId id, QuicSpdySession* spdy_session) |
29 : ReliableQuicStream(id, spdy_session), | 29 : ReliableQuicStream(id, spdy_session), |
30 spdy_session_(spdy_session), | 30 spdy_session_(spdy_session), |
31 visitor_(nullptr), | 31 visitor_(nullptr), |
| 32 allow_bidirectional_data_(false), |
32 headers_decompressed_(false), | 33 headers_decompressed_(false), |
33 priority_(kDefaultPriority), | 34 priority_(kDefaultPriority), |
34 trailers_decompressed_(false), | 35 trailers_decompressed_(false), |
35 trailers_consumed_(false) { | 36 trailers_consumed_(false) { |
36 DCHECK_NE(kCryptoStreamId, id); | 37 DCHECK_NE(kCryptoStreamId, id); |
37 // Don't receive any callbacks from the sequencer until headers | 38 // Don't receive any callbacks from the sequencer until headers |
38 // are complete. | 39 // are complete. |
39 sequencer()->SetBlockedUntilFlush(); | 40 sequencer()->SetBlockedUntilFlush(); |
40 spdy_session_->RegisterStreamPriority(id, priority_); | 41 spdy_session_->RegisterStreamPriority(id, priority_); |
41 } | 42 } |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 if (!headers_decompressed_) { | 198 if (!headers_decompressed_) { |
198 OnInitialHeadersComplete(fin, frame_len); | 199 OnInitialHeadersComplete(fin, frame_len); |
199 } else { | 200 } else { |
200 OnTrailingHeadersComplete(fin, frame_len); | 201 OnTrailingHeadersComplete(fin, frame_len); |
201 } | 202 } |
202 } | 203 } |
203 | 204 |
204 void QuicSpdyStream::OnStreamHeaderList(bool fin, | 205 void QuicSpdyStream::OnStreamHeaderList(bool fin, |
205 size_t frame_len, | 206 size_t frame_len, |
206 const QuicHeaderList& header_list) { | 207 const QuicHeaderList& header_list) { |
| 208 // The headers list avoid infinite buffering by clearing the headers list |
| 209 // if the current headers are too large. So if the list is empty here |
| 210 // then the headers list must have been too large, and the stream should |
| 211 // be reset. |
| 212 if (FLAGS_quic_limit_uncompressed_headers && header_list.empty()) { |
| 213 OnHeadersTooLarge(); |
| 214 if (IsDoneReading()) { |
| 215 return; |
| 216 } |
| 217 } |
207 if (!headers_decompressed_) { | 218 if (!headers_decompressed_) { |
208 OnInitialHeadersComplete(fin, frame_len, header_list); | 219 OnInitialHeadersComplete(fin, frame_len, header_list); |
209 } else { | 220 } else { |
210 OnTrailingHeadersComplete(fin, frame_len, header_list); | 221 OnTrailingHeadersComplete(fin, frame_len, header_list); |
211 } | 222 } |
212 } | 223 } |
213 | 224 |
| 225 void QuicSpdyStream::OnHeadersTooLarge() { |
| 226 Reset(QUIC_HEADERS_TOO_LARGE); |
| 227 } |
| 228 |
214 void QuicSpdyStream::OnInitialHeadersComplete(bool fin, size_t /*frame_len*/) { | 229 void QuicSpdyStream::OnInitialHeadersComplete(bool fin, size_t /*frame_len*/) { |
215 headers_decompressed_ = true; | 230 headers_decompressed_ = true; |
216 if (fin) { | 231 if (fin) { |
217 OnStreamFrame(QuicStreamFrame(id(), fin, 0, StringPiece())); | 232 OnStreamFrame(QuicStreamFrame(id(), fin, 0, StringPiece())); |
218 } | 233 } |
219 if (FinishedReadingHeaders()) { | 234 if (FinishedReadingHeaders()) { |
220 sequencer()->SetUnblocked(); | 235 sequencer()->SetUnblocked(); |
221 } | 236 } |
222 } | 237 } |
223 | 238 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 if (spdy_session_->headers_stream() != nullptr && | 432 if (spdy_session_->headers_stream() != nullptr && |
418 spdy_session_->force_hol_blocking()) { | 433 spdy_session_->force_hol_blocking()) { |
419 return spdy_session_->headers_stream()->WritevStreamData( | 434 return spdy_session_->headers_stream()->WritevStreamData( |
420 id(), iov, offset, fin, ack_notifier_delegate); | 435 id(), iov, offset, fin, ack_notifier_delegate); |
421 } | 436 } |
422 return ReliableQuicStream::WritevDataInner(iov, offset, fin, | 437 return ReliableQuicStream::WritevDataInner(iov, offset, fin, |
423 ack_notifier_delegate); | 438 ack_notifier_delegate); |
424 } | 439 } |
425 | 440 |
426 } // namespace net | 441 } // namespace net |
OLD | NEW |