Index: net/spdy/chromium/spdy_network_transaction_unittest.cc |
diff --git a/net/spdy/chromium/spdy_network_transaction_unittest.cc b/net/spdy/chromium/spdy_network_transaction_unittest.cc |
index 2575ea51a37a17a365ecc58cb897bbbf16875124..65797647ff07a2edf931a9cf329640f5070ec739 100644 |
--- a/net/spdy/chromium/spdy_network_transaction_unittest.cc |
+++ b/net/spdy/chromium/spdy_network_transaction_unittest.cc |
@@ -2239,6 +2239,7 @@ TEST_F(SpdyNetworkTransactionTest, |
spdy_util_.ConstructSpdyDataFrame(1, "should not include", 18, true)); |
SpdyHeaderBlock push_headers; |
+ push_headers[":method"] = "GET"; |
spdy_util_.AddUrlToHeaderBlock(SpdyString(kDefaultUrl) + "b.dat", |
&push_headers); |
@@ -3147,6 +3148,63 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) { |
EXPECT_TRUE(data.AllWriteDataConsumed()); |
} |
+// Regression test for https://crbug.com/727653. |
+TEST_F(SpdyNetworkTransactionTest, RejectServerPushWithNoMethod) { |
+ SpdySerializedFrame req( |
+ spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
+ SpdySerializedFrame rst( |
+ spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_REFUSED_STREAM)); |
+ MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 3)}; |
+ |
+ SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
+ |
+ SpdyHeaderBlock push_promise_header_block; |
+ spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat").c_str(), |
+ &push_promise_header_block); |
+ SpdyPushPromiseIR push_promise(1, 2, std::move(push_promise_header_block)); |
+ SpdySerializedFrame push_promise_frame( |
+ spdy_util_.SerializeFrame(push_promise)); |
+ |
+ SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
+ MockRead reads[] = { |
+ CreateMockRead(reply, 1), CreateMockRead(push_promise_frame, 2), |
+ CreateMockRead(body, 4), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5)}; |
+ |
+ SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
+ NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
+ NetLogWithSource(), nullptr); |
+ helper.RunToCompletion(&data); |
+} |
+ |
+// Regression test for https://crbug.com/727653. |
+TEST_F(SpdyNetworkTransactionTest, RejectServerPushWithInvalidMethod) { |
+ SpdySerializedFrame req( |
+ spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
+ SpdySerializedFrame rst( |
+ spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_REFUSED_STREAM)); |
+ MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 3)}; |
+ |
+ SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
+ |
+ SpdyHeaderBlock push_promise_header_block; |
+ push_promise_header_block[":method"] = "POST"; |
+ spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat").c_str(), |
+ &push_promise_header_block); |
+ SpdyPushPromiseIR push_promise(1, 2, std::move(push_promise_header_block)); |
+ SpdySerializedFrame push_promise_frame( |
+ spdy_util_.SerializeFrame(push_promise)); |
+ |
+ SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
+ MockRead reads[] = { |
+ CreateMockRead(reply, 1), CreateMockRead(push_promise_frame, 2), |
+ CreateMockRead(body, 4), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5)}; |
+ |
+ SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
+ NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
+ NetLogWithSource(), nullptr); |
+ helper.RunToCompletion(&data); |
+} |
+ |
// Verify that various response headers parse correctly through the HTTP layer. |
TEST_F(SpdyNetworkTransactionTest, ResponseHeaders) { |
struct ResponseHeadersTests { |
@@ -4689,6 +4747,7 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushWithHeaders) { |
spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
SpdyHeaderBlock initial_headers; |
+ initial_headers[":method"] = "GET"; |
spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
&initial_headers); |
SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
@@ -4747,6 +4806,7 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) { |
SpdySerializedFrame stream1_reply( |
spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
SpdyHeaderBlock initial_headers; |
+ initial_headers[":method"] = "GET"; |
spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
&initial_headers); |
SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |