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 |