summaryrefslogtreecommitdiffstats
path: root/net/socket_stream
diff options
context:
space:
mode:
authorukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-16 09:50:54 +0000
committerukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-16 09:50:54 +0000
commit74d49879e7eb6445a87bf3be66413e6488c55b2a (patch)
tree6837f466c99f16b514a033111d6c923a43778393 /net/socket_stream
parent60998a63d2c655414391ed7da9d0dc944c72d043 (diff)
downloadchromium_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.cc18
-rw-r--r--net/socket_stream/socket_stream.h1
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_;