diff options
Diffstat (limited to 'net/spdy')
-rw-r--r-- | net/spdy/spdy_framer.cc | 71 | ||||
-rw-r--r-- | net/spdy/spdy_framer_test.cc | 2 | ||||
-rw-r--r-- | net/spdy/spdy_protocol.h | 5 | ||||
-rw-r--r-- | net/spdy/spdy_protocol_test.cc | 5 |
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(¤t_frame_flags_); + DCHECK(successful_read); + + successful_read = reader.ReadUInt24(¤t_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*>(¤t_frame_type_)); - DCHECK(successful_read); - - successful_read = reader.ReadUInt8(¤t_frame_flags_); - DCHECK(successful_read); - - successful_read = reader.ReadUInt24(¤t_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) |