Index: net/spdy/spdy_framer_test.cc |
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc |
index d6f1a7eabd8f321c2d79cd59cd6669a546091aa0..375bb1d40de03c26df3e78fbf548d71e9c1768e0 100644 |
--- a/net/spdy/spdy_framer_test.cc |
+++ b/net/spdy/spdy_framer_test.cc |
@@ -11,6 +11,7 @@ |
#include "net/spdy/hpack_output_stream.h" |
#include "net/spdy/mock_spdy_framer_visitor.h" |
#include "net/spdy/spdy_frame_builder.h" |
+#include "net/spdy/spdy_frame_reader.h" |
#include "net/spdy/spdy_framer.h" |
#include "net/spdy/spdy_protocol.h" |
#include "net/spdy/spdy_test_utils.h" |
@@ -300,7 +301,9 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
CHECK(header_buffer_valid_); |
size_t parsed_length = framer_.ParseHeaderBlockInBuffer( |
header_buffer_.get(), header_buffer_length_, &headers_); |
- DCHECK_EQ(header_buffer_length_, parsed_length); |
+ LOG_IF(DFATAL, header_buffer_length_ != parsed_length) |
+ << "Check failed: header_buffer_length_ == parsed_length " |
+ << "(" << header_buffer_length_ << " vs. " << parsed_length << ")"; |
return true; |
} |
const size_t available = header_buffer_size_ - header_buffer_length_; |
@@ -492,12 +495,39 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
SpdyHeaderBlock headers_; |
}; |
-// Retrieves serialized headers from SYN_STREAM frame. |
-// Does not check that the given frame is a SYN_STREAM. |
+// Retrieves serialized headers from a HEADERS or SYN_STREAM frame. |
base::StringPiece GetSerializedHeaders(const SpdyFrame* frame, |
const SpdyFramer& framer) { |
- return base::StringPiece(frame->data() + framer.GetSynStreamMinimumSize(), |
- frame->size() - framer.GetSynStreamMinimumSize()); |
+ SpdyFrameReader reader(frame->data(), frame->size()); |
+ reader.Seek(2); // Seek past the frame length. |
+ SpdyFrameType frame_type; |
+ if (framer.protocol_version() > SPDY3) { |
+ uint8 serialized_type; |
+ reader.ReadUInt8(&serialized_type); |
+ frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), |
+ serialized_type); |
+ DCHECK_EQ(HEADERS, frame_type); |
+ uint8 flags; |
+ reader.ReadUInt8(&flags); |
+ if (flags & HEADERS_FLAG_PRIORITY) { |
+ frame_type = SYN_STREAM; |
+ } |
+ } else { |
+ uint16 serialized_type; |
+ reader.ReadUInt16(&serialized_type); |
+ frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), |
+ serialized_type); |
+ DCHECK(frame_type == HEADERS || |
+ frame_type == SYN_STREAM) << frame_type; |
+ } |
+ |
+ if (frame_type == SYN_STREAM) { |
+ return StringPiece(frame->data() + framer.GetSynStreamMinimumSize(), |
+ frame->size() - framer.GetSynStreamMinimumSize()); |
+ } else { |
+ return StringPiece(frame->data() + framer.GetHeadersMinimumSize(), |
+ frame->size() - framer.GetHeadersMinimumSize()); |
+ } |
} |
} // namespace test |