| Index: net/spdy/spdy_network_transaction_unittest.cc
|
| diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
|
| index ac02492a35f0a259a8e2aac44e38a476da51d4f5..f0702197fa824451fd430c0c7d687ee1fdd02bf2 100644
|
| --- a/net/spdy/spdy_network_transaction_unittest.cc
|
| +++ b/net/spdy/spdy_network_transaction_unittest.cc
|
| @@ -6191,6 +6191,60 @@ TEST_F(SpdyNetworkTransactionTest, 100Continue) {
|
| EXPECT_EQ("hello!", out.response_data);
|
| }
|
|
|
| +// "A server can send a complete response prior to the client sending an entire
|
| +// request if the response does not depend on any portion of the request that
|
| +// has not been sent and received." (RFC7540 Section 8.1)
|
| +// Regression test for https://crbug.com/606990. Server responds before POST
|
| +// data are sent and closes connection: this must result in
|
| +// ERR_CONNECTION_CLOSED (as opposed to ERR_SPDY_PROTOCOL_ERROR).
|
| +TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostDataSent) {
|
| + SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
|
| + MockWrite writes[] = {CreateMockWrite(req, 0)};
|
| +
|
| + SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
|
| + SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
|
| + MockRead reads[] = {CreateMockRead(resp, 1), CreateMockRead(body, 2),
|
| + MockRead(ASYNC, 0, 3)};
|
| +
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| + NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
|
| + DEFAULT_PRIORITY, NetLogWithSource(),
|
| + nullptr);
|
| +
|
| + helper.RunPreTestSetup();
|
| + helper.AddData(&data);
|
| + helper.StartDefaultTest();
|
| + EXPECT_THAT(helper.output().rv, IsError(ERR_IO_PENDING));
|
| + helper.WaitForCallbackToComplete();
|
| + EXPECT_THAT(helper.output().rv, IsError(ERR_CONNECTION_CLOSED));
|
| +}
|
| +
|
| +// Regression test for https://crbug.com/606990.
|
| +// Server responds before POST data are sent and resets stream with NO_ERROR.
|
| +TEST_F(SpdyNetworkTransactionTest, ResponseAndRstStreamBeforePostDataSent) {
|
| + SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
|
| + MockWrite writes[] = {CreateMockWrite(req, 0)};
|
| +
|
| + SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
|
| + SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
|
| + SpdySerializedFrame rst(
|
| + spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_NO_ERROR));
|
| + MockRead reads[] = {CreateMockRead(resp, 1), CreateMockRead(body, 2),
|
| + CreateMockRead(rst, 3), MockRead(ASYNC, 0, 4)};
|
| +
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| + NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
|
| + DEFAULT_PRIORITY, NetLogWithSource(),
|
| + nullptr);
|
| +
|
| + helper.RunToCompletion(&data);
|
| +
|
| + TransactionHelperResult out = helper.output();
|
| + EXPECT_THAT(out.rv, IsOk());
|
| + EXPECT_EQ("HTTP/1.1 200", out.status_line);
|
| + EXPECT_EQ("hello!", out.response_data);
|
| +}
|
| +
|
| class SpdyNetworkTransactionTLSUsageCheckTest
|
| : public SpdyNetworkTransactionTest {
|
| protected:
|
|
|