summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-11 23:43:44 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-11 23:43:44 +0000
commit3a8d685876ce9ea697f5ae206308c42592031b44 (patch)
tree050170d70e6aaadedc3e5994f7f1d4d2c1ee5a27
parent01d4730859afc1d338da87331c44d68f91bfd7a2 (diff)
downloadchromium_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.cc4
-rw-r--r--net/http/http_basic_stream.h2
-rw-r--r--net/http/http_network_transaction.cc3
-rw-r--r--net/http/http_response_body_drainer_unittest.cc2
-rw-r--r--net/http/http_stream.h4
-rw-r--r--net/spdy/spdy_http_stream.cc4
-rw-r--r--net/spdy/spdy_http_stream.h1
-rw-r--r--net/spdy/spdy_network_transaction_unittest.cc44
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[] = {