Commit 1e4814ea authored by dahollings's avatar dahollings Committed by Commit bot

Deprecate remove_rewritelength flag.

This cl merges server change 154325175 by yasong.

BUG=488484

Review-Url: https://codereview.chromium.org/2861893002
Cr-Commit-Position: refs/heads/master@{#469463}
parent 14fb44e3
...@@ -9,9 +9,6 @@ namespace net { ...@@ -9,9 +9,6 @@ namespace net {
// Log compressed size of HTTP/2 requests. // Log compressed size of HTTP/2 requests.
bool FLAGS_chromium_http2_flag_log_compressed_size = true; bool FLAGS_chromium_http2_flag_log_compressed_size = true;
// If true, remove use of SpdyFrameBuilder::OverwriteLength().
bool FLAGS_chromium_http2_flag_remove_rewritelength = true;
// Use //net/http2/hpack/decoder as complete HPACK decoder. // Use //net/http2/hpack/decoder as complete HPACK decoder.
bool FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3 = true; bool FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3 = true;
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
namespace net { namespace net {
NET_EXPORT_PRIVATE extern bool FLAGS_chromium_http2_flag_log_compressed_size; NET_EXPORT_PRIVATE extern bool FLAGS_chromium_http2_flag_log_compressed_size;
NET_EXPORT_PRIVATE extern bool FLAGS_chromium_http2_flag_remove_rewritelength;
NET_EXPORT_PRIVATE extern bool NET_EXPORT_PRIVATE extern bool
FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3; FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3;
NET_EXPORT_PRIVATE extern bool FLAGS_use_nested_spdy_framer_decoder; NET_EXPORT_PRIVATE extern bool FLAGS_use_nested_spdy_framer_decoder;
......
...@@ -72,52 +72,13 @@ bool SpdyFrameBuilder::BeginNewFrame(const SpdyFramer& framer, ...@@ -72,52 +72,13 @@ bool SpdyFrameBuilder::BeginNewFrame(const SpdyFramer& framer,
DCHECK_EQ(0u, stream_id & ~kStreamIdMask); DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
bool success = true; bool success = true;
if (length_ > 0) { if (length_ > 0) {
// Update length field for previous frame. SPDY_BUG << "SpdyFrameBuilder doesn't have a clean state when BeginNewFrame"
OverwriteLength(framer, length_ - kFrameHeaderSize); << "is called. Leftover length_ is " << length_;
SPDY_BUG_IF(framer.GetFrameMaximumSize() < length_) offset_ += length_;
<< "Frame length " << length_ length_ = 0;
<< " is longer than the maximum allowed length.";
} }
offset_ += length_; success &= WriteUInt24(capacity_ - offset_ - kFrameHeaderSize);
length_ = 0;
// TODO(yasong): remove after OverwriteLength() is deleted.
bool length_written = false;
// Remember where the length field is written. Used for OverwriteLength().
if (output_ != nullptr && CanWrite(kLengthFieldLength)) {
// Can write the length field.
char* dest = nullptr;
// |size| is the available bytes in the current memory block.
int size = 0;
output_->Next(&dest, &size);
start_of_current_frame_ = dest;
bytes_of_length_written_in_first_block_ =
size > (int)kLengthFieldLength ? kLengthFieldLength : size;
// If the current block is not enough for the length field, write the
// length field here, and remember the pointer to the next block.
if (size < (int)kLengthFieldLength) {
// Write the first portion of the length field.
int value = base::HostToNet32(capacity_ - offset_ - kFrameHeaderSize);
memcpy(dest, reinterpret_cast<char*>(&value) + 1, size);
Seek(size);
output_->Next(&dest, &size);
start_of_current_frame_in_next_block_ = dest;
int size_left =
kLengthFieldLength - bytes_of_length_written_in_first_block_;
memcpy(dest, reinterpret_cast<char*>(&value) + 1 + size, size_left);
Seek(size_left);
length_written = true;
}
}
// Assume all remaining capacity will be used for this frame. If not,
// the length will get overwritten when we begin the next frame.
// Don't check for length limits here because this may be larger than the
// actual frame length.
if (!length_written) {
success &= WriteUInt24(capacity_ - offset_ - kFrameHeaderSize);
}
success &= WriteUInt8(raw_frame_type); success &= WriteUInt8(raw_frame_type);
success &= WriteUInt8(flags); success &= WriteUInt8(flags);
success &= WriteUInt32(stream_id); success &= WriteUInt32(stream_id);
...@@ -220,43 +181,6 @@ bool SpdyFrameBuilder::WriteBytes(const void* data, uint32_t data_len) { ...@@ -220,43 +181,6 @@ bool SpdyFrameBuilder::WriteBytes(const void* data, uint32_t data_len) {
return true; return true;
} }
bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer,
size_t length) {
if (output_ != nullptr) {
size_t value = base::HostToNet32(length);
if (start_of_current_frame_ != nullptr &&
bytes_of_length_written_in_first_block_ == kLengthFieldLength) {
// Length field of the current frame is within one memory block.
memcpy(start_of_current_frame_, reinterpret_cast<char*>(&value) + 1,
kLengthFieldLength);
return true;
} else if (start_of_current_frame_ != nullptr &&
start_of_current_frame_in_next_block_ != nullptr &&
bytes_of_length_written_in_first_block_ < kLengthFieldLength) {
// Length field of the current frame crosses two memory blocks.
memcpy(start_of_current_frame_, reinterpret_cast<char*>(&value) + 1,
bytes_of_length_written_in_first_block_);
memcpy(start_of_current_frame_in_next_block_,
reinterpret_cast<char*>(&value) + 1 +
bytes_of_length_written_in_first_block_,
kLengthFieldLength - bytes_of_length_written_in_first_block_);
return true;
} else {
return false;
}
}
DCHECK_GE(framer.GetFrameMaximumSize(), length);
bool success = false;
const size_t old_length = length_;
length_ = 0;
success = WriteUInt24(length);
length_ = old_length;
return success;
}
bool SpdyFrameBuilder::CanWrite(size_t length) const { bool SpdyFrameBuilder::CanWrite(size_t length) const {
if (length > kLengthMask) { if (length > kLengthMask) {
DCHECK(false); DCHECK(false);
......
...@@ -110,13 +110,6 @@ class SPDY_EXPORT_PRIVATE SpdyFrameBuilder { ...@@ -110,13 +110,6 @@ class SPDY_EXPORT_PRIVATE SpdyFrameBuilder {
bool WriteStringPiece32(const SpdyStringPiece& value); bool WriteStringPiece32(const SpdyStringPiece& value);
bool WriteBytes(const void* data, uint32_t data_len); bool WriteBytes(const void* data, uint32_t data_len);
// Update (in-place) the length field in the frame being built to reflect the
// given length.
// The framer parameter is used to determine version-specific location and
// size information of the length field to be written, and must be initialized
// with the correct version for the frame being written.
bool OverwriteLength(const SpdyFramer& framer, size_t length);
private: private:
FRIEND_TEST_ALL_PREFIXES(SpdyFrameBuilderTest, GetWritableBuffer); FRIEND_TEST_ALL_PREFIXES(SpdyFrameBuilderTest, GetWritableBuffer);
FRIEND_TEST_ALL_PREFIXES(SpdyFrameBuilderTest, GetWritableOutput); FRIEND_TEST_ALL_PREFIXES(SpdyFrameBuilderTest, GetWritableOutput);
...@@ -153,14 +146,6 @@ class SPDY_EXPORT_PRIVATE SpdyFrameBuilder { ...@@ -153,14 +146,6 @@ class SPDY_EXPORT_PRIVATE SpdyFrameBuilder {
size_t capacity_; // Allocation size of payload, set by constructor. size_t capacity_; // Allocation size of payload, set by constructor.
size_t length_; // Length of the latest frame in the buffer. size_t length_; // Length of the latest frame in the buffer.
size_t offset_; // Position at which the latest frame begins. size_t offset_; // Position at which the latest frame begins.
// Remove all four below after
// FLAGS_chromium_http2_flag_remove_rewritelength deprecates.
const size_t kLengthFieldLength = 3;
char* start_of_current_frame_ = nullptr;
size_t bytes_of_length_written_in_first_block_ = kLengthFieldLength;
// In case length of a new frame is cross blocks.
char* start_of_current_frame_in_next_block_ = nullptr;
}; };
} // namespace net } // namespace net
......
...@@ -143,7 +143,6 @@ SpdyFramer::SpdyFramer(SpdyFramer::DecoderAdapterFactoryFn adapter_factory, ...@@ -143,7 +143,6 @@ SpdyFramer::SpdyFramer(SpdyFramer::DecoderAdapterFactoryFn adapter_factory,
if (adapter_factory != nullptr) { if (adapter_factory != nullptr) {
decoder_adapter_ = adapter_factory(this); decoder_adapter_ = adapter_factory(this);
} }
skip_rewritelength_ = FLAGS_chromium_http2_flag_remove_rewritelength;
} }
SpdyFramer::SpdyFramer(CompressionOption option) SpdyFramer::SpdyFramer(CompressionOption option)
...@@ -1877,22 +1876,11 @@ SpdySerializedFrame SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( ...@@ -1877,22 +1876,11 @@ SpdySerializedFrame SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField(
data_ir, &flags, &frame_size, &num_padding_fields); data_ir, &flags, &frame_size, &num_padding_fields);
SpdyFrameBuilder builder(frame_size); SpdyFrameBuilder builder(frame_size);
if (!skip_rewritelength_) { builder.BeginNewFrame(
builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags, *this, SpdyFrameType::DATA, flags, data_ir.stream_id(),
data_ir.stream_id()); num_padding_fields + data_ir.data_len() + data_ir.padding_payload_len());
if (data_ir.padded()) { if (data_ir.padded()) {
builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); 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, SpdyFrameType::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);
}
} }
DCHECK_EQ(frame_size, builder.length()); DCHECK_EQ(frame_size, builder.length());
return builder.take(); return builder.take();
...@@ -2054,14 +2042,9 @@ SpdySerializedFrame SpdyFramer::SerializeHeaders(const SpdyHeadersIR& headers) { ...@@ -2054,14 +2042,9 @@ SpdySerializedFrame SpdyFramer::SerializeHeaders(const SpdyHeadersIR& headers) {
&weight, &length_field); &weight, &length_field);
SpdyFrameBuilder builder(size); SpdyFrameBuilder builder(size);
builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags,
headers.stream_id(), length_field);
if (!skip_rewritelength_) {
builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags,
headers.stream_id());
} else {
builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags,
headers.stream_id(), length_field);
}
DCHECK_EQ(GetHeadersMinimumSize(), builder.length()); DCHECK_EQ(GetHeadersMinimumSize(), builder.length());
int padding_payload_len = 0; int padding_payload_len = 0;
...@@ -2137,14 +2120,9 @@ SpdySerializedFrame SpdyFramer::SerializePushPromise( ...@@ -2137,14 +2120,9 @@ SpdySerializedFrame SpdyFramer::SerializePushPromise(
&size); &size);
SpdyFrameBuilder builder(size); SpdyFrameBuilder builder(size);
if (!skip_rewritelength_) { size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize();
builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags, builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags,
push_promise.stream_id()); push_promise.stream_id(), length);
} else {
size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize();
builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags,
push_promise.stream_id(), length);
}
int padding_payload_len = 0; int padding_payload_len = 0;
if (push_promise.padded()) { if (push_promise.padded()) {
builder.WriteUInt8(push_promise.padding_payload_len()); builder.WriteUInt8(push_promise.padding_payload_len());
...@@ -2448,23 +2426,12 @@ bool SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( ...@@ -2448,23 +2426,12 @@ bool SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField(
SpdyFrameBuilder builder(frame_size, output); SpdyFrameBuilder builder(frame_size, output);
bool ok = true; bool ok = true;
if (!skip_rewritelength_) { ok = ok && builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags,
ok = builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags, data_ir.stream_id(),
data_ir.stream_id()); num_padding_fields + data_ir.data_len() +
if (data_ir.padded()) { data_ir.padding_payload_len());
ok = ok && builder.WriteUInt8(data_ir.padding_payload_len() & 0xff); if (data_ir.padded()) {
} ok = ok && builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
ok = ok && builder.OverwriteLength(*this,
num_padding_fields + data_ir.data_len() +
data_ir.padding_payload_len());
} else {
ok = ok && builder.BeginNewFrame(*this, SpdyFrameType::DATA, flags,
data_ir.stream_id(),
num_padding_fields + data_ir.data_len() +
data_ir.padding_payload_len());
if (data_ir.padded()) {
ok = ok && builder.WriteUInt8(data_ir.padding_payload_len() & 0xff);
}
} }
DCHECK_EQ(frame_size, builder.length()); DCHECK_EQ(frame_size, builder.length());
return ok; return ok;
...@@ -2561,13 +2528,8 @@ bool SpdyFramer::SerializeHeaders(const SpdyHeadersIR& headers, ...@@ -2561,13 +2528,8 @@ bool SpdyFramer::SerializeHeaders(const SpdyHeadersIR& headers,
bool ok = true; bool ok = true;
SpdyFrameBuilder builder(size, output); SpdyFrameBuilder builder(size, output);
if (!skip_rewritelength_) { ok = ok && builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags,
ok = builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags, headers.stream_id(), length_field);
headers.stream_id());
} else {
ok = ok && builder.BeginNewFrame(*this, SpdyFrameType::HEADERS, flags,
headers.stream_id(), length_field);
}
DCHECK_EQ(GetHeadersMinimumSize(), builder.length()); DCHECK_EQ(GetHeadersMinimumSize(), builder.length());
int padding_payload_len = 0; int padding_payload_len = 0;
...@@ -2619,14 +2581,9 @@ bool SpdyFramer::SerializePushPromise(const SpdyPushPromiseIR& push_promise, ...@@ -2619,14 +2581,9 @@ bool SpdyFramer::SerializePushPromise(const SpdyPushPromiseIR& push_promise,
bool ok = true; bool ok = true;
SpdyFrameBuilder builder(size, output); SpdyFrameBuilder builder(size, output);
if (!skip_rewritelength_) { size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize();
ok = builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags, ok = builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags,
push_promise.stream_id()); push_promise.stream_id(), length);
} else {
size_t length = std::min(size, kMaxControlFrameSize) - GetFrameHeaderSize();
ok = builder.BeginNewFrame(*this, SpdyFrameType::PUSH_PROMISE, flags,
push_promise.stream_id(), length);
}
int padding_payload_len = 0; int padding_payload_len = 0;
if (push_promise.padded()) { if (push_promise.padded()) {
...@@ -2892,10 +2849,6 @@ bool SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder, ...@@ -2892,10 +2849,6 @@ bool SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder,
SpdyString padding = SpdyString(padding_payload_len, 0); SpdyString padding = SpdyString(padding_payload_len, 0);
ret &= builder->WriteBytes(padding.data(), padding.length()); ret &= builder->WriteBytes(padding.data(), padding.length());
} }
if (bytes_remaining > 0 && !skip_rewritelength_) {
ret &= builder->OverwriteLength(
*this, kMaxControlFrameSize - GetFrameHeaderSize());
}
// Tack on CONTINUATION frames for the overflow. // Tack on CONTINUATION frames for the overflow.
while (bytes_remaining > 0 && ret) { while (bytes_remaining > 0 && ret) {
...@@ -2905,13 +2858,8 @@ bool SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder, ...@@ -2905,13 +2858,8 @@ bool SpdyFramer::WritePayloadWithContinuation(SpdyFrameBuilder* builder,
if (bytes_remaining == bytes_to_write) { if (bytes_remaining == bytes_to_write) {
flags |= end_flag; flags |= end_flag;
} }
if (!skip_rewritelength_) { ret &= builder->BeginNewFrame(*this, SpdyFrameType::CONTINUATION, flags,
ret &= builder->BeginNewFrame(*this, SpdyFrameType::CONTINUATION, flags, stream_id, bytes_to_write);
stream_id);
} else {
ret &= builder->BeginNewFrame(*this, SpdyFrameType::CONTINUATION, flags,
stream_id, bytes_to_write);
}
// Write payload fragment. // Write payload fragment.
ret &= builder->WriteBytes( ret &= builder->WriteBytes(
&hpack_encoding[hpack_encoding.size() - bytes_remaining], &hpack_encoding[hpack_encoding.size() - bytes_remaining],
......
...@@ -979,9 +979,6 @@ class SPDY_EXPORT_PRIVATE SpdyFramer { ...@@ -979,9 +979,6 @@ class SPDY_EXPORT_PRIVATE SpdyFramer {
// If true, then ProcessInput returns after processing a full frame, // If true, then ProcessInput returns after processing a full frame,
// rather than reading all available input. // rather than reading all available input.
bool process_single_input_frame_ = false; bool process_single_input_frame_ = false;
// Latched value of FLAGS_chromium_http2_flag_remove_rewritelength.
bool skip_rewritelength_ = false;
}; };
} // namespace net } // namespace net
......
...@@ -866,7 +866,6 @@ TEST_P(SpdyFramerTest, RejectUpperCaseHeaderBlockValue) { ...@@ -866,7 +866,6 @@ TEST_P(SpdyFramerTest, RejectUpperCaseHeaderBlockValue) {
frame.WriteUInt32(1); frame.WriteUInt32(1);
frame.WriteStringPiece32("Name1"); frame.WriteStringPiece32("Name1");
frame.WriteStringPiece32("value1"); frame.WriteStringPiece32("value1");
frame.OverwriteLength(framer, frame.length() - framer.GetFrameHeaderSize());
SpdyFrameBuilder frame2(1024); SpdyFrameBuilder frame2(1024);
frame2.BeginNewFrame(framer, SpdyFrameType::HEADERS, 0, 1); frame2.BeginNewFrame(framer, SpdyFrameType::HEADERS, 0, 1);
...@@ -875,7 +874,6 @@ TEST_P(SpdyFramerTest, RejectUpperCaseHeaderBlockValue) { ...@@ -875,7 +874,6 @@ TEST_P(SpdyFramerTest, RejectUpperCaseHeaderBlockValue) {
frame2.WriteStringPiece32("value1"); frame2.WriteStringPiece32("value1");
frame2.WriteStringPiece32("nAmE2"); frame2.WriteStringPiece32("nAmE2");
frame2.WriteStringPiece32("value2"); frame2.WriteStringPiece32("value2");
frame.OverwriteLength(framer, frame2.length() - framer.GetFrameHeaderSize());
SpdySerializedFrame control_frame(frame.take()); SpdySerializedFrame control_frame(frame.take());
SpdyStringPiece serialized_headers = SpdyStringPiece serialized_headers =
...@@ -1312,8 +1310,6 @@ TEST_P(SpdyFramerTest, DuplicateHeader) { ...@@ -1312,8 +1310,6 @@ TEST_P(SpdyFramerTest, DuplicateHeader) {
frame.WriteStringPiece32("value1"); frame.WriteStringPiece32("value1");
frame.WriteStringPiece32("name"); frame.WriteStringPiece32("name");
frame.WriteStringPiece32("value2"); frame.WriteStringPiece32("value2");
// write the length
frame.OverwriteLength(framer, frame.length() - framer.GetFrameHeaderSize());
SpdyHeaderBlock new_headers; SpdyHeaderBlock new_headers;
SpdySerializedFrame control_frame(frame.take()); SpdySerializedFrame control_frame(frame.take());
...@@ -1326,13 +1322,6 @@ TEST_P(SpdyFramerTest, DuplicateHeader) { ...@@ -1326,13 +1322,6 @@ TEST_P(SpdyFramerTest, DuplicateHeader) {
TEST_P(SpdyFramerTest, MultiValueHeader) { TEST_P(SpdyFramerTest, MultiValueHeader) {
SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
// Frame builder with plentiful buffer size.
SpdyFrameBuilder frame(1024);
frame.BeginNewFrame(framer, SpdyFrameType::HEADERS,
HEADERS_FLAG_PRIORITY | HEADERS_FLAG_END_HEADERS, 3);
frame.WriteUInt32(0); // Priority exclusivity and dependent stream.
frame.WriteUInt8(255); // Priority weight.
SpdyString value("value1\0value2", 13); SpdyString value("value1\0value2", 13);
// TODO(jgraettinger): If this pattern appears again, move to test class. // TODO(jgraettinger): If this pattern appears again, move to test class.
SpdyHeaderBlock header_set; SpdyHeaderBlock header_set;
...@@ -1341,9 +1330,14 @@ TEST_P(SpdyFramerTest, MultiValueHeader) { ...@@ -1341,9 +1330,14 @@ TEST_P(SpdyFramerTest, MultiValueHeader) {
HpackEncoder encoder(ObtainHpackHuffmanTable()); HpackEncoder encoder(ObtainHpackHuffmanTable());
encoder.DisableCompression(); encoder.DisableCompression();
encoder.EncodeHeaderSet(header_set, &buffer); encoder.EncodeHeaderSet(header_set, &buffer);
// Frame builder with plentiful buffer size.
SpdyFrameBuilder frame(1024);
frame.BeginNewFrame(framer, SpdyFrameType::HEADERS,
HEADERS_FLAG_PRIORITY | HEADERS_FLAG_END_HEADERS, 3,
buffer.size() + 5 /* priority */);
frame.WriteUInt32(0); // Priority exclusivity and dependent stream.
frame.WriteUInt8(255); // Priority weight.
frame.WriteBytes(&buffer[0], buffer.size()); frame.WriteBytes(&buffer[0], buffer.size());
// write the length
frame.OverwriteLength(framer, frame.length() - framer.GetFrameHeaderSize());
SpdySerializedFrame control_frame(frame.take()); SpdySerializedFrame control_frame(frame.take());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment