Update QuicStream::OnConnectionClosed() to take in full connection close frame so that error details can be extracted.
NOT generated via copybara. But the piper transformation is manually tested.
PiperOrigin-RevId: 645157880
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc
index f640665..f52476b 100644
--- a/quiche/quic/core/http/quic_spdy_session_test.cc
+++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -194,7 +194,7 @@
MOCK_METHOD(bool, HasPendingRetransmission, (), (const, override));
- void OnConnectionClosed(QuicErrorCode /*error*/,
+ void OnConnectionClosed(const QuicConnectionCloseFrame& /*frame*/,
ConnectionCloseSource /*source*/) override {}
SSL* GetSsl() const override { return nullptr; }
bool IsCryptoFrameExpectedForEncryptionLevel(
diff --git a/quiche/quic/core/http/quic_spdy_stream_test.cc b/quiche/quic/core/http/quic_spdy_stream_test.cc
index e3f42ca..95df725 100644
--- a/quiche/quic/core/http/quic_spdy_stream_test.cc
+++ b/quiche/quic/core/http/quic_spdy_stream_test.cc
@@ -164,7 +164,7 @@
void OnPacketDecrypted(EncryptionLevel /*level*/) override {}
void OnOneRttPacketAcknowledged() override {}
void OnHandshakePacketSent() override {}
- void OnConnectionClosed(QuicErrorCode /*error*/,
+ void OnConnectionClosed(const QuicConnectionCloseFrame& /*frame*/,
ConnectionCloseSource /*source*/) override {}
void OnHandshakeDoneReceived() override {}
void OnNewTokenReceived(absl::string_view /*token*/) override {}
diff --git a/quiche/quic/core/quic_crypto_client_stream.cc b/quiche/quic/core/quic_crypto_client_stream.cc
index 84eb9ae..aa11954 100644
--- a/quiche/quic/core/quic_crypto_client_stream.cc
+++ b/quiche/quic/core/quic_crypto_client_stream.cc
@@ -145,9 +145,9 @@
handshaker_->OnHandshakePacketSent();
}
-void QuicCryptoClientStream::OnConnectionClosed(QuicErrorCode error,
- ConnectionCloseSource source) {
- handshaker_->OnConnectionClosed(error, source);
+void QuicCryptoClientStream::OnConnectionClosed(
+ const QuicConnectionCloseFrame& frame, ConnectionCloseSource source) {
+ handshaker_->OnConnectionClosed(frame.quic_error_code, source);
}
void QuicCryptoClientStream::OnHandshakeDoneReceived() {
diff --git a/quiche/quic/core/quic_crypto_client_stream.h b/quiche/quic/core/quic_crypto_client_stream.h
index 1805289..71844aa 100644
--- a/quiche/quic/core/quic_crypto_client_stream.h
+++ b/quiche/quic/core/quic_crypto_client_stream.h
@@ -286,7 +286,7 @@
void OnPacketDecrypted(EncryptionLevel /*level*/) override {}
void OnOneRttPacketAcknowledged() override;
void OnHandshakePacketSent() override;
- void OnConnectionClosed(QuicErrorCode error,
+ void OnConnectionClosed(const QuicConnectionCloseFrame& frame,
ConnectionCloseSource source) override;
void OnHandshakeDoneReceived() override;
void OnNewTokenReceived(absl::string_view token) override;
diff --git a/quiche/quic/core/quic_crypto_server_stream.h b/quiche/quic/core/quic_crypto_server_stream.h
index 49c9cc2..86fde9e 100644
--- a/quiche/quic/core/quic_crypto_server_stream.h
+++ b/quiche/quic/core/quic_crypto_server_stream.h
@@ -46,7 +46,7 @@
void OnPacketDecrypted(EncryptionLevel level) override;
void OnOneRttPacketAcknowledged() override {}
void OnHandshakePacketSent() override {}
- void OnConnectionClosed(QuicErrorCode /*error*/,
+ void OnConnectionClosed(const QuicConnectionCloseFrame& /*frame*/,
ConnectionCloseSource /*source*/) override {}
void OnHandshakeDoneReceived() override;
void OnNewTokenReceived(absl::string_view token) override;
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc
index d8aa677..a8b113b 100644
--- a/quiche/quic/core/quic_session.cc
+++ b/quiche/quic/core/quic_session.cc
@@ -515,11 +515,11 @@
source_ = source;
}
- GetMutableCryptoStream()->OnConnectionClosed(frame.quic_error_code, source);
+ GetMutableCryptoStream()->OnConnectionClosed(frame, source);
PerformActionOnActiveStreams([this, frame, source](QuicStream* stream) {
QuicStreamId id = stream->id();
- stream->OnConnectionClosed(frame.quic_error_code, source);
+ stream->OnConnectionClosed(frame, source);
auto it = stream_map_.find(id);
if (it != stream_map_.end()) {
QUIC_BUG_IF(quic_bug_12435_2, !it->second->IsZombie())
diff --git a/quiche/quic/core/quic_session_test.cc b/quiche/quic/core/quic_session_test.cc
index 778b3e2..5067d9e 100644
--- a/quiche/quic/core/quic_session_test.cc
+++ b/quiche/quic/core/quic_session_test.cc
@@ -172,7 +172,7 @@
MOCK_METHOD(bool, HasPendingRetransmission, (), (const, override));
- void OnConnectionClosed(QuicErrorCode /*error*/,
+ void OnConnectionClosed(const QuicConnectionCloseFrame& /*frame*/,
ConnectionCloseSource /*source*/) override {}
bool ExportKeyingMaterial(absl::string_view /*label*/,
diff --git a/quiche/quic/core/quic_stream.cc b/quiche/quic/core/quic_stream.cc
index 4fdb87a..e927ee2 100644
--- a/quiche/quic/core/quic_stream.cc
+++ b/quiche/quic/core/quic_stream.cc
@@ -563,15 +563,16 @@
CloseReadSide();
}
-void QuicStream::OnConnectionClosed(QuicErrorCode error,
+void QuicStream::OnConnectionClosed(const QuicConnectionCloseFrame& frame,
ConnectionCloseSource /*source*/) {
if (read_side_closed_ && write_side_closed_) {
return;
}
- if (error != QUIC_NO_ERROR) {
+ auto error_code = frame.quic_error_code;
+ if (error_code != QUIC_NO_ERROR) {
stream_error_ =
QuicResetStreamError::FromInternal(QUIC_STREAM_CONNECTION_ERROR);
- connection_error_ = error;
+ connection_error_ = error_code;
}
CloseWriteSide();
diff --git a/quiche/quic/core/quic_stream.h b/quiche/quic/core/quic_stream.h
index 9260045..43cacc0 100644
--- a/quiche/quic/core/quic_stream.h
+++ b/quiche/quic/core/quic_stream.h
@@ -25,6 +25,7 @@
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
+#include "quiche/quic/core/frames/quic_connection_close_frame.h"
#include "quiche/quic/core/frames/quic_rst_stream_frame.h"
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_flow_controller.h"
@@ -197,7 +198,7 @@
// Called by the session when the endpoint receives or sends a connection
// close, and should immediately close the stream.
- virtual void OnConnectionClosed(QuicErrorCode error,
+ virtual void OnConnectionClosed(const QuicConnectionCloseFrame& frame,
ConnectionCloseSource source);
const QuicStreamPriority& priority() const;
diff --git a/quiche/quic/core/quic_stream_test.cc b/quiche/quic/core/quic_stream_test.cc
index a9cb1d5..6e345cf 100644
--- a/quiche/quic/core/quic_stream_test.cc
+++ b/quiche/quic/core/quic_stream_test.cc
@@ -14,6 +14,7 @@
#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
#include "quiche/quic/core/crypto/null_encrypter.h"
+#include "quiche/quic/core/frames/quic_connection_close_frame.h"
#include "quiche/quic/core/frames/quic_rst_stream_frame.h"
#include "quiche/quic/core/quic_connection.h"
#include "quiche/quic/core/quic_constants.h"
@@ -509,8 +510,9 @@
}
EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_STREAM_CANCELLED));
EXPECT_THAT(stream_->connection_error(), IsQuicNoError());
- stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR,
- ConnectionCloseSource::FROM_SELF);
+ QuicConnectionCloseFrame frame;
+ frame.quic_error_code = QUIC_INTERNAL_ERROR;
+ stream_->OnConnectionClosed(frame, ConnectionCloseSource::FROM_SELF);
EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_STREAM_CANCELLED));
EXPECT_THAT(stream_->connection_error(), IsQuicNoError());
}
@@ -1104,8 +1106,9 @@
stream_->id(),
QuicResetStreamError::FromInternal(QUIC_RST_ACKNOWLEDGEMENT), 9));
QuicConnectionPeer::SetConnectionClose(connection_);
- stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR,
- ConnectionCloseSource::FROM_SELF);
+ QuicConnectionCloseFrame frame;
+ frame.quic_error_code = QUIC_INTERNAL_ERROR;
+ stream_->OnConnectionClosed(frame, ConnectionCloseSource::FROM_SELF);
EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
// Stream stops waiting for acks as connection is going to close.
EXPECT_FALSE(stream_->IsWaitingForAcks());
diff --git a/quiche/quic/core/tls_server_handshaker.cc b/quiche/quic/core/tls_server_handshaker.cc
index 684d4ed..aee6903 100644
--- a/quiche/quic/core/tls_server_handshaker.cc
+++ b/quiche/quic/core/tls_server_handshaker.cc
@@ -412,9 +412,9 @@
return ExportKeyingMaterialForLabel(label, context, result_len, result);
}
-void TlsServerHandshaker::OnConnectionClosed(QuicErrorCode error,
- ConnectionCloseSource source) {
- TlsHandshaker::OnConnectionClosed(error, source);
+void TlsServerHandshaker::OnConnectionClosed(
+ const QuicConnectionCloseFrame& frame, ConnectionCloseSource source) {
+ TlsHandshaker::OnConnectionClosed(frame.quic_error_code, source);
}
ssl_early_data_reason_t TlsServerHandshaker::EarlyDataReason() const {
diff --git a/quiche/quic/core/tls_server_handshaker.h b/quiche/quic/core/tls_server_handshaker.h
index c81a7fc..d8c7328 100644
--- a/quiche/quic/core/tls_server_handshaker.h
+++ b/quiche/quic/core/tls_server_handshaker.h
@@ -75,7 +75,7 @@
void OnPacketDecrypted(EncryptionLevel level) override;
void OnOneRttPacketAcknowledged() override {}
void OnHandshakePacketSent() override {}
- void OnConnectionClosed(QuicErrorCode error,
+ void OnConnectionClosed(const QuicConnectionCloseFrame& frame,
ConnectionCloseSource source) override;
void OnHandshakeDoneReceived() override;
std::string GetAddressToken(