// A special structure for the 8 bit flags and 24 bit length fields.
union FlagsAndLength {
- uint8 flags_[4]; // 8 bits
- uint32 length_; // 24 bits
+ uint8 flags[4]; // 8 bits
+ uint32 length; // 24 bits
};
// Creates a FlagsAndLength.
FlagsAndLength CreateFlagsAndLength(uint8 flags, size_t length) {
DCHECK_EQ(0u, length & ~static_cast<size_t>(kLengthMask));
FlagsAndLength flags_length;
- flags_length.length_ = htonl(static_cast<uint32>(length));
+ flags_length.length = htonl(static_cast<uint32>(length));
DCHECK_EQ(0, flags & ~kControlFlagsMask);
- flags_length.flags_[0] = flags;
+ flags_length.flags[0] = flags;
return flags_length;
}
} // namespace
- SpdyFrameBuilder::SpdyFrameBuilder(size_t size, SpdyMajorVersion version)
+SpdyFrameBuilder::SpdyFrameBuilder(size_t size, SpdyMajorVersion version)
: buffer_(new char[size]),
capacity_(size),
length_(0),
SpdyFrameType type,
uint8 flags) {
DCHECK_GE(SPDY3, version_);
- DCHECK_NE(-1,
- SpdyConstants::SerializeFrameType(version_, type));
+ DCHECK(SpdyConstants::IsValidFrameType(
+ version_, SpdyConstants::SerializeFrameType(version_, type)));
bool success = true;
FlagsAndLength flags_length = CreateFlagsAndLength(
flags, capacity_ - framer.GetControlFrameHeaderSize());
size_t length_field = capacity_ - framer.GetDataFrameMinimumSize();
DCHECK_EQ(0u, length_field & ~static_cast<size_t>(kLengthMask));
FlagsAndLength flags_length;
- flags_length.length_ = htonl(length_field);
+ flags_length.length = htonl(length_field);
DCHECK_EQ(0, flags & ~kDataFlagsMask);
- flags_length.flags_[0] = flags;
+ flags_length.flags[0] = flags;
success &= WriteBytes(&flags_length, sizeof(flags_length));
DCHECK_EQ(framer.GetDataFrameMinimumSize(), length());
return success;
SpdyFrameType type,
uint8 flags,
SpdyStreamId stream_id) {
- DCHECK(SpdyConstants::IsValidFrameType(version_,
- SpdyConstants::SerializeFrameType(version_, type)));
+ DCHECK(SpdyConstants::IsValidFrameType(
+ version_, SpdyConstants::SerializeFrameType(version_, type)));
DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
- DCHECK_LT(SPDY3, framer.protocol_version());
+ DCHECK_GT(framer.protocol_version(), SPDY3);
bool success = true;
if (length_ > 0) {
// Update length field for previous frame.
// the length will get overwritten when we begin the next frame.
// Don't check for length limits here because this may be larger than the
// actual frame length.
- success &= WriteUInt16(capacity_ - offset_ - framer.GetPrefixLength(type));
+ success &= WriteUInt24(capacity_ - offset_ - framer.GetPrefixLength(type));
success &= WriteUInt8(
SpdyConstants::SerializeFrameType(version_, type));
success &= WriteUInt8(flags);
return false;
}
- if (!WriteUInt16(static_cast<int>(value.size())))
+ if (!WriteUInt16(static_cast<uint16>(value.size())))
return false;
return WriteBytes(value.data(), static_cast<uint16>(value.size()));
bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer,
size_t length) {
- if (version_ <= SPDY3) {
- DCHECK_GE(SpdyConstants::GetFrameMaximumSize(version_) -
- framer.GetFrameMinimumSize(),
- length);
+ if (version_ < SPDY4) {
+ DCHECK_LE(length,
+ SpdyConstants::GetFrameMaximumSize(version_) -
+ framer.GetFrameMinimumSize());
} else {
- DCHECK_GE(SpdyConstants::GetFrameMaximumSize(version_), length);
+ DCHECK_LE(length, SpdyConstants::GetFrameMaximumSize(version_));
}
bool success = false;
const size_t old_length = length_;
- if (version_ <= SPDY3) {
+ if (version_ < SPDY4) {
FlagsAndLength flags_length = CreateFlagsAndLength(
0, // We're not writing over the flags value anyway.
length);
sizeof(flags_length) - 1);
} else {
length_ = 0;
- success = WriteUInt16(length);
+ success = WriteUInt24(length);
}
length_ = old_length;
bool SpdyFrameBuilder::OverwriteFlags(const SpdyFramer& framer,
uint8 flags) {
- DCHECK_LT(SPDY3, framer.protocol_version());
+ DCHECK_GT(framer.protocol_version(), SPDY3);
bool success = false;
const size_t old_length = length_;
- // Flags are the fourth octet in the frame prefix.
- length_ = 3;
+ // Flags are the fifth octet in the frame prefix.
+ length_ = 4;
success = WriteUInt8(flags);
length_ = old_length;
return success;