diff options
author | rch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-27 04:57:25 +0000 |
---|---|---|
committer | rch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-27 04:57:25 +0000 |
commit | b350300061f0efa68ab26a563a4d5bf89bc13b48 (patch) | |
tree | 83f26521b5bbb480c3200507890b32b8450f440f /net | |
parent | 86c67da909f1dba9b87d920e21805a744a3a8269 (diff) | |
download | chromium_src-b350300061f0efa68ab26a563a4d5bf89bc13b48.zip chromium_src-b350300061f0efa68ab26a563a4d5bf89bc13b48.tar.gz chromium_src-b350300061f0efa68ab26a563a4d5bf89bc13b48.tar.bz2 |
Reject streams with transfer-encoding headers.
BUG=118398
TEST=\*Reset\*WithTransferEncoding
Review URL: http://codereview.chromium.org/9836050
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129136 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/spdy/spdy_network_transaction_spdy21_unittest.cc | 70 | ||||
-rw-r--r-- | net/spdy/spdy_network_transaction_spdy2_unittest.cc | 70 | ||||
-rw-r--r-- | net/spdy/spdy_network_transaction_spdy3_unittest.cc | 70 | ||||
-rw-r--r-- | net/spdy/spdy_stream.cc | 12 |
4 files changed, 222 insertions, 0 deletions
diff --git a/net/spdy/spdy_network_transaction_spdy21_unittest.cc b/net/spdy/spdy_network_transaction_spdy21_unittest.cc index 70bf9ec..de850fb 100644 --- a/net/spdy/spdy_network_transaction_spdy21_unittest.cc +++ b/net/spdy/spdy_network_transaction_spdy21_unittest.cc @@ -2223,6 +2223,76 @@ TEST_P(SpdyNetworkTransactionSpdy21Test, FlowControlStallResume) { helper.VerifyDataConsumed(); } +TEST_P(SpdyNetworkTransactionSpdy21Test, ResetReplyWithTransferEncoding) { + // Construct the request. + scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); + scoped_ptr<SpdyFrame> rst(ConstructSpdyRstStream(1, PROTOCOL_ERROR)); + MockWrite writes[] = { + CreateMockWrite(*req), + CreateMockWrite(*rst), + }; + + const char* const headers[] = { + "transfer-encoding", "chuncked" + }; + scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(headers, 1, 1)); + scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = { + CreateMockRead(*resp), + CreateMockRead(*body), + MockRead(ASYNC, 0, 0) // EOF + }; + + scoped_ptr<DelayedSocketData> data( + new DelayedSocketData(1, reads, arraysize(reads), + writes, arraysize(writes))); + NormalSpdyTransactionHelper helper(CreateGetRequest(), + BoundNetLog(), GetParam()); + helper.RunToCompletion(data.get()); + TransactionHelperResult out = helper.output(); + EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); + + helper.session()->spdy_session_pool()->CloseAllSessions(); + helper.VerifyDataConsumed(); +} + +TEST_P(SpdyNetworkTransactionSpdy21Test, ResetPushWithTransferEncoding) { + // Construct the request. + scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); + scoped_ptr<SpdyFrame> rst(ConstructSpdyRstStream(2, PROTOCOL_ERROR)); + MockWrite writes[] = { + CreateMockWrite(*req), + CreateMockWrite(*rst), + }; + + scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); + const char* const headers[] = {"url", "http://www.google.com/1", + "transfer-encoding", "chunked"}; + scoped_ptr<SpdyFrame> push(ConstructSpdyPush(headers, arraysize(headers) / 2, + 2, 1)); + scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = { + CreateMockRead(*resp), + CreateMockRead(*push), + CreateMockRead(*body), + MockRead(ASYNC, 0, 0) // EOF + }; + + scoped_ptr<DelayedSocketData> data( + new DelayedSocketData(1, reads, arraysize(reads), + writes, arraysize(writes))); + NormalSpdyTransactionHelper helper(CreateGetRequest(), + BoundNetLog(), GetParam()); + helper.RunToCompletion(data.get()); + TransactionHelperResult out = helper.output(); + EXPECT_EQ(OK, out.rv); + EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); + EXPECT_EQ("hello!", out.response_data); + + helper.session()->spdy_session_pool()->CloseAllSessions(); + helper.VerifyDataConsumed(); +} + TEST_P(SpdyNetworkTransactionSpdy21Test, CancelledTransaction) { // Construct the request. scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); diff --git a/net/spdy/spdy_network_transaction_spdy2_unittest.cc b/net/spdy/spdy_network_transaction_spdy2_unittest.cc index e39dbeb..02714a9 100644 --- a/net/spdy/spdy_network_transaction_spdy2_unittest.cc +++ b/net/spdy/spdy_network_transaction_spdy2_unittest.cc @@ -1859,6 +1859,76 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, ResponseWithTwoSynReplies) { helper.VerifyDataConsumed(); } +TEST_P(SpdyNetworkTransactionSpdy2Test, ResetReplyWithTransferEncoding) { + // Construct the request. + scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); + scoped_ptr<SpdyFrame> rst(ConstructSpdyRstStream(1, PROTOCOL_ERROR)); + MockWrite writes[] = { + CreateMockWrite(*req), + CreateMockWrite(*rst), + }; + + const char* const headers[] = { + "transfer-encoding", "chuncked" + }; + scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(headers, 1, 1)); + scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = { + CreateMockRead(*resp), + CreateMockRead(*body), + MockRead(ASYNC, 0, 0) // EOF + }; + + scoped_ptr<DelayedSocketData> data( + new DelayedSocketData(1, reads, arraysize(reads), + writes, arraysize(writes))); + NormalSpdyTransactionHelper helper(CreateGetRequest(), + BoundNetLog(), GetParam()); + helper.RunToCompletion(data.get()); + TransactionHelperResult out = helper.output(); + EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); + + helper.session()->spdy_session_pool()->CloseAllSessions(); + helper.VerifyDataConsumed(); +} + +TEST_P(SpdyNetworkTransactionSpdy2Test, ResetPushWithTransferEncoding) { + // Construct the request. + scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); + scoped_ptr<SpdyFrame> rst(ConstructSpdyRstStream(2, PROTOCOL_ERROR)); + MockWrite writes[] = { + CreateMockWrite(*req), + CreateMockWrite(*rst), + }; + + scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); + const char* const headers[] = {"url", "http://www.google.com/1", + "transfer-encoding", "chunked"}; + scoped_ptr<SpdyFrame> push(ConstructSpdyPush(headers, arraysize(headers) / 2, + 2, 1)); + scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = { + CreateMockRead(*resp), + CreateMockRead(*push), + CreateMockRead(*body), + MockRead(ASYNC, 0, 0) // EOF + }; + + scoped_ptr<DelayedSocketData> data( + new DelayedSocketData(1, reads, arraysize(reads), + writes, arraysize(writes))); + NormalSpdyTransactionHelper helper(CreateGetRequest(), + BoundNetLog(), GetParam()); + helper.RunToCompletion(data.get()); + TransactionHelperResult out = helper.output(); + EXPECT_EQ(OK, out.rv); + EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); + EXPECT_EQ("hello!", out.response_data); + + helper.session()->spdy_session_pool()->CloseAllSessions(); + helper.VerifyDataConsumed(); +} + TEST_P(SpdyNetworkTransactionSpdy2Test, CancelledTransaction) { // Construct the request. scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); diff --git a/net/spdy/spdy_network_transaction_spdy3_unittest.cc b/net/spdy/spdy_network_transaction_spdy3_unittest.cc index 1bcdca5..c045472 100644 --- a/net/spdy/spdy_network_transaction_spdy3_unittest.cc +++ b/net/spdy/spdy_network_transaction_spdy3_unittest.cc @@ -2227,6 +2227,76 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, FlowControlStallResume) { helper.VerifyDataConsumed(); } +TEST_P(SpdyNetworkTransactionSpdy3Test, ResetReplyWithTransferEncoding) { + // Construct the request. + scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); + scoped_ptr<SpdyFrame> rst(ConstructSpdyRstStream(1, PROTOCOL_ERROR)); + MockWrite writes[] = { + CreateMockWrite(*req), + CreateMockWrite(*rst), + }; + + const char* const headers[] = { + "transfer-encoding", "chuncked" + }; + scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(headers, 1, 1)); + scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = { + CreateMockRead(*resp), + CreateMockRead(*body), + MockRead(ASYNC, 0, 0) // EOF + }; + + scoped_ptr<DelayedSocketData> data( + new DelayedSocketData(1, reads, arraysize(reads), + writes, arraysize(writes))); + NormalSpdyTransactionHelper helper(CreateGetRequest(), + BoundNetLog(), GetParam()); + helper.RunToCompletion(data.get()); + TransactionHelperResult out = helper.output(); + EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); + + helper.session()->spdy_session_pool()->CloseAllSessions(); + helper.VerifyDataConsumed(); +} + +TEST_P(SpdyNetworkTransactionSpdy3Test, ResetPushWithTransferEncoding) { + // Construct the request. + scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); + scoped_ptr<SpdyFrame> rst(ConstructSpdyRstStream(2, PROTOCOL_ERROR)); + MockWrite writes[] = { + CreateMockWrite(*req), + CreateMockWrite(*rst), + }; + + scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); + const char* const headers[] = {"url", "http://www.google.com/1", + "transfer-encoding", "chunked"}; + scoped_ptr<SpdyFrame> push(ConstructSpdyPush(headers, arraysize(headers) / 2, + 2, 1)); + scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = { + CreateMockRead(*resp), + CreateMockRead(*push), + CreateMockRead(*body), + MockRead(ASYNC, 0, 0) // EOF + }; + + scoped_ptr<DelayedSocketData> data( + new DelayedSocketData(1, reads, arraysize(reads), + writes, arraysize(writes))); + NormalSpdyTransactionHelper helper(CreateGetRequest(), + BoundNetLog(), GetParam()); + helper.RunToCompletion(data.get()); + TransactionHelperResult out = helper.output(); + EXPECT_EQ(OK, out.rv); + EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); + EXPECT_EQ("hello!", out.response_data); + + helper.session()->spdy_session_pool()->CloseAllSessions(); + helper.VerifyDataConsumed(); +} + TEST_P(SpdyNetworkTransactionSpdy3Test, CancelledTransaction) { // Construct the request. scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc index 908900f..fd151b7 100644 --- a/net/spdy/spdy_stream.cc +++ b/net/spdy/spdy_stream.cc @@ -325,6 +325,12 @@ int SpdyStream::OnResponseReceived(const SpdyHeaderBlock& response) { } } + if ((*response_).find("transfer-encoding") != (*response_).end()) { + session_->ResetStream(stream_id_, PROTOCOL_ERROR, + "Received transfer-encoding header"); + return ERR_SPDY_PROTOCOL_ERROR; + } + if (delegate_) rv = delegate_->OnResponseReceived(*response_, response_time_, rv); // If delegate_ is not yet attached, we'll call OnResponseReceived after the @@ -357,6 +363,12 @@ int SpdyStream::OnHeaders(const SpdyHeaderBlock& headers) { (*response_)[it->first] = it->second; } + if ((*response_).find("transfer-encoding") != (*response_).end()) { + session_->ResetStream(stream_id_, PROTOCOL_ERROR, + "Received transfer-encoding header"); + return ERR_SPDY_PROTOCOL_ERROR; + } + int rv = OK; if (delegate_) { rv = delegate_->OnResponseReceived(*response_, response_time_, rv); |