summaryrefslogtreecommitdiffstats
path: root/net/spdy
diff options
context:
space:
mode:
Diffstat (limited to 'net/spdy')
-rw-r--r--net/spdy/spdy_framer.cc71
-rw-r--r--net/spdy/spdy_framer_test.cc2
-rw-r--r--net/spdy/spdy_protocol.h5
-rw-r--r--net/spdy/spdy_protocol_test.cc5
4 files changed, 37 insertions, 46 deletions
diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc
index 6164531..810e84b 100644
--- a/net/spdy/spdy_framer.cc
+++ b/net/spdy/spdy_framer.cc
@@ -474,7 +474,6 @@ size_t SpdyFramer::ProcessCommonHeader(const char* data, size_t len) {
DCHECK_EQ(state_, SPDY_READING_COMMON_HEADER);
size_t original_len = len;
- SpdyFrame current_frame(current_frame_buffer_.get(), false);
// Update current frame buffer as needed.
if (current_frame_buffer_length_ < SpdyFrame::kHeaderSize) {
@@ -487,7 +486,31 @@ size_t SpdyFramer::ProcessCommonHeader(const char* data, size_t len) {
// TODO(rch): remove this empty block
// Do nothing.
} else {
- remaining_data_ = current_frame.length();
+ SpdyFrameReader reader(current_frame_buffer_.get(),
+ current_frame_buffer_length_);
+
+ uint16 version = 0;
+ bool successful_read = reader.ReadUInt16(&version);
+ DCHECK(successful_read);
+ bool control_bit = (version & kControlFlagMask) != 0;
+ version &= ~kControlFlagMask; // Only valid for control frames.
+
+ if (control_bit) {
+ uint16 frame_type_field;
+ successful_read = reader.ReadUInt16(&frame_type_field);
+ // We check for validity below in ProcessControlFrameHeader().
+ current_frame_type_ = static_cast<SpdyControlType>(frame_type_field);
+ } else {
+ successful_read = reader.Seek(2); // Seek past rest of stream_id.
+ }
+ DCHECK(successful_read);
+
+ successful_read = reader.ReadUInt8(&current_frame_flags_);
+ DCHECK(successful_read);
+
+ successful_read = reader.ReadUInt24(&current_frame_length_);
+ DCHECK(successful_read);
+ remaining_data_ = current_frame_length_;
// This is just a sanity check for help debugging early frame errors.
if (remaining_data_ > 1000000u) {
@@ -505,25 +528,31 @@ size_t SpdyFramer::ProcessCommonHeader(const char* data, size_t len) {
}
// if we're here, then we have the common header all received.
- if (!current_frame.is_control_frame()) {
+ if (!control_bit) {
SpdyDataFrame data_frame(current_frame_buffer_.get(), false);
- if (data_frame.flags() & ~DATA_FLAG_FIN) {
+ if (current_frame_flags_ & ~DATA_FLAG_FIN) {
set_error(SPDY_INVALID_DATA_FRAME_FLAGS);
} else {
visitor_->OnDataFrameHeader(data_frame.stream_id(),
- data_frame.length(),
- data_frame.flags() & DATA_FLAG_FIN);
- if (current_frame.length() > 0) {
+ current_frame_length_,
+ current_frame_flags_ & DATA_FLAG_FIN);
+ if (current_frame_length_ > 0) {
CHANGE_STATE(SPDY_FORWARD_STREAM_FRAME);
} else {
// Empty data frame.
- if (current_frame.flags() & DATA_FLAG_FIN) {
+ if (current_frame_flags_ & DATA_FLAG_FIN) {
visitor_->OnStreamFrameData(data_frame.stream_id(),
NULL, 0, DATA_FLAG_FIN);
}
CHANGE_STATE(SPDY_AUTO_RESET);
}
}
+ } else if (version != spdy_version_) {
+ // We check version before we check validity: version can never be
+ // 'invalid', it can only be unsupported.
+ DLOG(INFO) << "Unsupported SPDY version " << version
+ << " (expected " << spdy_version_ << ")";
+ set_error(SPDY_UNSUPPORTED_VERSION);
} else {
ProcessControlFrameHeader();
}
@@ -535,32 +564,6 @@ void SpdyFramer::ProcessControlFrameHeader() {
DCHECK_EQ(SPDY_NO_ERROR, error_code_);
DCHECK_LE(static_cast<size_t>(SpdyFrame::kHeaderSize),
current_frame_buffer_length_);
- SpdyFrameReader reader(current_frame_buffer_.get(),
- current_frame_buffer_length_);
-
- uint16 version = 0;
- bool successful_read = reader.ReadUInt16(&version);
- DCHECK(successful_read);
- version &= ~kControlFlagMask;
-
- successful_read =
- reader.ReadUInt16(reinterpret_cast<uint16*>(&current_frame_type_));
- DCHECK(successful_read);
-
- successful_read = reader.ReadUInt8(&current_frame_flags_);
- DCHECK(successful_read);
-
- successful_read = reader.ReadUInt24(&current_frame_length_);
- DCHECK(successful_read);
-
- // We check version before we check validity: version can never be 'invalid',
- // it can only be unsupported.
- if (version != spdy_version_) {
- DLOG(INFO) << "Unsupported SPDY version " << version
- << " (expected " << spdy_version_ << ")";
- set_error(SPDY_UNSUPPORTED_VERSION);
- return;
- }
if (current_frame_type_ < SYN_STREAM ||
current_frame_type_ >= NUM_CONTROL_FRAME_TYPES) {
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc
index 7c29273..c8cd3ff 100644
--- a/net/spdy/spdy_framer_test.cc
+++ b/net/spdy/spdy_framer_test.cc
@@ -1352,7 +1352,6 @@ TEST_P(SpdyFramerTest, HeaderCompression) {
decompressed.reset(SpdyFramerTestUtil::DecompressFrame(
&recv_framer, *syn_frame_1.get()));
EXPECT_TRUE(decompressed.get() != NULL);
- EXPECT_TRUE(decompressed->is_control_frame());
serialized_headers = GetSerializedHeaders(decompressed.get(), send_framer);
EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(),
serialized_headers.size(),
@@ -1365,7 +1364,6 @@ TEST_P(SpdyFramerTest, HeaderCompression) {
decompressed.reset(SpdyFramerTestUtil::DecompressFrame(
&recv_framer, *syn_frame_2.get()));
EXPECT_TRUE(decompressed.get() != NULL);
- EXPECT_TRUE(decompressed->is_control_frame());
serialized_headers = GetSerializedHeaders(decompressed.get(), send_framer);
decompressed_headers.clear();
EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(),
diff --git a/net/spdy/spdy_protocol.h b/net/spdy/spdy_protocol.h
index 3fa80a8..d608f70 100644
--- a/net/spdy/spdy_protocol.h
+++ b/net/spdy/spdy_protocol.h
@@ -856,11 +856,6 @@ class SpdyFrame {
frame_->flags_length_.length_ = flags() | length;
}
- bool is_control_frame() const {
- return (ntohs(frame_->control_.version_) & kControlFlagMask) ==
- kControlFlagMask;
- }
-
// The size of the SpdyFrameBlock structure.
// Every SpdyFrame* class has a static size() method for accessing
// the size of the data structure which will be sent over the wire.
diff --git a/net/spdy/spdy_protocol_test.cc b/net/spdy/spdy_protocol_test.cc
index cd4c36c..3dfb050 100644
--- a/net/spdy/spdy_protocol_test.cc
+++ b/net/spdy/spdy_protocol_test.cc
@@ -61,13 +61,11 @@ TEST_P(SpdyProtocolTest, FrameStructs) {
frame.set_flags(10);
EXPECT_EQ(12345u, frame.length());
EXPECT_EQ(10u, frame.flags());
- EXPECT_FALSE(frame.is_control_frame());
frame.set_length(0);
frame.set_flags(10);
EXPECT_EQ(0u, frame.length());
EXPECT_EQ(10u, frame.flags());
- EXPECT_FALSE(frame.is_control_frame());
}
TEST_P(SpdyProtocolTest, DataFrameStructs) {
@@ -82,10 +80,8 @@ TEST_P(SpdyProtocolTest, TestDataFrame) {
// Set the stream ID to various values.
frame.set_stream_id(0);
EXPECT_EQ(0u, frame.stream_id());
- EXPECT_FALSE(frame.is_control_frame());
frame.set_stream_id(~0 & kStreamIdMask);
EXPECT_EQ(~0 & kStreamIdMask, frame.stream_id());
- EXPECT_FALSE(frame.is_control_frame());
// Set length to various values. Make sure that when you set_length(x),
// length() == x. Also make sure the flags are unaltered.
@@ -140,7 +136,6 @@ TEST_P(SpdyProtocolDeathTest, TestDataFrame) {
EXPECT_DEATH(frame.set_stream_id(~0), "");
#endif
#endif
- EXPECT_FALSE(frame.is_control_frame());
frame.set_flags(0);
#if !defined(WIN32) && defined(GTEST_HAS_DEATH_TEST)