Add WritevData() in StreamDelegateInterface and let QuicSession::WritevData implement it.
gfe-relnote: no behavior change. not protected.
PiperOrigin-RevId: 295818988
Change-Id: Ic5f9e7bf8ec7c4fc63feaaee96b213911a386433
diff --git a/quic/core/quic_crypto_stream.cc b/quic/core/quic_crypto_stream.cc
index 8e32448..8a3153d 100644
--- a/quic/core/quic_crypto_stream.cc
+++ b/quic/core/quic_crypto_stream.cc
@@ -290,7 +290,7 @@
// Set appropriate encryption level.
session()->connection()->SetDefaultEncryptionLevel(
retransmission_encryption_level);
- QuicConsumedData consumed = session()->WritevData(
+ QuicConsumedData consumed = stream_delegate()->WritevData(
this, id(), pending.length, pending.offset, NO_FIN);
QUIC_DVLOG(1) << ENDPOINT << "stream " << id()
<< " tries to retransmit stream data [" << pending.offset
@@ -332,7 +332,7 @@
QuicByteCount retransmission_length = interval.max() - interval.min();
// Set appropriate encryption level.
session()->connection()->SetDefaultEncryptionLevel(send_encryption_level);
- QuicConsumedData consumed = session()->WritevData(
+ QuicConsumedData consumed = stream_delegate()->WritevData(
this, id(), retransmission_length, retransmission_offset, NO_FIN);
QUIC_DVLOG(1) << ENDPOINT << "stream " << id()
<< " is forced to retransmit stream data ["
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 466d17b..1d6534f 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -165,17 +165,6 @@
const QuicSocketAddress& peer_address,
const QuicReceivedPacket& packet);
- // Called by streams when they want to write data to the peer.
- // Returns a pair with the number of bytes consumed from data, and a boolean
- // indicating if the fin bit was consumed. This does not indicate the data
- // has been sent on the wire: it may have been turned into a packet and queued
- // if the socket was unexpectedly blocked.
- virtual QuicConsumedData WritevData(QuicStream* stream,
- QuicStreamId id,
- size_t write_length,
- QuicStreamOffset offset,
- StreamSendingState state);
-
// Called by application to send |message|. Data copy can be avoided if
// |message| is provided in reference counted memory.
// Please note, |message| provided in reference counted memory would be moved
@@ -263,6 +252,17 @@
void OnStreamError(QuicErrorCode error_code,
std::string error_details) override;
+ // Called by streams when they want to write data to the peer.
+ // Returns a pair with the number of bytes consumed from data, and a boolean
+ // indicating if the fin bit was consumed. This does not indicate the data
+ // has been sent on the wire: it may have been turned into a packet and queued
+ // if the socket was unexpectedly blocked.
+ QuicConsumedData WritevData(QuicStream* stream,
+ QuicStreamId id,
+ size_t write_length,
+ QuicStreamOffset offset,
+ StreamSendingState state) override;
+
// Called by the QuicCryptoStream when a handshake message is sent.
virtual void OnCryptoHandshakeMessageSent(
const CryptoHandshakeMessage& message);
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index fee630b..6dcbd36 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -929,9 +929,9 @@
const bool can_bundle_fin =
retransmit_fin && (retransmission_offset + retransmission_length ==
stream_bytes_written());
- consumed = session()->WritevData(this, id_, retransmission_length,
- retransmission_offset,
- can_bundle_fin ? FIN : NO_FIN);
+ consumed = stream_delegate_->WritevData(this, id_, retransmission_length,
+ retransmission_offset,
+ can_bundle_fin ? FIN : NO_FIN);
QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
<< " is forced to retransmit stream data ["
<< retransmission_offset << ", "
@@ -952,7 +952,8 @@
if (retransmit_fin) {
QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
<< " retransmits fin only frame.";
- consumed = session()->WritevData(this, id_, 0, stream_bytes_written(), FIN);
+ consumed =
+ stream_delegate_->WritevData(this, id_, 0, stream_bytes_written(), FIN);
if (!consumed.fin_consumed) {
return false;
}
@@ -1022,7 +1023,7 @@
if (fin && add_random_padding_after_fin_) {
state = FIN_AND_PADDING;
}
- QuicConsumedData consumed_data = session_->WritevData(
+ QuicConsumedData consumed_data = stream_delegate_->WritevData(
this, id(), write_length, stream_bytes_written(), state);
OnStreamDataConsumed(consumed_data.bytes_consumed);
@@ -1097,8 +1098,8 @@
if (!send_buffer_.HasPendingRetransmission()) {
QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
<< " retransmits fin only frame.";
- consumed =
- session()->WritevData(this, id_, 0, stream_bytes_written(), FIN);
+ consumed = stream_delegate_->WritevData(this, id_, 0,
+ stream_bytes_written(), FIN);
fin_lost_ = !consumed.fin_consumed;
if (fin_lost_) {
// Connection is write blocked.
@@ -1111,9 +1112,9 @@
const bool can_bundle_fin =
fin_lost_ &&
(pending.offset + pending.length == stream_bytes_written());
- consumed =
- session()->WritevData(this, id_, pending.length, pending.offset,
- can_bundle_fin ? FIN : NO_FIN);
+ consumed = stream_delegate_->WritevData(this, id_, pending.length,
+ pending.offset,
+ can_bundle_fin ? FIN : NO_FIN);
QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
<< " tries to retransmit stream data [" << pending.offset
<< ", " << pending.offset + pending.length
diff --git a/quic/core/stream_delegate_interface.h b/quic/core/stream_delegate_interface.h
index f6d052a..2616f13 100644
--- a/quic/core/stream_delegate_interface.h
+++ b/quic/core/stream_delegate_interface.h
@@ -5,10 +5,13 @@
#ifndef QUICHE_QUIC_CORE_STREAM_DELEGATE_INTERFACE_H_
#define QUICHE_QUIC_CORE_STREAM_DELEGATE_INTERFACE_H_
+#include <cstddef>
#include "net/third_party/quiche/src/quic/core/quic_types.h"
namespace quic {
+class QuicStream;
+
class QUIC_EXPORT_PRIVATE StreamDelegateInterface {
public:
virtual ~StreamDelegateInterface() {}
@@ -16,6 +19,13 @@
// Called when the stream has encountered errors that it can't handle.
virtual void OnStreamError(QuicErrorCode error_code,
std::string error_details) = 0;
+
+ // Called when the stream needs to write data.
+ virtual QuicConsumedData WritevData(QuicStream* stream,
+ QuicStreamId id,
+ size_t write_length,
+ QuicStreamOffset offset,
+ StreamSendingState state) = 0;
};
} // namespace quic