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

Unified Diff: net/spdy/spdy_framer.cc

Issue 2611293002: Do not use SpdyFrameBuilder::OverwriteLength(). (Closed)
Patch Set: Rebase. Created 3 years, 11 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_framer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_framer.cc
diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc
index b5cd187b660a87320779c43555f1334d6a2660c6..38861b3f177d910fef93fc0c1dd8fd54786464fc 100644
--- a/net/spdy/spdy_framer.cc
+++ b/net/spdy/spdy_framer.cc
@@ -159,6 +159,7 @@ SpdyFramer::SpdyFramer(SpdyFramer::DecoderAdapterFactoryFn adapter_factory,
if (adapter_factory != nullptr) {
decoder_adapter_ = adapter_factory(this);
}
+ skip_rewritelength_ = FLAGS_chromium_http2_flag_remove_rewritelength;
}
SpdyFramer::SpdyFramer(CompressionOption option)
@@ -1860,12 +1861,21 @@ SpdySerializedFrame SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField(
}
SpdyFrameBuilder builder(frame_size);
- builder.BeginNewFrame(*this, DATA, flags, data_ir.stream_id());
- if (data_ir.padded()) {
- builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
+ if (!skip_rewritelength_) {
+ builder.BeginNewFrame(*this, DATA, flags, data_ir.stream_id());
+ if (data_ir.padded()) {
+ builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
+ }
+ builder.OverwriteLength(*this, num_padding_fields + data_ir.data_len() +
+ data_ir.padding_payload_len());
+ } else {
+ builder.BeginNewFrame(*this, DATA, flags, data_ir.stream_id(),
+ num_padding_fields + data_ir.data_len() +
+ data_ir.padding_payload_len());
+ if (data_ir.padded()) {
+ builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
+ }
}
- builder.OverwriteLength(*this, num_padding_fields + data_ir.data_len() +
- data_ir.padding_payload_len());
DCHECK_EQ(frame_size, builder.length());
return builder.take();
}
@@ -1993,7 +2003,29 @@ SpdySerializedFrame SpdyFramer::SerializeHeaders(const SpdyHeadersIR& headers) {
}
SpdyFrameBuilder builder(size);
- builder.BeginNewFrame(*this, HEADERS, flags, headers.stream_id());
+
+ if (!skip_rewritelength_) {
+ builder.BeginNewFrame(*this, HEADERS, flags, headers.stream_id());
+ } else {
+ // Compute frame length field.
+ size_t length_field = 0;
+ if (headers.padded()) {
+ length_field += 1; // Padding length field.
+ }
+ if (headers.has_priority()) {
+ length_field += 4; // Dependency field.
+ length_field += 1; // Weight field.
+ }
+ length_field += headers.padding_payload_len();
+ length_field += hpack_encoding.size();
+ // If the HEADERS frame with payload would exceed the max frame size, then
+ // WritePayloadWithContinuation() will serialize CONTINUATION frames as
+ // necessary.
+ length_field =
+ std::min(length_field, kMaxControlFrameSize - GetFrameHeaderSize());
+ builder.BeginNewFrame(*this, HEADERS, flags, headers.stream_id(),
+ length_field);
+ }
DCHECK_EQ(GetHeadersMinimumSize(), builder.length());
int padding_payload_len = 0;
@@ -2066,10 +2098,13 @@ SpdySerializedFrame SpdyFramer::SerializePushPromise(
}
SpdyFrameBuilder builder(size);
- builder.BeginNewFrame(*this,
- PUSH_PROMISE,
- flags,
- push_promise.stream_id());
+ if (!skip_rewritelength_) {
+ builder.BeginNewFrame(*this, PUSH_PROMISE, flags, push_promise.stream_id());
+ } else {
+ size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize();
+ builder.BeginNewFrame(*this, PUSH_PROMISE, flags, push_promise.stream_id(),
+ length);
+ }
int padding_payload_len = 0;
if (push_promise.padded()) {
builder.WriteUInt8(push_promise.padding_payload_len());
@@ -2399,7 +2434,7 @@ void SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder,
string padding = string(padding_payload_len, 0);
builder->WriteBytes(padding.data(), padding.length());
}
- if (bytes_remaining > 0) {
+ if (bytes_remaining > 0 && !skip_rewritelength_) {
builder->OverwriteLength(*this,
kMaxControlFrameSize - GetFrameHeaderSize());
}
@@ -2412,7 +2447,12 @@ void SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder,
if (bytes_remaining == bytes_to_write) {
flags |= end_flag;
}
- builder->BeginNewFrame(*this, CONTINUATION, flags, stream_id);
+ if (!skip_rewritelength_) {
+ builder->BeginNewFrame(*this, CONTINUATION, flags, stream_id);
+ } else {
+ builder->BeginNewFrame(*this, CONTINUATION, flags, stream_id,
+ bytes_to_write);
+ }
// Write payload fragment.
builder->WriteBytes(
&hpack_encoding[hpack_encoding.size() - bytes_remaining],
« no previous file with comments | « net/spdy/spdy_framer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698