diff options
author | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-16 09:50:54 +0000 |
---|---|---|
committer | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-16 09:50:54 +0000 |
commit | 74d49879e7eb6445a87bf3be66413e6488c55b2a (patch) | |
tree | 6837f466c99f16b514a033111d6c923a43778393 /net/socket_stream | |
parent | 60998a63d2c655414391ed7da9d0dc944c72d043 (diff) | |
download | chromium_src-74d49879e7eb6445a87bf3be66413e6488c55b2a.zip chromium_src-74d49879e7eb6445a87bf3be66413e6488c55b2a.tar.gz chromium_src-74d49879e7eb6445a87bf3be66413e6488c55b2a.tar.bz2 |
Try https proxy for websocket connection.
Safari always uses "https" to get proxies for websocket connection,
so chrome also tries it as well.
Fix url replacement failure.
We should use std::string instead of char[].
BUG=none
TEST=net_unittests passes
Review URL: http://codereview.chromium.org/397008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32050 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket_stream')
-rw-r--r-- | net/socket_stream/socket_stream.cc | 18 | ||||
-rw-r--r-- | net/socket_stream/socket_stream.h | 1 |
2 files changed, 18 insertions, 1 deletions
diff --git a/net/socket_stream/socket_stream.cc b/net/socket_stream/socket_stream.cc index 7227fe9..98807f3 100644 --- a/net/socket_stream/socket_stream.cc +++ b/net/socket_stream/socket_stream.cc @@ -47,6 +47,7 @@ SocketStream::SocketStream(const GURL& url, Delegate* delegate) next_state_(STATE_NONE), factory_(ClientSocketFactory::GetDefaultFactory()), proxy_mode_(kDirectConnection), + proxy_url_(url), pac_request_(NULL), ALLOW_THIS_IN_INITIALIZER_LIST( io_callback_(this, &SocketStream::OnIOCompleted)), @@ -414,7 +415,7 @@ int SocketStream::DoResolveProxy() { next_state_ = STATE_RESOLVE_PROXY_COMPLETE; return proxy_service()->ResolveProxy( - url_, &proxy_info_, &io_callback_, &pac_request_, load_log_); + proxy_url_, &proxy_info_, &io_callback_, &pac_request_, load_log_); } int SocketStream::DoResolveProxyComplete(int result) { @@ -427,6 +428,21 @@ int SocketStream::DoResolveProxyComplete(int result) { delegate_->OnError(this, result); proxy_info_.UseDirect(); } + if (proxy_info_.is_direct()) { + // If proxy was not found for original URL (i.e. websocket URL), + // try again with https URL, like Safari implementation. + // Note that we don't want to use http proxy, because we'll use tunnel + // proxy using CONNECT method, which is used by https proxy. + if (!proxy_url_.SchemeIs("https")) { + const std::string scheme = "https"; + GURL::Replacements repl; + repl.SetSchemeStr(scheme); + proxy_url_ = url_.ReplaceComponents(repl); + DLOG(INFO) << "Try https proxy: " << proxy_url_; + next_state_ = STATE_RESOLVE_PROXY; + return OK; + } + } return OK; } diff --git a/net/socket_stream/socket_stream.h b/net/socket_stream/socket_stream.h index f6ac674..cf6a6b0 100644 --- a/net/socket_stream/socket_stream.h +++ b/net/socket_stream/socket_stream.h @@ -270,6 +270,7 @@ class SocketStream : public base::RefCountedThreadSafe<SocketStream> { ProxyMode proxy_mode_; + GURL proxy_url_; ProxyService::PacRequest* pac_request_; ProxyInfo proxy_info_; |