Add QuicTestClient::partial_response_body().
To make implementation easier, change QuicSpdyClientStream::body() return type
and make it const. Also change
QuicSpdyClientBase::ResponseListener::OnCompleteResponse() signature
accordingly, and make a copy explicit in PerStreamState construction.
PiperOrigin-RevId: 500191114
diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc
index 80161dd..83dc8a2 100644
--- a/quiche/quic/core/http/end_to_end_test.cc
+++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -3871,7 +3871,7 @@
public:
void OnCompleteResponse(QuicStreamId id,
const Http2HeaderBlock& response_headers,
- const std::string& response_body) override {
+ absl::string_view response_body) override {
QUIC_DVLOG(1) << "response for stream " << id << " "
<< response_headers.DebugString() << "\n"
<< response_body;
diff --git a/quiche/quic/core/http/quic_spdy_client_stream.h b/quiche/quic/core/http/quic_spdy_client_stream.h
index 7a4f90a..9a952aa 100644
--- a/quiche/quic/core/http/quic_spdy_client_stream.h
+++ b/quiche/quic/core/http/quic_spdy_client_stream.h
@@ -51,7 +51,7 @@
bool fin);
// Returns the response data.
- const std::string& data() { return data_; }
+ absl::string_view data() const { return data_; }
// Returns whatever headers have been received for this stream.
const spdy::Http2HeaderBlock& response_headers() { return response_headers_; }
diff --git a/quiche/quic/test_tools/quic_test_client.cc b/quiche/quic/test_tools/quic_test_client.cc
index ecf67c4..224046a 100644
--- a/quiche/quic/test_tools/quic_test_client.cc
+++ b/quiche/quic/test_tools/quic_test_client.cc
@@ -708,6 +708,11 @@
return bytes_written_;
}
+absl::string_view QuicTestClient::partial_response_body() const {
+ return latest_created_stream_ == nullptr ? ""
+ : latest_created_stream_->data();
+}
+
void QuicTestClient::OnClose(QuicSpdyStream* stream) {
if (stream == nullptr) {
return;
@@ -733,7 +738,7 @@
client_stream->headers_decompressed(),
client_stream->response_headers(),
client_stream->preliminary_headers(),
- (buffer_body() ? client_stream->data() : ""),
+ (buffer_body() ? std::string(client_stream->data()) : ""),
client_stream->received_trailers(),
// Use NumBytesConsumed to avoid counting retransmitted stream frames.
client_stream->total_body_bytes_read() +
diff --git a/quiche/quic/test_tools/quic_test_client.h b/quiche/quic/test_tools/quic_test_client.h
index 4756e99..9abab23 100644
--- a/quiche/quic/test_tools/quic_test_client.h
+++ b/quiche/quic/test_tools/quic_test_client.h
@@ -166,16 +166,14 @@
bool buffer_body() const;
void set_buffer_body(bool buffer_body);
- // Getters for stream state. Please note, these getters are divided into two
- // groups. 1) returns state which only get updated once a complete response
- // is received. 2) returns state of the oldest active stream which have
- // received partial response (if any).
- // Group 1.
+ // Getters for stream state that only get updated once a complete response is
+ // received.
const spdy::Http2HeaderBlock& response_trailers() const;
bool response_complete() const;
int64_t response_body_size() const;
const std::string& response_body() const;
- // Group 2.
+ // Getters for stream state that return state of the oldest active stream that
+ // have received a partial response.
bool response_headers_complete() const;
const spdy::Http2HeaderBlock* response_headers() const;
const spdy::Http2HeaderBlock* preliminary_headers() const;
@@ -183,6 +181,11 @@
size_t bytes_read() const;
size_t bytes_written() const;
+ // Returns response body received so far by the stream that has been most
+ // recently opened among currently open streams. To query response body
+ // received by a stream that is already closed, use `response_body()` instead.
+ absl::string_view partial_response_body() const;
+
// Returns once at least one complete response or a connection close has been
// received from the server. If responses are received for multiple (say 2)
// streams, next WaitForResponse will return immediately.
diff --git a/quiche/quic/tools/quic_spdy_client_base.cc b/quiche/quic/tools/quic_spdy_client_base.cc
index a34472c..b46e780 100644
--- a/quiche/quic/tools/quic_spdy_client_base.cc
+++ b/quiche/quic/tools/quic_spdy_client_base.cc
@@ -89,7 +89,7 @@
preliminary_response_headers_ =
client_stream->preliminary_headers().DebugString();
latest_response_header_block_ = response_headers.Clone();
- latest_response_body_ = client_stream->data();
+ latest_response_body_ = std::string(client_stream->data());
latest_response_trailers_ =
client_stream->received_trailers().DebugString();
}
diff --git a/quiche/quic/tools/quic_spdy_client_base.h b/quiche/quic/tools/quic_spdy_client_base.h
index ba62c80..28c3e96 100644
--- a/quiche/quic/tools/quic_spdy_client_base.h
+++ b/quiche/quic/tools/quic_spdy_client_base.h
@@ -37,7 +37,7 @@
virtual ~ResponseListener() {}
virtual void OnCompleteResponse(
QuicStreamId id, const spdy::Http2HeaderBlock& response_headers,
- const std::string& response_body) = 0;
+ absl::string_view response_body) = 0;
};
// A piece of data that can be sent multiple times. For example, it can be a