| Index: net/spdy/spdy_framer_test.cc
|
| diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc
|
| index 5dd60fb6fae684624fa943b6f730f438d1a32ed3..dfb1f9fa89c91857d25433a1d196d1135098cddf 100644
|
| --- a/net/spdy/spdy_framer_test.cc
|
| +++ b/net/spdy/spdy_framer_test.cc
|
| @@ -3784,29 +3784,34 @@ TEST_P(SpdyFramerTest, ReadCompressedPushPromise) {
|
| EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_));
|
| }
|
|
|
| -TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) {
|
| +TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndPadding) {
|
| if (spdy_version_ <= SPDY3) {
|
| return;
|
| }
|
|
|
| const unsigned char kInput[] = {
|
| - 0x00, 0x10, 0x01, 0x00, // HEADERS
|
| + 0x00, 0x14, 0x01, 0x08, // HEADERS: PAD_LOW
|
| 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| + 0x03, // Padding of 3.
|
| 0x00, 0x06, 0x63, 0x6f,
|
| 0x6f, 0x6b, 0x69, 0x65,
|
| 0x07, 0x66, 0x6f, 0x6f,
|
| 0x3d, 0x62, 0x61, 0x72,
|
| + 0x00, 0x00, 0x00,
|
|
|
| - 0x00, 0x14, 0x09, 0x00, // CONTINUATION
|
| + 0x00, 0x1a, 0x09, 0x18, // CONTINUATION: PAD_LOW & PAD_HIGH
|
| 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| + 0x00, 0x04, // Padding of 4.
|
| 0x00, 0x06, 0x63, 0x6f,
|
| 0x6f, 0x6b, 0x69, 0x65,
|
| 0x08, 0x62, 0x61, 0x7a,
|
| 0x3d, 0x62, 0x69, 0x6e,
|
| 0x67, 0x00, 0x06, 0x63,
|
| + 0x00, 0x00, 0x00, 0x00,
|
|
|
| - 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS
|
| + 0x00, 0x13, 0x09, 0x0c, // CONTINUATION: PAD_LOW & END_HEADERS
|
| 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| + 0x00, // Padding of 0.
|
| 0x6f, 0x6f, 0x6b, 0x69,
|
| 0x65, 0x00, 0x00, 0x04,
|
| 0x6e, 0x61, 0x6d, 0x65,
|
| @@ -3814,7 +3819,6 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) {
|
| 0x75, 0x65,
|
| };
|
|
|
| - SpdyFramer framer(spdy_version_);
|
| TestSpdyVisitor visitor(spdy_version_);
|
| visitor.SimulateInFramer(kInput, sizeof(kInput));
|
|
|
| @@ -3875,21 +3879,23 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) {
|
| Pair("name", "value")));
|
| }
|
|
|
| -TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) {
|
| +TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuationAndPadding) {
|
| if (spdy_version_ <= SPDY3) {
|
| return;
|
| }
|
|
|
| const unsigned char kInput[] = {
|
| - 0x00, 0x14, 0x05, 0x00, // PUSH_PROMISE
|
| + 0x00, 0x18, 0x05, 0x18, // PUSH_PROMISE: PAD_LOW & PAD_HIGH
|
| 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| 0x00, 0x00, 0x00, 0x2A, // Promised stream 42
|
| + 0x00, 0x02, // Padding of 2.
|
| 0x00, 0x06, 0x63, 0x6f,
|
| 0x6f, 0x6b, 0x69, 0x65,
|
| 0x07, 0x66, 0x6f, 0x6f,
|
| 0x3d, 0x62, 0x61, 0x72,
|
| + 0x00, 0x00,
|
|
|
| - 0x00, 0x14, 0x09, 0x00, // CONTINUATION
|
| + 0x00, 0x14, 0x09, 0x00, // CONTINUATION:
|
| 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| 0x00, 0x06, 0x63, 0x6f,
|
| 0x6f, 0x6b, 0x69, 0x65,
|
| @@ -3897,13 +3903,15 @@ TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) {
|
| 0x3d, 0x62, 0x69, 0x6e,
|
| 0x67, 0x00, 0x06, 0x63,
|
|
|
| - 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS
|
| + 0x00, 0x17, 0x09, 0x0c, // CONTINUATION: PAD_LOW & END_HEADERS
|
| 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| + 0x04, // Padding of 4.
|
| 0x6f, 0x6f, 0x6b, 0x69,
|
| 0x65, 0x00, 0x00, 0x04,
|
| 0x6e, 0x61, 0x6d, 0x65,
|
| 0x05, 0x76, 0x61, 0x6c,
|
| - 0x75, 0x65,
|
| + 0x75, 0x65, 0x00, 0x00,
|
| + 0x00, 0x00,
|
| };
|
|
|
| SpdyFramer framer(spdy_version_);
|
| @@ -4055,6 +4063,53 @@ TEST_P(SpdyFramerTest, ExpectContinuationReceiveControlFrame) {
|
| EXPECT_EQ(0, visitor.data_frame_count_);
|
| }
|
|
|
| +TEST_P(SpdyFramerTest, EndSegmentOnDataFrame) {
|
| + if (spdy_version_ <= SPDY3) {
|
| + return;
|
| + }
|
| + const unsigned char kInput[] = {
|
| + 0x00, 0x0c, 0x00, 0x02, // DATA: END_SEGMENT
|
| + 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| + 0xde, 0xad, 0xbe, 0xef,
|
| + 0xde, 0xad, 0xbe, 0xef,
|
| + 0xde, 0xad, 0xbe, 0xef,
|
| + };
|
| +
|
| + TestSpdyVisitor visitor(spdy_version_);
|
| + visitor.SimulateInFramer(kInput, sizeof(kInput));
|
| +
|
| + // TODO(jgraettinger): Verify END_SEGMENT when support is added.
|
| + EXPECT_EQ(0, visitor.error_count_);
|
| + EXPECT_EQ(12, visitor.data_bytes_);
|
| + EXPECT_EQ(0, visitor.fin_frame_count_);
|
| + EXPECT_EQ(0, visitor.fin_flag_count_);
|
| +}
|
| +
|
| +TEST_P(SpdyFramerTest, EndSegmentOnHeadersFrame) {
|
| + if (spdy_version_ <= SPDY3) {
|
| + return;
|
| + }
|
| + const unsigned char kInput[] = {
|
| + 0x00, 0x10, 0x01, 0x06, // HEADERS: END_SEGMENT | END_HEADERS
|
| + 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| + 0x00, 0x06, 0x63, 0x6f,
|
| + 0x6f, 0x6b, 0x69, 0x65,
|
| + 0x07, 0x66, 0x6f, 0x6f,
|
| + 0x3d, 0x62, 0x61, 0x72,
|
| + };
|
| +
|
| + TestSpdyVisitor visitor(spdy_version_);
|
| + visitor.SimulateInFramer(kInput, sizeof(kInput));
|
| +
|
| + // TODO(jgraettinger): Verify END_SEGMENT when support is added.
|
| + EXPECT_EQ(0, visitor.error_count_);
|
| + EXPECT_EQ(1, visitor.headers_frame_count_);
|
| + EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
|
| +
|
| + EXPECT_THAT(visitor.headers_, ElementsAre(
|
| + Pair("cookie", "foo=bar")));
|
| +}
|
| +
|
| TEST_P(SpdyFramerTest, ReadGarbage) {
|
| SpdyFramer framer(spdy_version_);
|
| unsigned char garbage_frame[256];
|
| @@ -4098,6 +4153,25 @@ TEST_P(SpdyFramerTest, ReadGarbageWithValidVersion) {
|
| EXPECT_EQ(1, visitor.error_count_);
|
| }
|
|
|
| +TEST_P(SpdyFramerTest, ReadGarbageHPACKEncoding) {
|
| + if (spdy_version_ <= SPDY3) {
|
| + return;
|
| + }
|
| + const unsigned char kInput[] = {
|
| + 0x00, 0x12, 0x01, 0x04, // HEADER: END_HEADERS
|
| + 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| + 0xef, 0xef, 0xff, 0xff,
|
| + 0xff, 0xff, 0xff, 0xff,
|
| + 0xff, 0xff, 0xff, 0xff,
|
| + 0xff, 0xff, 0xff, 0xff,
|
| + 0xff, 0xff,
|
| + };
|
| +
|
| + TestSpdyVisitor visitor(spdy_version_);
|
| + visitor.SimulateInFramer(kInput, arraysize(kInput));
|
| + EXPECT_EQ(1, visitor.error_count_);
|
| +}
|
| +
|
| TEST_P(SpdyFramerTest, SizesTest) {
|
| SpdyFramer framer(spdy_version_);
|
| EXPECT_EQ(8u, framer.GetDataFrameMinimumSize());
|
| @@ -4389,6 +4463,10 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| if (IsSpdy4()) {
|
| // PRIORITY required for SYN_STREAM simulation.
|
| set_flags |= HEADERS_FLAG_PRIORITY;
|
| +
|
| + // TODO(jgraettinger): Add padding to SynStreamIR, and implement framing.
|
| + set_flags &= ~HEADERS_FLAG_PAD_LOW;
|
| + set_flags &= ~HEADERS_FLAG_PAD_HIGH;
|
| }
|
| SetFrameFlags(frame.get(), set_flags, spdy_version_);
|
|
|
| @@ -4398,7 +4476,10 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| } else if (IsSpdy4() &&
|
| flags & ~(CONTROL_FLAG_FIN |
|
| HEADERS_FLAG_PRIORITY |
|
| - HEADERS_FLAG_END_HEADERS)) {
|
| + HEADERS_FLAG_END_HEADERS |
|
| + HEADERS_FLAG_END_SEGMENT |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_CALL(visitor, OnError(_));
|
| } else {
|
| EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _));
|
| @@ -4430,7 +4511,10 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| } else if (IsSpdy4() &&
|
| flags & ~(CONTROL_FLAG_FIN |
|
| HEADERS_FLAG_PRIORITY |
|
| - HEADERS_FLAG_END_HEADERS)) {
|
| + HEADERS_FLAG_END_HEADERS |
|
| + HEADERS_FLAG_END_SEGMENT |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
|
| EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
|
| framer.error_code())
|
| @@ -4647,12 +4731,22 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) {
|
| SpdyHeadersIR headers_ir(57);
|
| headers_ir.SetHeader("foo", "bar");
|
| scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir));
|
| - SetFrameFlags(frame.get(), flags, spdy_version_);
|
| + int set_flags = flags;
|
| + if (IsSpdy4()) {
|
| + // TODO(jgraettinger): Add padding to SpdyHeadersIR,
|
| + // and implement framing.
|
| + set_flags &= ~HEADERS_FLAG_PAD_LOW;
|
| + set_flags &= ~HEADERS_FLAG_PAD_HIGH;
|
| + }
|
| + SetFrameFlags(frame.get(), set_flags, spdy_version_);
|
|
|
| if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) {
|
| EXPECT_CALL(visitor, OnError(_));
|
| } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN |
|
| - HEADERS_FLAG_END_HEADERS)) {
|
| + HEADERS_FLAG_END_HEADERS |
|
| + HEADERS_FLAG_END_SEGMENT |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_CALL(visitor, OnError(_));
|
| } else {
|
| EXPECT_CALL(visitor, OnHeaders(57,
|
| @@ -4676,8 +4770,11 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) {
|
| EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
|
| framer.error_code())
|
| << SpdyFramer::ErrorCodeToString(framer.error_code());
|
| - } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | HEADERS_FLAG_PRIORITY |
|
| - HEADERS_FLAG_END_HEADERS)) {
|
| + } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN |
|
| + HEADERS_FLAG_END_HEADERS |
|
| + HEADERS_FLAG_END_SEGMENT |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
|
| EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
|
| framer.error_code())
|
| @@ -4781,9 +4878,14 @@ TEST_P(SpdyFramerTest, PushPromiseFrameFlags) {
|
| push_promise.SetHeader("foo", "bar");
|
| scoped_ptr<SpdySerializedFrame> frame(
|
| framer.SerializePushPromise(push_promise));
|
| - SetFrameFlags(frame.get(), flags, spdy_version_);
|
| + // TODO(jgraettinger): Add padding to SpdyPushPromiseIR,
|
| + // and implement framing.
|
| + int set_flags = flags & ~HEADERS_FLAG_PAD_LOW & ~HEADERS_FLAG_PAD_HIGH;
|
| + SetFrameFlags(frame.get(), set_flags, spdy_version_);
|
|
|
| - if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE)) {
|
| + if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_CALL(visitor, OnError(_));
|
| } else {
|
| EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _));
|
| @@ -4794,7 +4896,9 @@ TEST_P(SpdyFramerTest, PushPromiseFrameFlags) {
|
| }
|
|
|
| framer.ProcessInput(frame->data(), frame->size());
|
| - if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE)) {
|
| + if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
|
| EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
|
| framer.error_code())
|
| @@ -4837,9 +4941,14 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) {
|
| continuation.SetHeader("foo", "bar");
|
| scoped_ptr<SpdySerializedFrame> frame(
|
| framer.SerializeContinuation(continuation));
|
| - SetFrameFlags(frame.get(), flags, spdy_version_);
|
| + // TODO(jgraettinger): Add padding to the eventual continuation
|
| + // serialization implementation.
|
| + int set_flags = flags & ~HEADERS_FLAG_PAD_LOW & ~HEADERS_FLAG_PAD_HIGH;
|
| + SetFrameFlags(frame.get(), set_flags, spdy_version_);
|
|
|
| - if (flags & ~(HEADERS_FLAG_END_HEADERS)) {
|
| + if (flags & ~(HEADERS_FLAG_END_HEADERS |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_CALL(visitor, OnError(_));
|
| } else {
|
| EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _));
|
| @@ -4851,7 +4960,9 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) {
|
|
|
| framer.ProcessInput(frame0->data(), frame0->size());
|
| framer.ProcessInput(frame->data(), frame->size());
|
| - if (flags & ~(HEADERS_FLAG_END_HEADERS)) {
|
| + if (flags & ~(HEADERS_FLAG_END_HEADERS |
|
| + HEADERS_FLAG_PAD_LOW |
|
| + HEADERS_FLAG_PAD_HIGH)) {
|
| EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
|
| EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
|
| framer.error_code())
|
|
|