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