| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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_session.h" | 5 #include "net/quic/core/quic_spdy_session.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstdint> | 8 #include <cstdint> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "net/quic/core/quic_headers_stream.h" | 12 #include "net/quic/core/quic_headers_stream.h" |
| 13 #include "net/quic/platform/api/quic_bug_tracker.h" | 13 #include "net/quic/platform/api/quic_bug_tracker.h" |
| 14 #include "net/quic/platform/api/quic_flag_utils.h" |
| 14 #include "net/quic/platform/api/quic_flags.h" | 15 #include "net/quic/platform/api/quic_flags.h" |
| 15 #include "net/quic/platform/api/quic_logging.h" | 16 #include "net/quic/platform/api/quic_logging.h" |
| 16 #include "net/quic/platform/api/quic_str_cat.h" | 17 #include "net/quic/platform/api/quic_str_cat.h" |
| 18 #include "net/quic/platform/api/quic_text_utils.h" |
| 17 | 19 |
| 18 using std::string; | 20 using std::string; |
| 19 | 21 |
| 20 namespace net { | 22 namespace net { |
| 21 | 23 |
| 22 namespace { | 24 namespace { |
| 23 | 25 |
| 24 class HeaderTableDebugVisitor | 26 class HeaderTableDebugVisitor |
| 25 : public HpackHeaderTable::DebugVisitorInterface { | 27 : public HpackHeaderTable::DebugVisitorInterface { |
| 26 public: | 28 public: |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 return; | 388 return; |
| 387 } | 389 } |
| 388 stream->OnStreamHeadersPriority(priority); | 390 stream->OnStreamHeadersPriority(priority); |
| 389 } | 391 } |
| 390 | 392 |
| 391 void QuicSpdySession::OnStreamHeaderList(QuicStreamId stream_id, | 393 void QuicSpdySession::OnStreamHeaderList(QuicStreamId stream_id, |
| 392 bool fin, | 394 bool fin, |
| 393 size_t frame_len, | 395 size_t frame_len, |
| 394 const QuicHeaderList& header_list) { | 396 const QuicHeaderList& header_list) { |
| 395 QuicSpdyStream* stream = GetSpdyDataStream(stream_id); | 397 QuicSpdyStream* stream = GetSpdyDataStream(stream_id); |
| 396 if (!stream) { | 398 if (stream == nullptr) { |
| 399 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_final_offset_from_trailers, 1, |
| 400 3); |
| 401 if (FLAGS_quic_reloadable_flag_quic_final_offset_from_trailers) { |
| 402 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_final_offset_from_trailers, 2, |
| 403 3); |
| 404 // The stream no longer exists, but trailing headers may contain the final |
| 405 // byte offset necessary for flow control and open stream accounting. |
| 406 size_t final_byte_offset = 0; |
| 407 for (const auto& header : header_list) { |
| 408 const string& header_key = header.first; |
| 409 const string& header_value = header.second; |
| 410 if (header_key == kFinalOffsetHeaderKey) { |
| 411 if (!QuicTextUtils::StringToSizeT(header_value, &final_byte_offset)) { |
| 412 connection()->CloseConnection( |
| 413 QUIC_INVALID_HEADERS_STREAM_DATA, |
| 414 "Trailers are malformed (no final offset)", |
| 415 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); |
| 416 return; |
| 417 } |
| 418 DVLOG(1) << "Received final byte offset in trailers for stream " |
| 419 << stream_id << ", which no longer exists."; |
| 420 OnFinalByteOffsetReceived(stream_id, final_byte_offset); |
| 421 QUIC_FLAG_COUNT_N( |
| 422 quic_reloadable_flag_quic_final_offset_from_trailers, 3, 3); |
| 423 } |
| 424 } |
| 425 } |
| 426 |
| 397 // It's quite possible to receive headers after a stream has been reset. | 427 // It's quite possible to receive headers after a stream has been reset. |
| 398 return; | 428 return; |
| 399 } | 429 } |
| 400 stream->OnStreamHeaderList(fin, frame_len, header_list); | 430 stream->OnStreamHeaderList(fin, frame_len, header_list); |
| 401 } | 431 } |
| 402 | 432 |
| 403 size_t QuicSpdySession::ProcessHeaderData(const struct iovec& iov, | 433 size_t QuicSpdySession::ProcessHeaderData(const struct iovec& iov, |
| 404 QuicTime timestamp) { | 434 QuicTime timestamp) { |
| 405 DCHECK(timestamp.IsInitialized()); | 435 DCHECK(timestamp.IsInitialized()); |
| 406 UpdateCurMaxTimeStamp(timestamp); | 436 UpdateCurMaxTimeStamp(timestamp); |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 set_max_uncompressed_header_bytes); | 797 set_max_uncompressed_header_bytes); |
| 768 } | 798 } |
| 769 | 799 |
| 770 void QuicSpdySession::CloseConnectionWithDetails(QuicErrorCode error, | 800 void QuicSpdySession::CloseConnectionWithDetails(QuicErrorCode error, |
| 771 const string& details) { | 801 const string& details) { |
| 772 connection()->CloseConnection( | 802 connection()->CloseConnection( |
| 773 error, details, ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); | 803 error, details, ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); |
| 774 } | 804 } |
| 775 | 805 |
| 776 } // namespace net | 806 } // namespace net |
| OLD | NEW |