diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-11 23:43:44 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-11 23:43:44 +0000 |
commit | 3a8d685876ce9ea697f5ae206308c42592031b44 (patch) | |
tree | 050170d70e6aaadedc3e5994f7f1d4d2c1ee5a27 | |
parent | 01d4730859afc1d338da87331c44d68f91bfd7a2 (diff) | |
download | chromium_src-3a8d685876ce9ea697f5ae206308c42592031b44.zip chromium_src-3a8d685876ce9ea697f5ae206308c42592031b44.tar.gz chromium_src-3a8d685876ce9ea697f5ae206308c42592031b44.tar.bz2 |
Don't drain response bodies for SpdyHttpStreams.
This should fix the specific instance of crbug.com/75657, although I can't reproduce the bug, so it's possible it may instead push the bug later down the pipeline rather than completely fixing it. I believe it should completely fix it though.
This is a partial reland of r77399, which was reverted in order to faciliate this partial reland so I can merge a smaller change into branch 696.
BUG=75657
TEST=none
Review URL: http://codereview.chromium.org/6680009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@77893 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/http/http_basic_stream.cc | 4 | ||||
-rw-r--r-- | net/http/http_basic_stream.h | 2 | ||||
-rw-r--r-- | net/http/http_network_transaction.cc | 3 | ||||
-rw-r--r-- | net/http/http_response_body_drainer_unittest.cc | 2 | ||||
-rw-r--r-- | net/http/http_stream.h | 4 | ||||
-rw-r--r-- | net/spdy/spdy_http_stream.cc | 4 | ||||
-rw-r--r-- | net/spdy/spdy_http_stream.h | 1 | ||||
-rw-r--r-- | net/spdy/spdy_network_transaction_unittest.cc | 44 |
8 files changed, 43 insertions, 21 deletions
diff --git a/net/http/http_basic_stream.cc b/net/http/http_basic_stream.cc index 3e69d7a..ef4d777 100644 --- a/net/http/http_basic_stream.cc +++ b/net/http/http_basic_stream.cc @@ -111,4 +111,8 @@ void HttpBasicStream::GetSSLCertRequestInfo( parser_->GetSSLCertRequestInfo(cert_request_info); } +bool HttpBasicStream::IsSpdyHttpStream() const { + return false; +} + } // namespace net diff --git a/net/http/http_basic_stream.h b/net/http/http_basic_stream.h index 918596a..a706e8e 100644 --- a/net/http/http_basic_stream.h +++ b/net/http/http_basic_stream.h @@ -76,6 +76,8 @@ class HttpBasicStream : public HttpStream { virtual void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info); + virtual bool IsSpdyHttpStream() const; + private: scoped_refptr<GrowableIOBuffer> read_buf_; diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index d3ed391..6b30fd6 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc @@ -128,6 +128,9 @@ HttpNetworkTransaction::~HttpNetworkTransaction() { if (stream_->IsResponseBodyComplete()) { // If the response body is complete, we can just reuse the socket. stream_->Close(false /* reusable */); + } else if (stream_->IsSpdyHttpStream()) { + // Doesn't really matter for SpdyHttpStream. Just close it. + stream_->Close(true /* not reusable */); } else { // Otherwise, we try to drain the response body. // TODO(willchan): Consider moving this response body draining to the diff --git a/net/http/http_response_body_drainer_unittest.cc b/net/http/http_response_body_drainer_unittest.cc index 5745865..ea9d299 100644 --- a/net/http/http_response_body_drainer_unittest.cc +++ b/net/http/http_response_body_drainer_unittest.cc @@ -111,6 +111,8 @@ class MockHttpStream : public HttpStream { virtual bool IsResponseBodyComplete() const { return is_complete_; } + virtual bool IsSpdyHttpStream() const { return false; } + // Methods to tweak/observer mock behavior: void StallReadsForever() { stall_reads_forever_ = true; } diff --git a/net/http/http_stream.h b/net/http/http_stream.h index 16f84cc..e262038 100644 --- a/net/http/http_stream.h +++ b/net/http/http_stream.h @@ -126,6 +126,10 @@ class HttpStream { // behavior is undefined. virtual void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) = 0; + // HACK(willchan): Really, we should move the HttpResponseDrainer logic into + // the HttpStream implementation. This is just a quick hack. + virtual bool IsSpdyHttpStream() const = 0; + private: DISALLOW_COPY_AND_ASSIGN(HttpStream); }; diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc index 51a2efd..130a818 100644 --- a/net/spdy/spdy_http_stream.cc +++ b/net/spdy/spdy_http_stream.cc @@ -463,4 +463,8 @@ void SpdyHttpStream::GetSSLCertRequestInfo( stream_->GetSSLCertRequestInfo(cert_request_info); } +bool SpdyHttpStream::IsSpdyHttpStream() const { + return true; +} + } // namespace net diff --git a/net/spdy/spdy_http_stream.h b/net/spdy/spdy_http_stream.h index bdae342..4c00e0f 100644 --- a/net/spdy/spdy_http_stream.h +++ b/net/spdy/spdy_http_stream.h @@ -65,6 +65,7 @@ class SpdyHttpStream : public SpdyStream::Delegate, public HttpStream { virtual void SetConnectionReused(); virtual void GetSSLInfo(SSLInfo* ssl_info); virtual void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info); + virtual bool IsSpdyHttpStream() const; // SpdyStream::Delegate methods: virtual bool OnSendHeadersComplete(int status); diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index 94ef61d..acfb7ea 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc @@ -2530,20 +2530,6 @@ TEST_P(SpdyNetworkTransactionTest, RedirectServerPush) { "version", "HTTP/1.1" }; - const char* const kStandardGetHeaders2[] = { - "host", - "www.foo.com", - "method", - "GET", - "scheme", - "http", - "url", - "/index.php", - "user-agent", - "", - "version", - "HTTP/1.1" - }; // Setup writes/reads to www.google.com scoped_ptr<spdy::SpdyFrame> req( @@ -2552,12 +2538,6 @@ TEST_P(SpdyNetworkTransactionTest, RedirectServerPush) { arraysize(kExtraHeaders) / 2, kStandardGetHeaders, arraysize(kStandardGetHeaders) / 2)); - scoped_ptr<spdy::SpdyFrame> req2( - ConstructSpdyPacket(kSynStartHeader, - kExtraHeaders, - arraysize(kExtraHeaders) / 2, - kStandardGetHeaders2, - arraysize(kStandardGetHeaders2) / 2)); scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); scoped_ptr<spdy::SpdyFrame> rep( ConstructSpdyPush(NULL, @@ -2568,18 +2548,40 @@ TEST_P(SpdyNetworkTransactionTest, RedirectServerPush) { "301 Moved Permanently", "http://www.foo.com/index.php")); scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); + scoped_ptr<spdy::SpdyFrame> rst(ConstructSpdyRstStream(2, spdy::CANCEL)); MockWrite writes[] = { CreateMockWrite(*req, 1), + CreateMockWrite(*rst, 6), }; MockRead reads[] = { CreateMockRead(*resp, 2), CreateMockRead(*rep, 3), CreateMockRead(*body, 4), MockRead(true, ERR_IO_PENDING, 5), // Force a pause - MockRead(true, 0, 0, 6) // EOF + MockRead(true, 0, 0, 7) // EOF }; // Setup writes/reads to www.foo.com + const char* const kStandardGetHeaders2[] = { + "host", + "www.foo.com", + "method", + "GET", + "scheme", + "http", + "url", + "/index.php", + "user-agent", + "", + "version", + "HTTP/1.1" + }; + scoped_ptr<spdy::SpdyFrame> req2( + ConstructSpdyPacket(kSynStartHeader, + kExtraHeaders, + arraysize(kExtraHeaders) / 2, + kStandardGetHeaders2, + arraysize(kStandardGetHeaders2) / 2)); scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 1)); scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(1, true)); MockWrite writes2[] = { |