summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-08 00:38:19 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-08 00:38:19 +0000
commit7ec5b39703cf0c000d3556e5fc2bff4cb7b9fb21 (patch)
treea7ccf83590ea28cd35b2d7b0fde465386864a069 /net
parent04e363d14bbc395c528c767c343489522966ef90 (diff)
downloadchromium_src-7ec5b39703cf0c000d3556e5fc2bff4cb7b9fb21.zip
chromium_src-7ec5b39703cf0c000d3556e5fc2bff4cb7b9fb21.tar.gz
chromium_src-7ec5b39703cf0c000d3556e5fc2bff4cb7b9fb21.tar.bz2
Do not use Alternate-Protocol for establishing new SpdySessions.
Only use Alternate-Protocol for latching onto existing SpdySessions. This is a temporary change until SSL improvements are made, so we can begin sending http over spdy when available. Note that we have to do proxy resolution one time to figure out how to check for the appropriate existing SpdySession. If no SpdySession exists, we fallback again and have to redo proxy resolution (since the alternate protocol of npn-spdy requires rewriting the URI from http:// to https://). So we may end up doing two proxy resolutions in the fallback case. I had to disable all the tests that test establishing a new SpdySession for http:// URIs, since we don't do that for now. BUG=none TEST=none Review URL: http://codereview.chromium.org/3573013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61897 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r--net/base/run_all_unittests.cc3
-rw-r--r--net/http/http_network_transaction_unittest.cc54
-rw-r--r--net/http/http_stream_factory.cc3
-rw-r--r--net/http/http_stream_factory.h10
-rw-r--r--net/http/http_stream_request.cc13
5 files changed, 78 insertions, 5 deletions
diff --git a/net/base/run_all_unittests.cc b/net/base/run_all_unittests.cc
index 77f00f0..5f2207d 100644
--- a/net/base/run_all_unittests.cc
+++ b/net/base/run_all_unittests.cc
@@ -6,6 +6,7 @@
#include "base/histogram.h"
#include "base/nss_util.h"
#include "net/base/net_test_suite.h"
+#include "net/http/http_stream_factory.h"
#if defined(OS_WIN)
#include "net/socket/ssl_client_socket_nss_factory.h"
#endif
@@ -24,5 +25,7 @@ int main(int argc, char** argv) {
base::EnsureNSPRInit();
#endif
+ net::HttpStreamFactory::set_create_new_spdy_session_for_http(true);
+
return test_suite.Run();
}
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 02d4a5f..ca3caac 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -4833,7 +4833,6 @@ TEST_F(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) {
"ssl/www.google.com:443",
true,
},
-
{
"http_proxy",
"http://host.with.alternate/direct",
@@ -4899,7 +4898,6 @@ TEST_F(HttpNetworkTransactionTest, GroupNameForSOCKSConnections) {
"socks5/ssl/www.google.com:443",
true,
},
-
{
"socks4://socks_proxy:1080",
"http://host.with.alternate/direct",
@@ -7410,4 +7408,56 @@ TEST_F(HttpNetworkTransactionTest, PreconnectWithExistingSpdySession) {
EXPECT_EQ(OK, callback.WaitForResult());
}
+
+TEST_F(HttpNetworkTransactionTest, DoNotCreateSpdySessionForHttp) {
+ HttpStreamFactory::set_create_new_spdy_session_for_http(false);
+ HttpStreamFactory::set_use_alternate_protocols(true);
+ HttpStreamFactory::set_next_protos(kExpectedNPNString);
+
+ SessionDependencies session_deps;
+ HttpRequestInfo request;
+ request.method = "GET";
+ request.url = GURL("http://www.google.com/");
+ request.load_flags = 0;
+
+ MockRead data_reads[] = {
+ MockRead("HTTP/1.1 200 OK\r\n\r\n"),
+ MockRead("hello world"),
+ MockRead(true, OK),
+ };
+ StaticSocketDataProvider data(
+ data_reads, arraysize(data_reads), NULL, 0);
+ session_deps.socket_factory.AddSocketDataProvider(&data);
+
+ TestCompletionCallback callback;
+
+ scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
+
+ HostPortPair http_host_port_pair("www.google.com", 80);
+ HttpAlternateProtocols* alternate_protocols =
+ session->mutable_alternate_protocols();
+ alternate_protocols->SetAlternateProtocolFor(
+ http_host_port_pair, 443 /* port is ignored */,
+ HttpAlternateProtocols::NPN_SPDY_2);
+
+ scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session));
+
+ int rv = trans->Start(&request, &callback, BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ EXPECT_EQ(OK, callback.WaitForResult());
+
+ const HttpResponseInfo* response = trans->GetResponseInfo();
+ ASSERT_TRUE(response != NULL);
+ ASSERT_TRUE(response->headers != NULL);
+ EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
+
+ std::string response_data;
+ ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
+ EXPECT_EQ("hello world", response_data);
+
+ HttpStreamFactory::set_next_protos("");
+ HttpStreamFactory::set_use_alternate_protocols(false);
+ HttpStreamFactory::set_create_new_spdy_session_for_http(true);
+}
+
} // namespace net
diff --git a/net/http/http_stream_factory.cc b/net/http/http_stream_factory.cc
index bbe2878..f471a4f 100644
--- a/net/http/http_stream_factory.cc
+++ b/net/http/http_stream_factory.cc
@@ -27,6 +27,8 @@ bool HttpStreamFactory::force_spdy_over_ssl_ = true;
bool HttpStreamFactory::force_spdy_always_ = false;
// static
bool HttpStreamFactory::ignore_certificate_errors_ = false;
+// static
+bool HttpStreamFactory::g_create_new_spdy_session_for_http_ = false;
// static
void HttpStreamFactory::SetHostMappingRules(const std::string& rules) {
@@ -138,4 +140,3 @@ GURL HttpStreamFactory::ApplyHostMappingRules(const GURL& url,
}
} // namespace net
-
diff --git a/net/http/http_stream_factory.h b/net/http/http_stream_factory.h
index 804ef35..db50038 100644
--- a/net/http/http_stream_factory.h
+++ b/net/http/http_stream_factory.h
@@ -89,6 +89,14 @@ class HttpStreamFactory : public StreamFactory,
return ignore_certificate_errors_;
}
+ static void set_create_new_spdy_session_for_http(bool value) {
+ g_create_new_spdy_session_for_http_ = value;
+ }
+
+ static bool create_new_spdy_session_for_http() {
+ return g_create_new_spdy_session_for_http_;
+ }
+
static void SetHostMappingRules(const std::string& rules);
private:
@@ -100,6 +108,7 @@ class HttpStreamFactory : public StreamFactory,
static bool force_spdy_over_ssl_;
static bool force_spdy_always_;
static bool ignore_certificate_errors_;
+ static bool g_create_new_spdy_session_for_http_;
DISALLOW_COPY_AND_ASSIGN(HttpStreamFactory);
};
@@ -107,4 +116,3 @@ class HttpStreamFactory : public StreamFactory,
} // namespace net
#endif // NET_HTTP_HTTP_STREAM_FACTORY_H_
-
diff --git a/net/http/http_stream_request.cc b/net/http/http_stream_request.cc
index 59a7e8c..35832c7 100644
--- a/net/http/http_stream_request.cc
+++ b/net/http/http_stream_request.cc
@@ -422,7 +422,18 @@ int HttpStreamRequest::DoResolveProxyComplete(int result) {
return ERR_NO_SUPPORTED_PROXIES;
}
- next_state_ = STATE_INIT_CONNECTION;
+ HostPortProxyPair pair(endpoint_, proxy_info()->proxy_server());
+ if (!factory_->create_new_spdy_session_for_http() &&
+ alternate_protocol_mode_ == kUsingAlternateProtocol &&
+ !session_->spdy_session_pool()->HasSession(pair)) {
+ // If we don't already have a SpdySession, then don't pay the SSL handshake
+ // cost of setup. Just use HTTP.
+ next_state_ = STATE_RESOLVE_PROXY;
+ alternate_protocol_mode_ = kDoNotUseAlternateProtocol;
+ } else {
+ next_state_ = STATE_INIT_CONNECTION;
+ }
+
return OK;
}