summaryrefslogtreecommitdiffstats
path: root/chromium/net/spdy/spdy_frame_builder.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/spdy/spdy_frame_builder.h')
-rw-r--r--chromium/net/spdy/spdy_frame_builder.h41
1 files changed, 31 insertions, 10 deletions
diff --git a/chromium/net/spdy/spdy_frame_builder.h b/chromium/net/spdy/spdy_frame_builder.h
index 348f105cd70..b4089baf618 100644
--- a/chromium/net/spdy/spdy_frame_builder.h
+++ b/chromium/net/spdy/spdy_frame_builder.h
@@ -28,12 +28,13 @@ class SpdyFramer;
class NET_EXPORT_PRIVATE SpdyFrameBuilder {
public:
// Initializes a SpdyFrameBuilder with a buffer of given size
- explicit SpdyFrameBuilder(size_t size);
+ SpdyFrameBuilder(size_t size, SpdyMajorVersion version);
~SpdyFrameBuilder();
- // Returns the size of the SpdyFrameBuilder's data.
- size_t length() const { return length_; }
+ // Returns the total size of the SpdyFrameBuilder's data, which may include
+ // multiple frames.
+ size_t length() const { return offset_ + length_; }
// Returns a writeable buffer of given size in bytes, to be appended to the
// currently written frame. Does bounds checking on length but does not
@@ -59,22 +60,28 @@ class NET_EXPORT_PRIVATE SpdyFrameBuilder {
// information from the |framer| and length information from capacity_.
bool WriteDataFrameHeader(const SpdyFramer& framer,
SpdyStreamId stream_id,
- SpdyDataFlags flags);
+ uint8 flags);
// Populates this frame with a SPDY4/HTTP2 frame prefix using
// version-specific information from the |framer| and length information from
// capacity_. The given type must be a control frame type.
// Used only for SPDY versions >=4.
- bool WriteFramePrefix(const SpdyFramer& framer,
- SpdyFrameType type,
- uint8 flags,
- SpdyStreamId stream_id);
+ bool BeginNewFrame(const SpdyFramer& framer,
+ SpdyFrameType type,
+ uint8 flags,
+ SpdyStreamId stream_id);
// Takes the buffer from the SpdyFrameBuilder.
SpdyFrame* take() {
- SpdyFrame* rv = new SpdyFrame(buffer_.release(), length_, true);
+ if (version_ > SPDY3) {
+ DLOG_IF(DFATAL, SpdyConstants::GetFrameMaximumSize(version_) < length_)
+ << "Frame length " << length_
+ << " is longer than the maximum allowed length.";
+ }
+ SpdyFrame* rv = new SpdyFrame(buffer_.release(), length(), true);
capacity_ = 0;
length_ = 0;
+ offset_ = 0;
return rv;
}
@@ -92,6 +99,12 @@ class NET_EXPORT_PRIVATE SpdyFrameBuilder {
value = htonl(value);
return WriteBytes(&value, sizeof(value));
}
+ bool WriteUInt64(uint64 value) {
+ uint32 upper = htonl(value >> 32);
+ uint32 lower = htonl(value);
+ return (WriteBytes(&upper, sizeof(upper)) &&
+ WriteBytes(&lower, sizeof(lower)));
+ }
// TODO(hkhalil) Rename to WriteStringPiece16().
bool WriteString(const std::string& value);
bool WriteStringPiece32(const base::StringPiece& value);
@@ -111,6 +124,11 @@ class NET_EXPORT_PRIVATE SpdyFrameBuilder {
// with the correct version for the frame being written.
bool OverwriteLength(const SpdyFramer& framer, size_t length);
+ // Update (in-place) the flags field in the frame being built to reflect the
+ // given flags value.
+ // Used only for SPDY versions >=4.
+ bool OverwriteFlags(const SpdyFramer& framer, uint8 flags);
+
private:
// Checks to make sure that there is an appropriate amount of space for a
// write of given size, in bytes.
@@ -118,7 +136,10 @@ class NET_EXPORT_PRIVATE SpdyFrameBuilder {
scoped_ptr<char[]> buffer_;
size_t capacity_; // Allocation size of payload, set by constructor.
- size_t length_; // Current length of the buffer.
+ size_t length_; // Length of the latest frame in the buffer.
+ size_t offset_; // Position at which the latest frame begins.
+
+ const SpdyMajorVersion version_;
};
} // namespace net