| 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_headers_stream.h" | 5 #include "net/quic/core/quic_headers_stream.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 // session layer. |ForceAckListener| filters the |OnPacketAcked()| | 63 // session layer. |ForceAckListener| filters the |OnPacketAcked()| |
| 64 // notifications generated by the session layer to not count the extra | 64 // notifications generated by the session layer to not count the extra |
| 65 // bytes. Otherwise, code that is using ack listener on streams might | 65 // bytes. Otherwise, code that is using ack listener on streams might |
| 66 // consider it an error if more bytes are acked than were written to | 66 // consider it an error if more bytes are acked than were written to |
| 67 // the stream, it is the case with some internal stats gathering code. | 67 // the stream, it is the case with some internal stats gathering code. |
| 68 class ForceHolAckListener : public QuicAckListenerInterface { | 68 class ForceHolAckListener : public QuicAckListenerInterface { |
| 69 public: | 69 public: |
| 70 // |extra_bytes| should be initialized to the size of the HTTP/2 | 70 // |extra_bytes| should be initialized to the size of the HTTP/2 |
| 71 // DATA frame header inserted when forced HOL blocking is enabled. | 71 // DATA frame header inserted when forced HOL blocking is enabled. |
| 72 ForceHolAckListener( | 72 ForceHolAckListener( |
| 73 scoped_refptr<QuicAckListenerInterface> stream_ack_listener, | 73 QuicReferenceCountedPointer<QuicAckListenerInterface> stream_ack_listener, |
| 74 int extra_bytes) | 74 int extra_bytes) |
| 75 : stream_ack_listener_(std::move(stream_ack_listener)), | 75 : stream_ack_listener_(std::move(stream_ack_listener)), |
| 76 extra_bytes_(extra_bytes) { | 76 extra_bytes_(extra_bytes) { |
| 77 DCHECK_GE(extra_bytes, 0); | 77 DCHECK_GE(extra_bytes, 0); |
| 78 } | 78 } |
| 79 | 79 |
| 80 void OnPacketAcked(int acked_bytes, QuicTime::Delta ack_delay_time) override { | 80 void OnPacketAcked(int acked_bytes, QuicTime::Delta ack_delay_time) override { |
| 81 if (extra_bytes_ > 0) { | 81 if (extra_bytes_ > 0) { |
| 82 // Don't count the added HTTP/2 DATA frame header bytes | 82 // Don't count the added HTTP/2 DATA frame header bytes |
| 83 int delta = std::min(extra_bytes_, acked_bytes); | 83 int delta = std::min(extra_bytes_, acked_bytes); |
| 84 extra_bytes_ -= delta; | 84 extra_bytes_ -= delta; |
| 85 acked_bytes -= delta; | 85 acked_bytes -= delta; |
| 86 } | 86 } |
| 87 stream_ack_listener_->OnPacketAcked(acked_bytes, ack_delay_time); | 87 stream_ack_listener_->OnPacketAcked(acked_bytes, ack_delay_time); |
| 88 } | 88 } |
| 89 | 89 |
| 90 void OnPacketRetransmitted(int retransmitted_bytes) override { | 90 void OnPacketRetransmitted(int retransmitted_bytes) override { |
| 91 stream_ack_listener_->OnPacketRetransmitted(retransmitted_bytes); | 91 stream_ack_listener_->OnPacketRetransmitted(retransmitted_bytes); |
| 92 } | 92 } |
| 93 | 93 |
| 94 private: | 94 protected: |
| 95 ~ForceHolAckListener() override {} | 95 ~ForceHolAckListener() override {} |
| 96 | 96 |
| 97 scoped_refptr<QuicAckListenerInterface> stream_ack_listener_; | 97 private: |
| 98 QuicReferenceCountedPointer<QuicAckListenerInterface> stream_ack_listener_; |
| 98 int extra_bytes_; | 99 int extra_bytes_; |
| 99 | 100 |
| 100 DISALLOW_COPY_AND_ASSIGN(ForceHolAckListener); | 101 DISALLOW_COPY_AND_ASSIGN(ForceHolAckListener); |
| 101 }; | 102 }; |
| 102 | 103 |
| 103 } // namespace | 104 } // namespace |
| 104 | 105 |
| 105 QuicHeadersStream::HpackDebugVisitor::HpackDebugVisitor() {} | 106 QuicHeadersStream::HpackDebugVisitor::HpackDebugVisitor() {} |
| 106 | 107 |
| 107 QuicHeadersStream::HpackDebugVisitor::~HpackDebugVisitor() {} | 108 QuicHeadersStream::HpackDebugVisitor::~HpackDebugVisitor() {} |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 DisableConnectionFlowControlForThisStream(); | 338 DisableConnectionFlowControlForThisStream(); |
| 338 } | 339 } |
| 339 | 340 |
| 340 QuicHeadersStream::~QuicHeadersStream() {} | 341 QuicHeadersStream::~QuicHeadersStream() {} |
| 341 | 342 |
| 342 size_t QuicHeadersStream::WriteHeaders( | 343 size_t QuicHeadersStream::WriteHeaders( |
| 343 QuicStreamId stream_id, | 344 QuicStreamId stream_id, |
| 344 SpdyHeaderBlock headers, | 345 SpdyHeaderBlock headers, |
| 345 bool fin, | 346 bool fin, |
| 346 SpdyPriority priority, | 347 SpdyPriority priority, |
| 347 scoped_refptr<QuicAckListenerInterface> ack_listener) { | 348 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) { |
| 348 SpdyHeadersIR headers_frame(stream_id, std::move(headers)); | 349 SpdyHeadersIR headers_frame(stream_id, std::move(headers)); |
| 349 headers_frame.set_fin(fin); | 350 headers_frame.set_fin(fin); |
| 350 if (session()->perspective() == Perspective::IS_CLIENT) { | 351 if (session()->perspective() == Perspective::IS_CLIENT) { |
| 351 headers_frame.set_has_priority(true); | 352 headers_frame.set_has_priority(true); |
| 352 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(priority)); | 353 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(priority)); |
| 353 } | 354 } |
| 354 SpdySerializedFrame frame(spdy_framer_.SerializeFrame(headers_frame)); | 355 SpdySerializedFrame frame(spdy_framer_.SerializeFrame(headers_frame)); |
| 355 WriteOrBufferData(StringPiece(frame.data(), frame.size()), false, | 356 WriteOrBufferData(StringPiece(frame.data(), frame.size()), false, |
| 356 std::move(ack_listener)); | 357 std::move(ack_listener)); |
| 357 return frame.size(); | 358 return frame.size(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 374 | 375 |
| 375 SpdySerializedFrame frame(spdy_framer_.SerializeFrame(push_promise)); | 376 SpdySerializedFrame frame(spdy_framer_.SerializeFrame(push_promise)); |
| 376 WriteOrBufferData(StringPiece(frame.data(), frame.size()), false, nullptr); | 377 WriteOrBufferData(StringPiece(frame.data(), frame.size()), false, nullptr); |
| 377 return frame.size(); | 378 return frame.size(); |
| 378 } | 379 } |
| 379 | 380 |
| 380 void QuicHeadersStream::WriteDataFrame( | 381 void QuicHeadersStream::WriteDataFrame( |
| 381 QuicStreamId id, | 382 QuicStreamId id, |
| 382 StringPiece data, | 383 StringPiece data, |
| 383 bool fin, | 384 bool fin, |
| 384 scoped_refptr<QuicAckListenerInterface> ack_notifier_delegate) { | 385 QuicReferenceCountedPointer<QuicAckListenerInterface> |
| 386 ack_notifier_delegate) { |
| 385 SpdyDataIR spdy_data(id, data); | 387 SpdyDataIR spdy_data(id, data); |
| 386 spdy_data.set_fin(fin); | 388 spdy_data.set_fin(fin); |
| 387 SpdySerializedFrame frame(spdy_framer_.SerializeFrame(spdy_data)); | 389 SpdySerializedFrame frame(spdy_framer_.SerializeFrame(spdy_data)); |
| 388 scoped_refptr<ForceHolAckListener> ack_listener; | 390 QuicReferenceCountedPointer<ForceHolAckListener> ack_listener; |
| 389 if (ack_notifier_delegate != nullptr) { | 391 if (ack_notifier_delegate != nullptr) { |
| 390 ack_listener = new ForceHolAckListener(std::move(ack_notifier_delegate), | 392 ack_listener = new ForceHolAckListener(std::move(ack_notifier_delegate), |
| 391 frame.size() - data.length()); | 393 frame.size() - data.length()); |
| 392 } | 394 } |
| 393 // Use buffered writes so that coherence of framing is preserved | 395 // Use buffered writes so that coherence of framing is preserved |
| 394 // between streams. | 396 // between streams. |
| 395 WriteOrBufferData(StringPiece(frame.data(), frame.size()), false, | 397 WriteOrBufferData(StringPiece(frame.data(), frame.size()), false, |
| 396 std::move(ack_listener)); | 398 std::move(ack_listener)); |
| 397 } | 399 } |
| 398 | 400 |
| 399 QuicConsumedData QuicHeadersStream::WritevStreamData( | 401 QuicConsumedData QuicHeadersStream::WritevStreamData( |
| 400 QuicStreamId id, | 402 QuicStreamId id, |
| 401 QuicIOVector iov, | 403 QuicIOVector iov, |
| 402 QuicStreamOffset offset, | 404 QuicStreamOffset offset, |
| 403 bool fin, | 405 bool fin, |
| 404 scoped_refptr<QuicAckListenerInterface> ack_notifier_delegate) { | 406 QuicReferenceCountedPointer<QuicAckListenerInterface> |
| 407 ack_notifier_delegate) { |
| 405 const size_t max_len = | 408 const size_t max_len = |
| 406 kSpdyInitialFrameSizeLimit - SpdyConstants::kDataFrameMinimumSize; | 409 kSpdyInitialFrameSizeLimit - SpdyConstants::kDataFrameMinimumSize; |
| 407 | 410 |
| 408 QuicConsumedData result(0, false); | 411 QuicConsumedData result(0, false); |
| 409 size_t total_length = iov.total_length; | 412 size_t total_length = iov.total_length; |
| 410 | 413 |
| 411 if (total_length == 0 && fin) { | 414 if (total_length == 0 && fin) { |
| 412 WriteDataFrame(id, StringPiece(), true, std::move(ack_notifier_delegate)); | 415 WriteDataFrame(id, StringPiece(), true, std::move(ack_notifier_delegate)); |
| 413 result.fin_consumed = true; | 416 result.fin_consumed = true; |
| 414 return result; | 417 return result; |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 626 return true; | 629 return true; |
| 627 } | 630 } |
| 628 frame_len_ -= len; | 631 frame_len_ -= len; |
| 629 // Ignore fin_ while there is more data coming, if frame_len_ > 0. | 632 // Ignore fin_ while there is more data coming, if frame_len_ > 0. |
| 630 spdy_session_->OnStreamFrameData(stream_id, data, len, | 633 spdy_session_->OnStreamFrameData(stream_id, data, len, |
| 631 frame_len_ > 0 ? false : fin_); | 634 frame_len_ > 0 ? false : fin_); |
| 632 return true; | 635 return true; |
| 633 } | 636 } |
| 634 | 637 |
| 635 } // namespace net | 638 } // namespace net |
| OLD | NEW |