Add PRIORITY_UPDATE frame and implement serialization.
PiperOrigin-RevId: 347611775
Change-Id: I8856aba25403f133b2c8e089506daa8d13484e10
diff --git a/spdy/core/spdy_framer.cc b/spdy/core/spdy_framer.cc
index d425bdd..44bea4c 100644
--- a/spdy/core/spdy_framer.cc
+++ b/spdy/core/spdy_framer.cc
@@ -765,6 +765,21 @@
return builder.take();
}
+SpdySerializedFrame SpdyFramer::SerializePriorityUpdate(
+ const SpdyPriorityUpdateIR& priority_update) const {
+ const size_t total_size = kPriorityUpdateFrameMinimumSize +
+ priority_update.priority_field_value().size();
+ SpdyFrameBuilder builder(total_size);
+ builder.BeginNewFrame(SpdyFrameType::PRIORITY_UPDATE, kNoFlags,
+ priority_update.stream_id());
+
+ builder.WriteUInt32(priority_update.prioritized_stream_id());
+ builder.WriteBytes(priority_update.priority_field_value().data(),
+ priority_update.priority_field_value().size());
+ DCHECK_EQ(total_size, builder.length());
+ return builder.take();
+}
+
SpdySerializedFrame SpdyFramer::SerializeUnknown(
const SpdyUnknownIR& unknown) const {
const size_t total_size = kFrameHeaderSize + unknown.payload().size();
@@ -818,6 +833,10 @@
void VisitPriority(const SpdyPriorityIR& priority) override {
frame_ = framer_->SerializePriority(priority);
}
+ void VisitPriorityUpdate(
+ const SpdyPriorityUpdateIR& priority_update) override {
+ frame_ = framer_->SerializePriorityUpdate(priority_update);
+ }
void VisitUnknown(const SpdyUnknownIR& unknown) override {
frame_ = framer_->SerializeUnknown(unknown);
}
@@ -904,6 +923,11 @@
flags_ = kNoFlags;
}
+ void VisitPriorityUpdate(
+ const SpdyPriorityUpdateIR& /*priority_update*/) override {
+ flags_ = kNoFlags;
+ }
+
uint8_t flags() const { return flags_; }
private:
@@ -1191,6 +1215,22 @@
return ok;
}
+bool SpdyFramer::SerializePriorityUpdate(
+ const SpdyPriorityUpdateIR& priority_update,
+ ZeroCopyOutputBuffer* output) const {
+ const size_t total_size = kPriorityUpdateFrameMinimumSize +
+ priority_update.priority_field_value().size();
+ SpdyFrameBuilder builder(total_size, output);
+ bool ok = builder.BeginNewFrame(SpdyFrameType::PRIORITY_UPDATE, kNoFlags,
+ priority_update.stream_id());
+
+ ok = ok && builder.WriteUInt32(priority_update.prioritized_stream_id());
+ ok = ok && builder.WriteBytes(priority_update.priority_field_value().data(),
+ priority_update.priority_field_value().size());
+ DCHECK_EQ(total_size, builder.length());
+ return ok;
+}
+
bool SpdyFramer::SerializeUnknown(const SpdyUnknownIR& unknown,
ZeroCopyOutputBuffer* output) const {
const size_t total_size = kFrameHeaderSize + unknown.payload().size();
@@ -1246,6 +1286,10 @@
void VisitPriority(const SpdyPriorityIR& priority) override {
result_ = framer_->SerializePriority(priority, output_);
}
+ void VisitPriorityUpdate(
+ const SpdyPriorityUpdateIR& priority_update) override {
+ result_ = framer_->SerializePriorityUpdate(priority_update, output_);
+ }
void VisitUnknown(const SpdyUnknownIR& unknown) override {
result_ = framer_->SerializeUnknown(unknown, output_);
}