| Index: net/quic/core/quic_framer.cc
|
| diff --git a/net/quic/core/quic_framer.cc b/net/quic/core/quic_framer.cc
|
| index 84337191eb72a27daa26fa9f736fcf503d7d8b67..25eb17ce2f018da4c1e106cd134b340f6cb1baa1 100644
|
| --- a/net/quic/core/quic_framer.cc
|
| +++ b/net/quic/core/quic_framer.cc
|
| @@ -18,6 +18,7 @@
|
| #include "net/quic/core/quic_data_reader.h"
|
| #include "net/quic/core/quic_data_writer.h"
|
| #include "net/quic/core/quic_socket_address_coder.h"
|
| +#include "net/quic/core/quic_stream_frame_data_producer.h"
|
| #include "net/quic/core/quic_utils.h"
|
| #include "net/quic/platform/api/quic_aligned.h"
|
| #include "net/quic/platform/api/quic_bug_tracker.h"
|
| @@ -312,7 +313,8 @@ QuicFramer::AckFrameInfo::~AckFrameInfo() {}
|
| size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
|
| const QuicFrames& frames,
|
| char* buffer,
|
| - size_t packet_length) {
|
| + size_t packet_length,
|
| + QuicStreamFrameDataProducer* data_producer) {
|
| QuicDataWriter writer(packet_length, buffer, perspective_, endianness());
|
| if (!AppendPacketHeader(header, &writer)) {
|
| QUIC_BUG << "AppendPacketHeader failed";
|
| @@ -338,7 +340,7 @@ size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
|
| break;
|
| case STREAM_FRAME:
|
| if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length,
|
| - &writer)) {
|
| + &writer, data_producer)) {
|
| QUIC_BUG << "AppendStreamFrame failed";
|
| return 0;
|
| }
|
| @@ -1788,7 +1790,8 @@ bool QuicFramer::AppendAckBlock(uint8_t gap,
|
|
|
| bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
|
| bool no_stream_frame_length,
|
| - QuicDataWriter* writer) {
|
| + QuicDataWriter* writer,
|
| + QuicStreamFrameDataProducer* data_producer) {
|
| if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id,
|
| writer)) {
|
| QUIC_BUG << "Writing stream id size failed.";
|
| @@ -1807,6 +1810,19 @@ bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
|
| }
|
| }
|
|
|
| + if (data_producer != nullptr) {
|
| + DCHECK_EQ(nullptr, frame.data_buffer);
|
| + if (frame.data_length == 0) {
|
| + return true;
|
| + }
|
| + if (!data_producer->WriteStreamData(frame.stream_id, frame.offset,
|
| + frame.data_length, writer)) {
|
| + QUIC_BUG << "Writing frame data failed.";
|
| + return false;
|
| + }
|
| + return true;
|
| + }
|
| +
|
| if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
|
| QUIC_BUG << "Writing frame data failed.";
|
| return false;
|
|
|