Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(505)

Unified Diff: net/spdy/spdy_frame_builder.cc

Issue 246073007: SPDY & HPACK: Land recent internal changes (through 65328503) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase on upstream change: Expanded FRAME_TOO_LARGE/FRAME_SIZE_ERROR comment. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_frame_builder.h ('k') | net/spdy/spdy_frame_builder_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_frame_builder.cc
diff --git a/net/spdy/spdy_frame_builder.cc b/net/spdy/spdy_frame_builder.cc
index 5b084126fd9a2f5487723db083d64407f11a6142..a7eb91d71ce8199d9e68b08831340d5580045670 100644
--- a/net/spdy/spdy_frame_builder.cc
+++ b/net/spdy/spdy_frame_builder.cc
@@ -32,10 +32,12 @@ FlagsAndLength CreateFlagsAndLength(uint8 flags, size_t length) {
} // namespace
-SpdyFrameBuilder::SpdyFrameBuilder(size_t size)
+ SpdyFrameBuilder::SpdyFrameBuilder(size_t size, SpdyMajorVersion version)
: buffer_(new char[size]),
capacity_(size),
- length_(0) {
+ length_(0),
+ offset_(0),
+ version_(version) {
}
SpdyFrameBuilder::~SpdyFrameBuilder() {
@@ -45,7 +47,7 @@ char* SpdyFrameBuilder::GetWritableBuffer(size_t length) {
if (!CanWrite(length)) {
return NULL;
}
- return buffer_.get() + length_;
+ return buffer_.get() + offset_ + length_;
}
bool SpdyFrameBuilder::Seek(size_t length) {
@@ -60,13 +62,14 @@ bool SpdyFrameBuilder::Seek(size_t length) {
bool SpdyFrameBuilder::WriteControlFrameHeader(const SpdyFramer& framer,
SpdyFrameType type,
uint8 flags) {
- DCHECK_GT(4, framer.protocol_version());
+ DCHECK_GE(SPDY3, version_);
DCHECK_NE(-1,
- SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
+ SpdyConstants::SerializeFrameType(version_, type));
bool success = true;
FlagsAndLength flags_length = CreateFlagsAndLength(
flags, capacity_ - framer.GetControlFrameHeaderSize());
- success &= WriteUInt16(kControlFlagMask | framer.protocol_version());
+ success &= WriteUInt16(kControlFlagMask |
+ SpdyConstants::SerializeMajorVersion(version_));
success &= WriteUInt16(
SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
success &= WriteBytes(&flags_length, sizeof(flags_length));
@@ -77,8 +80,8 @@ bool SpdyFrameBuilder::WriteControlFrameHeader(const SpdyFramer& framer,
bool SpdyFrameBuilder::WriteDataFrameHeader(const SpdyFramer& framer,
SpdyStreamId stream_id,
uint8 flags) {
- if (framer.protocol_version() >= 4) {
- return WriteFramePrefix(framer, DATA, flags, stream_id);
+ if (version_ > SPDY3) {
+ return BeginNewFrame(framer, DATA, flags, stream_id);
}
DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
bool success = true;
@@ -94,28 +97,36 @@ bool SpdyFrameBuilder::WriteDataFrameHeader(const SpdyFramer& framer,
return success;
}
-bool SpdyFrameBuilder::WriteFramePrefix(const SpdyFramer& framer,
- SpdyFrameType type,
- uint8 flags,
- SpdyStreamId stream_id) {
- DCHECK_NE(-1,
- SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
+bool SpdyFrameBuilder::BeginNewFrame(const SpdyFramer& framer,
+ SpdyFrameType type,
+ uint8 flags,
+ SpdyStreamId stream_id) {
+ DCHECK(SpdyConstants::IsValidFrameType(version_,
+ SpdyConstants::SerializeFrameType(version_, type)));
DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
- DCHECK_LE(4, framer.protocol_version());
+ DCHECK_LT(SPDY3, 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).
- if (type != DATA) {
- success &= WriteUInt16(capacity_ - framer.GetControlFrameHeaderSize());
- } else {
- success &= WriteUInt16(capacity_ - framer.GetDataFrameMinimumSize());
+ if (length_ > 0) {
+ // Update length field for previous frame.
+ OverwriteLength(framer, length_ - framer.GetPrefixLength(type));
+ DLOG_IF(DFATAL, SpdyConstants::GetFrameMaximumSize(version_) < length_)
+ << "Frame length " << length_
+ << " is longer than the maximum allowed length.";
}
+
+ offset_ += length_;
+ length_ = 0;
+
+ // Assume all remaining capacity will be used for this frame. If not,
+ // 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 &= WriteUInt8(
- SpdyConstants::SerializeFrameType(framer.protocol_version(), type));
+ SpdyConstants::SerializeFrameType(version_, type));
success &= WriteUInt8(flags);
success &= WriteUInt32(stream_id);
- DCHECK_EQ(framer.GetDataFrameMinimumSize(), length());
+ DCHECK_EQ(framer.GetDataFrameMinimumSize(), length_);
return success;
}
@@ -157,16 +168,17 @@ bool SpdyFrameBuilder::RewriteLength(const SpdyFramer& framer) {
bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer,
size_t length) {
- if (framer.protocol_version() < 4) {
- DCHECK_GT(framer.GetFrameMaximumSize() - framer.GetFrameMinimumSize(),
+ if (version_ <= SPDY3) {
+ DCHECK_GE(SpdyConstants::GetFrameMaximumSize(version_) -
+ framer.GetFrameMinimumSize(),
length);
} else {
- DCHECK_GE(framer.GetFrameMaximumSize(), length);
+ DCHECK_GE(SpdyConstants::GetFrameMaximumSize(version_), length);
}
bool success = false;
const size_t old_length = length_;
- if (framer.protocol_version() < 4) {
+ if (version_ <= SPDY3) {
FlagsAndLength flags_length = CreateFlagsAndLength(
0, // We're not writing over the flags value anyway.
length);
@@ -186,7 +198,7 @@ bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer,
bool SpdyFrameBuilder::OverwriteFlags(const SpdyFramer& framer,
uint8 flags) {
- DCHECK_LE(SPDY4, framer.protocol_version());
+ DCHECK_LT(SPDY3, framer.protocol_version());
bool success = false;
const size_t old_length = length_;
// Flags are the fourth octet in the frame prefix.
@@ -202,7 +214,7 @@ bool SpdyFrameBuilder::CanWrite(size_t length) const {
return false;
}
- if (length_ + length > capacity_) {
+ if (offset_ + length_ + length > capacity_) {
DCHECK(false);
return false;
}
« no previous file with comments | « net/spdy/spdy_frame_builder.h ('k') | net/spdy/spdy_frame_builder_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698