| Index: net/spdy/spdy_frame_builder.cc
|
| diff --git a/net/spdy/spdy_frame_builder.cc b/net/spdy/spdy_frame_builder.cc
|
| index 5194c115daa1c5fd860cc73ec676bd7cef74dcfc..5b084126fd9a2f5487723db083d64407f11a6142 100644
|
| --- a/net/spdy/spdy_frame_builder.cc
|
| +++ b/net/spdy/spdy_frame_builder.cc
|
| @@ -60,14 +60,15 @@ bool SpdyFrameBuilder::Seek(size_t length) {
|
| bool SpdyFrameBuilder::WriteControlFrameHeader(const SpdyFramer& framer,
|
| SpdyFrameType type,
|
| uint8 flags) {
|
| - DCHECK_GE(type, FIRST_CONTROL_TYPE);
|
| - DCHECK_LE(type, LAST_CONTROL_TYPE);
|
| DCHECK_GT(4, framer.protocol_version());
|
| + DCHECK_NE(-1,
|
| + SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
|
| bool success = true;
|
| FlagsAndLength flags_length = CreateFlagsAndLength(
|
| flags, capacity_ - framer.GetControlFrameHeaderSize());
|
| success &= WriteUInt16(kControlFlagMask | framer.protocol_version());
|
| - success &= WriteUInt16(type);
|
| + success &= WriteUInt16(
|
| + SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
|
| success &= WriteBytes(&flags_length, sizeof(flags_length));
|
| DCHECK_EQ(framer.GetControlFrameHeaderSize(), length());
|
| return success;
|
| @@ -75,7 +76,7 @@ bool SpdyFrameBuilder::WriteControlFrameHeader(const SpdyFramer& framer,
|
|
|
| bool SpdyFrameBuilder::WriteDataFrameHeader(const SpdyFramer& framer,
|
| SpdyStreamId stream_id,
|
| - SpdyDataFlags flags) {
|
| + uint8 flags) {
|
| if (framer.protocol_version() >= 4) {
|
| return WriteFramePrefix(framer, DATA, flags, stream_id);
|
| }
|
| @@ -97,16 +98,21 @@ bool SpdyFrameBuilder::WriteFramePrefix(const SpdyFramer& framer,
|
| SpdyFrameType type,
|
| uint8 flags,
|
| SpdyStreamId stream_id) {
|
| - DCHECK_LE(DATA, type);
|
| - DCHECK_GE(LAST_CONTROL_TYPE, type);
|
| + DCHECK_NE(-1,
|
| + SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
|
| DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
|
| DCHECK_LE(4, framer.protocol_version());
|
| bool success = true;
|
| // Upstream DCHECK's that capacity_ is under the maximum frame size at this
|
| // point. Chromium does not, because of the large additional zlib inflation
|
| // factor we use. (Frame size is is still checked by OverwriteLength() below).
|
| - success &= WriteUInt16(capacity_);
|
| - success &= WriteUInt8(type);
|
| + if (type != DATA) {
|
| + success &= WriteUInt16(capacity_ - framer.GetControlFrameHeaderSize());
|
| + } else {
|
| + success &= WriteUInt16(capacity_ - framer.GetDataFrameMinimumSize());
|
| + }
|
| + success &= WriteUInt8(
|
| + SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
|
| success &= WriteUInt8(flags);
|
| success &= WriteUInt32(stream_id);
|
| DCHECK_EQ(framer.GetDataFrameMinimumSize(), length());
|
| @@ -145,12 +151,8 @@ bool SpdyFrameBuilder::WriteBytes(const void* data, uint32 data_len) {
|
| }
|
|
|
| bool SpdyFrameBuilder::RewriteLength(const SpdyFramer& framer) {
|
| - if (framer.protocol_version() < 4) {
|
| - return OverwriteLength(framer,
|
| - length_ - framer.GetControlFrameHeaderSize());
|
| - } else {
|
| - return OverwriteLength(framer, length_);
|
| - }
|
| + return OverwriteLength(framer,
|
| + length_ - framer.GetControlFrameHeaderSize());
|
| }
|
|
|
| bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer,
|
| @@ -182,6 +184,18 @@ bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer,
|
| return success;
|
| }
|
|
|
| +bool SpdyFrameBuilder::OverwriteFlags(const SpdyFramer& framer,
|
| + uint8 flags) {
|
| + DCHECK_LE(SPDY4, framer.protocol_version());
|
| + bool success = false;
|
| + const size_t old_length = length_;
|
| + // Flags are the fourth octet in the frame prefix.
|
| + length_ = 3;
|
| + success = WriteUInt8(flags);
|
| + length_ = old_length;
|
| + return success;
|
| +}
|
| +
|
| bool SpdyFrameBuilder::CanWrite(size_t length) const {
|
| if (length > kLengthMask) {
|
| DCHECK(false);
|
|
|