Index: net/spdy/spdy_frame_builder.cc |
diff --git a/net/spdy/spdy_frame_builder.cc b/net/spdy/spdy_frame_builder.cc |
index a7a291e491801d3224c4adf4b4e07f7b20d87b40..1ff94f2d8bfb4637bafa34d644402642f42f5138 100644 |
--- a/net/spdy/spdy_frame_builder.cc |
+++ b/net/spdy/spdy_frame_builder.cc |
@@ -9,10 +9,49 @@ |
namespace net { |
-SpdyFrameBuilder::SpdyFrameBuilder(size_t size) |
+namespace { |
+ |
+// 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; |
+} |
+ |
+} // namespace |
+ |
+SpdyFrameBuilder::SpdyFrameBuilder(SpdyControlType type, |
+ SpdyControlFlags flags, |
+ int spdy_version, |
+ size_t size) |
+ : buffer_(new char[size]), |
+ capacity_(size), |
+ length_(0) { |
+ FlagsAndLength flags_length = CreateFlagsAndLength( |
+ flags, size - SpdyFrame::kHeaderSize); |
+ WriteUInt16(kControlFlagMask | spdy_version); |
+ WriteUInt16(type); |
+ WriteBytes(&flags_length, sizeof(flags_length)); |
+} |
+ |
+SpdyFrameBuilder::SpdyFrameBuilder(SpdyStreamId stream_id, |
+ SpdyDataFlags flags, |
+ size_t size) |
: buffer_(new char[size]), |
capacity_(size), |
length_(0) { |
+ DCHECK_EQ(0u, stream_id & ~kStreamIdMask); |
+ WriteUInt32(stream_id); |
+ size_t length = size - SpdyFrame::kHeaderSize; |
+ DCHECK_EQ(0u, length & ~static_cast<size_t>(kLengthMask)); |
+ FlagsAndLength flags_length; |
+ flags_length.length_ = htonl(length); |
+ DCHECK_EQ(0, flags & ~kDataFlagsMask); |
+ flags_length.flags_[0] = flags; |
+ WriteBytes(&flags_length, sizeof(flags_length)); |
} |
SpdyFrameBuilder::~SpdyFrameBuilder() { |