Index: net/spdy/spdy_framer.cc |
diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc |
index 9ed6e0c5d7597cb9511fa4be7f51248a96325af8..85578515861a97680cd3142d72a437b8fa1ac618 100644 |
--- a/net/spdy/spdy_framer.cc |
+++ b/net/spdy/spdy_framer.cc |
@@ -2031,72 +2031,88 @@ size_t SpdyFramer::ParseHeaderBlockInBuffer(const char* header_data, |
return reader.GetBytesConsumed(); |
} |
-SpdySerializedFrame* SpdyFramer::SerializeData(const SpdyDataIR& datair) const { |
+SpdySerializedFrame* SpdyFramer::SerializeData( |
+ const SpdyDataIR& data_ir) const { |
uint8 flags = DATA_FLAG_NONE; |
- if (datair.fin()) { |
+ if (data_ir.fin()) { |
flags = DATA_FLAG_FIN; |
} |
if (protocol_version() > SPDY3) { |
int num_padding_fields = 0; |
- if (datair.pad_low()) { |
+ if (data_ir.pad_low()) { |
flags |= DATA_FLAG_PAD_LOW; |
++num_padding_fields; |
} |
- if (datair.pad_high()) { |
+ if (data_ir.pad_high()) { |
flags |= DATA_FLAG_PAD_HIGH; |
++num_padding_fields; |
} |
const size_t size_with_padding = num_padding_fields + |
- datair.data().length() + datair.padding_payload_len() + |
+ data_ir.data().length() + data_ir.padding_payload_len() + |
GetDataFrameMinimumSize(); |
SpdyFrameBuilder builder(size_with_padding); |
- builder.WriteDataFrameHeader(*this, datair.stream_id(), flags); |
- if (datair.pad_high()) { |
- builder.WriteUInt8(datair.padding_payload_len() >> 8); |
+ builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); |
+ if (data_ir.pad_high()) { |
+ builder.WriteUInt8(data_ir.padding_payload_len() >> 8); |
} |
- if (datair.pad_low()) { |
- builder.WriteUInt8(datair.padding_payload_len() & 0xff); |
+ if (data_ir.pad_low()) { |
+ builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); |
} |
- builder.WriteBytes(datair.data().data(), datair.data().length()); |
- if (datair.padding_payload_len() > 0) { |
- string padding = string(datair.padding_payload_len(), '0'); |
+ builder.WriteBytes(data_ir.data().data(), data_ir.data().length()); |
+ if (data_ir.padding_payload_len() > 0) { |
+ string padding = string(data_ir.padding_payload_len(), '0'); |
builder.WriteBytes(padding.data(), padding.length()); |
} |
DCHECK_EQ(size_with_padding, builder.length()); |
return builder.take(); |
} else { |
- const size_t size = GetDataFrameMinimumSize() + datair.data().length(); |
+ const size_t size = GetDataFrameMinimumSize() + data_ir.data().length(); |
SpdyFrameBuilder builder(size); |
- builder.WriteDataFrameHeader(*this, datair.stream_id(), flags); |
- builder.WriteBytes(datair.data().data(), datair.data().length()); |
+ builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); |
+ builder.WriteBytes(data_ir.data().data(), data_ir.data().length()); |
DCHECK_EQ(size, builder.length()); |
return builder.take(); |
} |
} |
-SpdySerializedFrame* SpdyFramer::SerializeDataFrameHeader( |
- const SpdyDataIR& data) const { |
- const size_t kSize = GetDataFrameMinimumSize(); |
- |
+SpdySerializedFrame* SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( |
+ const SpdyDataIR& data_ir) const { |
uint8 flags = DATA_FLAG_NONE; |
- if (data.fin()) { |
+ if (data_ir.fin()) { |
flags = DATA_FLAG_FIN; |
} |
+ |
+ size_t frame_size = GetDataFrameMinimumSize(); |
+ size_t num_padding_fields = 0; |
if (protocol_version() > SPDY3) { |
- if (data.pad_low()) { |
+ if (data_ir.pad_low()) { |
flags |= DATA_FLAG_PAD_LOW; |
+ ++num_padding_fields; |
} |
- if (data.pad_high()) { |
+ if (data_ir.pad_high()) { |
flags |= DATA_FLAG_PAD_HIGH; |
+ ++num_padding_fields; |
} |
+ frame_size += num_padding_fields; |
} |
- SpdyFrameBuilder builder(kSize); |
- builder.WriteDataFrameHeader(*this, data.stream_id(), flags); |
- builder.OverwriteLength(*this, data.data().length()); |
- DCHECK_EQ(kSize, builder.length()); |
+ SpdyFrameBuilder builder(frame_size); |
+ builder.WriteDataFrameHeader(*this, data_ir.stream_id(), flags); |
+ if (protocol_version() > SPDY3) { |
+ if (data_ir.pad_high()) { |
+ builder.WriteUInt8(data_ir.padding_payload_len() >> 8); |
+ } |
+ if (data_ir.pad_low()) { |
+ builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); |
+ } |
+ builder.OverwriteLength(*this, num_padding_fields + |
+ data_ir.data().length() + data_ir.padding_payload_len()); |
+ } else { |
+ builder.OverwriteLength(*this, data_ir.data().length()); |
+ } |
+ DCHECK_EQ(frame_size, builder.length()); |
return builder.take(); |
} |