Index: net/spdy/spdy_framer.cc |
diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc |
index f9e6e6997492ec27b097eb19c6916cfe56e0592c..a9edcf624320367cd091ceb2916a7c4a58691c0b 100644 |
--- a/net/spdy/spdy_framer.cc |
+++ b/net/spdy/spdy_framer.cc |
@@ -51,16 +51,6 @@ struct DictionaryIds { |
// initialized lazily to avoid static initializers. |
base::LazyInstance<DictionaryIds>::Leaky g_dictionary_ids; |
-// Creates a FlagsAndLength. |
-FlagsAndLength CreateFlagsAndLength(SpdyControlFlags flags, size_t length) { |
- DCHECK_EQ(0u, length & ~static_cast<size_t>(kLengthMask)); |
- FlagsAndLength flags_length; |
- flags_length.length_ = htonl(static_cast<uint32>(length)); |
- DCHECK_EQ(0, flags & ~kControlFlagsMask); |
- flags_length.flags_[0] = flags; |
- return flags_length; |
-} |
- |
// By default is compression on or off. |
bool g_enable_compression_default = true; |
@@ -1072,18 +1062,10 @@ SpdySynStreamControlFrame* SpdyFramer::CreateSynStream( |
DCHECK_EQ(0u, associated_stream_id & ~kStreamIdMask); |
// Find our length. |
- size_t expected_frame_size = SpdySynStreamControlFrame::size() + |
- GetSerializedLength(headers); |
- |
- // Create our FlagsAndLength. |
- FlagsAndLength flags_length = CreateFlagsAndLength( |
- flags, |
- expected_frame_size - SpdyFrame::kHeaderSize); |
- |
- SpdyFrameBuilder frame(expected_frame_size); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(SYN_STREAM); |
- frame.WriteBytes(&flags_length, sizeof(flags_length)); |
+ size_t frame_size = SpdySynStreamControlFrame::size() + |
+ GetSerializedLength(headers); |
+ |
+ SpdyFrameBuilder frame(SYN_STREAM, flags, spdy_version_, frame_size); |
frame.WriteUInt32(stream_id); |
frame.WriteUInt32(associated_stream_id); |
// Cap as appropriate. |
@@ -1095,6 +1077,7 @@ SpdySynStreamControlFrame* SpdyFramer::CreateSynStream( |
frame.WriteUInt8(priority << ((spdy_version_ < 3) ? 6 : 5)); |
frame.WriteUInt8((spdy_version_ < 3) ? 0 : credential_slot); |
WriteHeaderBlock(&frame, headers); |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
scoped_ptr<SpdySynStreamControlFrame> syn_frame( |
reinterpret_cast<SpdySynStreamControlFrame*>(frame.take())); |
@@ -1114,27 +1097,20 @@ SpdySynReplyControlFrame* SpdyFramer::CreateSynReply( |
DCHECK_EQ(0u, stream_id & ~kStreamIdMask); |
// Find our length. |
- size_t expected_frame_size = SpdySynReplyControlFrame::size() + |
- GetSerializedLength(headers); |
+ size_t frame_size = SpdySynReplyControlFrame::size() + |
+ GetSerializedLength(headers); |
// In SPDY 2, there were 2 unused bytes before payload. |
if (spdy_version_ < 3) { |
- expected_frame_size += 2; |
+ frame_size += 2; |
} |
- // Create our FlagsAndLength. |
- FlagsAndLength flags_length = CreateFlagsAndLength( |
- flags, |
- expected_frame_size - SpdyFrame::kHeaderSize); |
- |
- SpdyFrameBuilder frame(expected_frame_size); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(SYN_REPLY); |
- frame.WriteBytes(&flags_length, sizeof(flags_length)); |
+ SpdyFrameBuilder frame(SYN_REPLY, flags, spdy_version_, frame_size); |
frame.WriteUInt32(stream_id); |
if (spdy_version_ < 3) { |
frame.WriteUInt16(0); // Unused |
} |
WriteHeaderBlock(&frame, headers); |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
scoped_ptr<SpdySynReplyControlFrame> reply_frame( |
reinterpret_cast<SpdySynReplyControlFrame*>(frame.take())); |
@@ -1153,24 +1129,20 @@ SpdyRstStreamControlFrame* SpdyFramer::CreateRstStream( |
DCHECK_NE(status, INVALID); |
DCHECK_LT(status, NUM_STATUS_CODES); |
- SpdyFrameBuilder frame(SpdyRstStreamControlFrame::size()); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(RST_STREAM); |
- frame.WriteUInt32(8); |
+ size_t frame_size = SpdyRstStreamControlFrame::size(); |
+ SpdyFrameBuilder frame(RST_STREAM, CONTROL_FLAG_NONE, spdy_version_, |
+ frame_size); |
frame.WriteUInt32(stream_id); |
frame.WriteUInt32(status); |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
return reinterpret_cast<SpdyRstStreamControlFrame*>(frame.take()); |
} |
SpdySettingsControlFrame* SpdyFramer::CreateSettings( |
const SpdySettings& values) const { |
- SpdyFrameBuilder frame(SpdySettingsControlFrame::size() + 8 * values.size()); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(SETTINGS); |
- size_t settings_size = |
- SpdySettingsControlFrame::size() - SpdyFrame::kHeaderSize + |
- 8 * values.size(); |
- frame.WriteUInt32(settings_size); |
+ size_t frame_size = SpdySettingsControlFrame::size() + 8 * values.size(); |
+ SpdyFrameBuilder frame(SETTINGS, CONTROL_FLAG_NONE, spdy_version_, |
+ frame_size); |
frame.WriteUInt32(values.size()); |
SpdySettings::const_iterator it = values.begin(); |
while (it != values.end()) { |
@@ -1179,16 +1151,15 @@ SpdySettingsControlFrame* SpdyFramer::CreateSettings( |
frame.WriteUInt32(it->second); |
++it; |
} |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
return reinterpret_cast<SpdySettingsControlFrame*>(frame.take()); |
} |
SpdyPingControlFrame* SpdyFramer::CreatePingFrame(uint32 unique_id) const { |
- SpdyFrameBuilder frame(SpdyPingControlFrame::size()); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(PING); |
- size_t ping_size = SpdyPingControlFrame::size() - SpdyFrame::kHeaderSize; |
- frame.WriteUInt32(ping_size); |
+ size_t frame_size = SpdyPingControlFrame::size(); |
+ SpdyFrameBuilder frame(PING, CONTROL_FLAG_NONE, spdy_version_, frame_size); |
frame.WriteUInt32(unique_id); |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
return reinterpret_cast<SpdyPingControlFrame*>(frame.take()); |
} |
@@ -1201,16 +1172,13 @@ SpdyGoAwayControlFrame* SpdyFramer::CreateGoAway( |
// this difference via a separate offset variable, since |
// SpdyGoAwayControlFrame::size() returns the SPDY 3 size. |
const size_t goaway_offset = (protocol_version() < 3) ? 4 : 0; |
- SpdyFrameBuilder frame(SpdyGoAwayControlFrame::size() - goaway_offset); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(GOAWAY); |
- size_t go_away_size = |
- SpdyGoAwayControlFrame::size() - SpdyFrame::kHeaderSize - goaway_offset; |
- frame.WriteUInt32(go_away_size); |
+ size_t frame_size = SpdyGoAwayControlFrame::size() - goaway_offset; |
+ SpdyFrameBuilder frame(GOAWAY, CONTROL_FLAG_NONE, spdy_version_, frame_size); |
frame.WriteUInt32(last_accepted_stream_id); |
if (protocol_version() >= 3) { |
frame.WriteUInt32(status); |
} |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
return reinterpret_cast<SpdyGoAwayControlFrame*>(frame.take()); |
} |
@@ -1224,28 +1192,20 @@ SpdyHeadersControlFrame* SpdyFramer::CreateHeaders( |
DCHECK_EQ(0u, stream_id & ~kStreamIdMask); |
// Find our length. |
- size_t expected_frame_size = SpdyHeadersControlFrame::size() + |
- GetSerializedLength(headers); |
+ size_t frame_size = SpdyHeadersControlFrame::size() + |
+ GetSerializedLength(headers); |
// In SPDY 2, there were 2 unused bytes before payload. |
if (spdy_version_ < 3) { |
- expected_frame_size += 2; |
+ frame_size += 2; |
} |
- // Create our FlagsAndLength. |
- FlagsAndLength flags_length = CreateFlagsAndLength( |
- flags, |
- expected_frame_size - SpdyFrame::kHeaderSize); |
- |
- SpdyFrameBuilder frame(expected_frame_size); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(HEADERS); |
- frame.WriteBytes(&flags_length, sizeof(flags_length)); |
+ SpdyFrameBuilder frame(HEADERS, flags, spdy_version_, frame_size); |
frame.WriteUInt32(stream_id); |
if (spdy_version_ < 3) { |
frame.WriteUInt16(0); // Unused |
} |
WriteHeaderBlock(&frame, headers); |
- DCHECK_EQ(static_cast<size_t>(frame.length()), expected_frame_size); |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
scoped_ptr<SpdyHeadersControlFrame> headers_frame( |
reinterpret_cast<SpdyHeadersControlFrame*>(frame.take())); |
@@ -1265,14 +1225,12 @@ SpdyWindowUpdateControlFrame* SpdyFramer::CreateWindowUpdate( |
DCHECK_LE(delta_window_size, |
static_cast<uint32>(kSpdyStreamMaximumWindowSize)); |
- SpdyFrameBuilder frame(SpdyWindowUpdateControlFrame::size()); |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(WINDOW_UPDATE); |
- size_t window_update_size = SpdyWindowUpdateControlFrame::size() - |
- SpdyFrame::kHeaderSize; |
- frame.WriteUInt32(window_update_size); |
+ size_t frame_size = SpdyWindowUpdateControlFrame::size(); |
+ SpdyFrameBuilder frame(WINDOW_UPDATE, CONTROL_FLAG_NONE, spdy_version_, |
+ frame_size); |
frame.WriteUInt32(stream_id); |
frame.WriteUInt32(delta_window_size); |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
return reinterpret_cast<SpdyWindowUpdateControlFrame*>(frame.take()); |
} |
@@ -1289,16 +1247,9 @@ SpdyCredentialControlFrame* SpdyFramer::CreateCredentialFrame( |
frame_size += sizeof(uint32); // size of the cert_length field |
frame_size += cert->length(); // size of the cert_data field |
} |
- size_t payload_size = frame_size - SpdyFrame::kHeaderSize; |
- SpdyFrameBuilder frame(frame_size); |
- // Create our FlagsAndLength. |
- SpdyControlFlags flags = CONTROL_FLAG_NONE; |
- FlagsAndLength flags_length = CreateFlagsAndLength(flags, payload_size); |
- |
- frame.WriteUInt16(kControlFlagMask | spdy_version_); |
- frame.WriteUInt16(CREDENTIAL); |
- frame.WriteBytes(&flags_length, sizeof(flags_length)); |
+ SpdyFrameBuilder frame(CREDENTIAL, CONTROL_FLAG_NONE, spdy_version_, |
+ frame_size); |
frame.WriteUInt16(credential.slot); |
frame.WriteUInt32(credential.proof.size()); |
frame.WriteBytes(credential.proof.c_str(), credential.proof.size()); |
@@ -1308,6 +1259,7 @@ SpdyCredentialControlFrame* SpdyFramer::CreateCredentialFrame( |
frame.WriteUInt32(cert->length()); |
frame.WriteBytes(cert->c_str(), cert->length()); |
} |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
return reinterpret_cast<SpdyCredentialControlFrame*>(frame.take()); |
} |
@@ -1316,17 +1268,10 @@ SpdyDataFrame* SpdyFramer::CreateDataFrame(SpdyStreamId stream_id, |
uint32 len, SpdyDataFlags flags) { |
DCHECK_EQ(0u, stream_id & ~kStreamIdMask); |
- SpdyFrameBuilder frame(SpdyDataFrame::size() + len); |
- frame.WriteUInt32(stream_id); |
- |
- DCHECK_EQ(0u, len & ~static_cast<size_t>(kLengthMask)); |
- FlagsAndLength flags_length; |
- flags_length.length_ = htonl(len); |
- DCHECK_EQ(0, flags & ~kDataFlagsMask); |
- flags_length.flags_[0] = flags; |
- frame.WriteBytes(&flags_length, sizeof(flags_length)); |
- |
+ size_t frame_size = SpdyDataFrame::size() + len; |
+ SpdyFrameBuilder frame(stream_id, flags, frame_size); |
frame.WriteBytes(data, len); |
+ DCHECK_EQ(static_cast<size_t>(frame.length()), frame_size); |
scoped_ptr<SpdyFrame> data_frame(frame.take()); |
SpdyDataFrame* rv; |
if (flags & DATA_FLAG_COMPRESSED) { |