| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "jingle/notifier/base/proxy_resolving_client_socket.h" | 5 #include "jingle/notifier/base/proxy_resolving_client_socket.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 connect_callback_(ALLOW_THIS_IN_INITIALIZER_LIST(this), | 29 connect_callback_(ALLOW_THIS_IN_INITIALIZER_LIST(this), |
| 30 &ProxyResolvingClientSocket::ProcessConnectDone), | 30 &ProxyResolvingClientSocket::ProcessConnectDone), |
| 31 ssl_config_(ssl_config), | 31 ssl_config_(ssl_config), |
| 32 pac_request_(NULL), | 32 pac_request_(NULL), |
| 33 dest_host_port_pair_(dest_host_port_pair), | 33 dest_host_port_pair_(dest_host_port_pair), |
| 34 tried_direct_connect_fallback_(false), | 34 tried_direct_connect_fallback_(false), |
| 35 bound_net_log_( | 35 bound_net_log_( |
| 36 net::BoundNetLog::Make( | 36 net::BoundNetLog::Make( |
| 37 request_context_getter->GetURLRequestContext()->net_log(), | 37 request_context_getter->GetURLRequestContext()->net_log(), |
| 38 net::NetLog::SOURCE_SOCKET)), | 38 net::NetLog::SOURCE_SOCKET)), |
| 39 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), | 39 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
| 40 old_user_connect_callback_(NULL) { | |
| 41 DCHECK(request_context_getter); | 40 DCHECK(request_context_getter); |
| 42 net::URLRequestContext* request_context = | 41 net::URLRequestContext* request_context = |
| 43 request_context_getter->GetURLRequestContext(); | 42 request_context_getter->GetURLRequestContext(); |
| 44 DCHECK(request_context); | 43 DCHECK(request_context); |
| 45 net::HttpNetworkSession::Params session_params; | 44 net::HttpNetworkSession::Params session_params; |
| 46 session_params.client_socket_factory = socket_factory; | 45 session_params.client_socket_factory = socket_factory; |
| 47 session_params.host_resolver = request_context->host_resolver(); | 46 session_params.host_resolver = request_context->host_resolver(); |
| 48 session_params.cert_verifier = request_context->cert_verifier(); | 47 session_params.cert_verifier = request_context->cert_verifier(); |
| 49 // TODO(rkn): This is NULL because OriginBoundCertService is not thread safe. | 48 // TODO(rkn): This is NULL because OriginBoundCertService is not thread safe. |
| 50 session_params.origin_bound_cert_service = NULL; | 49 session_params.origin_bound_cert_service = NULL; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 61 request_context->http_server_properties(); | 60 request_context->http_server_properties(); |
| 62 session_params.net_log = request_context->net_log(); | 61 session_params.net_log = request_context->net_log(); |
| 63 network_session_ = new net::HttpNetworkSession(session_params); | 62 network_session_ = new net::HttpNetworkSession(session_params); |
| 64 } | 63 } |
| 65 | 64 |
| 66 ProxyResolvingClientSocket::~ProxyResolvingClientSocket() { | 65 ProxyResolvingClientSocket::~ProxyResolvingClientSocket() { |
| 67 Disconnect(); | 66 Disconnect(); |
| 68 } | 67 } |
| 69 | 68 |
| 70 int ProxyResolvingClientSocket::Read(net::IOBuffer* buf, int buf_len, | 69 int ProxyResolvingClientSocket::Read(net::IOBuffer* buf, int buf_len, |
| 71 net::OldCompletionCallback* callback) { | |
| 72 if (transport_.get() && transport_->socket()) | |
| 73 return transport_->socket()->Read(buf, buf_len, callback); | |
| 74 NOTREACHED(); | |
| 75 return net::ERR_SOCKET_NOT_CONNECTED; | |
| 76 } | |
| 77 int ProxyResolvingClientSocket::Read(net::IOBuffer* buf, int buf_len, | |
| 78 const net::CompletionCallback& callback) { | 70 const net::CompletionCallback& callback) { |
| 79 if (transport_.get() && transport_->socket()) | 71 if (transport_.get() && transport_->socket()) |
| 80 return transport_->socket()->Read(buf, buf_len, callback); | 72 return transport_->socket()->Read(buf, buf_len, callback); |
| 81 NOTREACHED(); | 73 NOTREACHED(); |
| 82 return net::ERR_SOCKET_NOT_CONNECTED; | 74 return net::ERR_SOCKET_NOT_CONNECTED; |
| 83 } | 75 } |
| 84 | 76 |
| 85 int ProxyResolvingClientSocket::Write(net::IOBuffer* buf, int buf_len, | 77 int ProxyResolvingClientSocket::Write( |
| 86 net::OldCompletionCallback* callback) { | 78 net::IOBuffer* buf, |
| 79 int buf_len, |
| 80 const net::CompletionCallback& callback) { |
| 87 if (transport_.get() && transport_->socket()) | 81 if (transport_.get() && transport_->socket()) |
| 88 return transport_->socket()->Write(buf, buf_len, callback); | 82 return transport_->socket()->Write(buf, buf_len, callback); |
| 89 NOTREACHED(); | 83 NOTREACHED(); |
| 90 return net::ERR_SOCKET_NOT_CONNECTED; | 84 return net::ERR_SOCKET_NOT_CONNECTED; |
| 91 } | 85 } |
| 92 | 86 |
| 93 bool ProxyResolvingClientSocket::SetReceiveBufferSize(int32 size) { | 87 bool ProxyResolvingClientSocket::SetReceiveBufferSize(int32 size) { |
| 94 if (transport_.get() && transport_->socket()) | 88 if (transport_.get() && transport_->socket()) |
| 95 return transport_->socket()->SetReceiveBufferSize(size); | 89 return transport_->socket()->SetReceiveBufferSize(size); |
| 96 NOTREACHED(); | 90 NOTREACHED(); |
| 97 return false; | 91 return false; |
| 98 } | 92 } |
| 99 | 93 |
| 100 bool ProxyResolvingClientSocket::SetSendBufferSize(int32 size) { | 94 bool ProxyResolvingClientSocket::SetSendBufferSize(int32 size) { |
| 101 if (transport_.get() && transport_->socket()) | 95 if (transport_.get() && transport_->socket()) |
| 102 return transport_->socket()->SetSendBufferSize(size); | 96 return transport_->socket()->SetSendBufferSize(size); |
| 103 NOTREACHED(); | 97 NOTREACHED(); |
| 104 return false; | 98 return false; |
| 105 } | 99 } |
| 106 | 100 |
| 107 int ProxyResolvingClientSocket::Connect(net::OldCompletionCallback* callback) { | 101 int ProxyResolvingClientSocket::Connect( |
| 108 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 102 const net::CompletionCallback& callback) { |
| 103 DCHECK(user_connect_callback_.is_null()); |
| 109 | 104 |
| 110 tried_direct_connect_fallback_ = false; | 105 tried_direct_connect_fallback_ = false; |
| 111 | 106 |
| 112 // First we try and resolve the proxy. | |
| 113 GURL url("http://" + dest_host_port_pair_.ToString()); | |
| 114 int status = network_session_->proxy_service()->ResolveProxy( | |
| 115 url, | |
| 116 &proxy_info_, | |
| 117 &proxy_resolve_callback_, | |
| 118 &pac_request_, | |
| 119 bound_net_log_); | |
| 120 if (status != net::ERR_IO_PENDING) { | |
| 121 // We defer execution of ProcessProxyResolveDone instead of calling it | |
| 122 // directly here for simplicity. From the caller's point of view, | |
| 123 // the connect always happens asynchronously. | |
| 124 MessageLoop* message_loop = MessageLoop::current(); | |
| 125 CHECK(message_loop); | |
| 126 message_loop->PostTask( | |
| 127 FROM_HERE, | |
| 128 base::Bind(&ProxyResolvingClientSocket::ProcessProxyResolveDone, | |
| 129 weak_factory_.GetWeakPtr(), status)); | |
| 130 } | |
| 131 old_user_connect_callback_ = callback; | |
| 132 return net::ERR_IO_PENDING; | |
| 133 } | |
| 134 int ProxyResolvingClientSocket::Connect( | |
| 135 const net::CompletionCallback& callback) { | |
| 136 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
| 137 | |
| 138 tried_direct_connect_fallback_ = false; | |
| 139 | |
| 140 // First we try and resolve the proxy. | 107 // First we try and resolve the proxy. |
| 141 GURL url("http://" + dest_host_port_pair_.ToString()); | 108 GURL url("http://" + dest_host_port_pair_.ToString()); |
| 142 int status = network_session_->proxy_service()->ResolveProxy( | 109 int status = network_session_->proxy_service()->ResolveProxy( |
| 143 url, | 110 url, |
| 144 &proxy_info_, | 111 &proxy_info_, |
| 145 &proxy_resolve_callback_, | 112 &proxy_resolve_callback_, |
| 146 &pac_request_, | 113 &pac_request_, |
| 147 bound_net_log_); | 114 bound_net_log_); |
| 148 if (status != net::ERR_IO_PENDING) { | 115 if (status != net::ERR_IO_PENDING) { |
| 149 // We defer execution of ProcessProxyResolveDone instead of calling it | 116 // We defer execution of ProcessProxyResolveDone instead of calling it |
| 150 // directly here for simplicity. From the caller's point of view, | 117 // directly here for simplicity. From the caller's point of view, |
| 151 // the connect always happens asynchronously. | 118 // the connect always happens asynchronously. |
| 152 MessageLoop* message_loop = MessageLoop::current(); | 119 MessageLoop* message_loop = MessageLoop::current(); |
| 153 CHECK(message_loop); | 120 CHECK(message_loop); |
| 154 message_loop->PostTask( | 121 message_loop->PostTask( |
| 155 FROM_HERE, | 122 FROM_HERE, |
| 156 base::Bind(&ProxyResolvingClientSocket::ProcessProxyResolveDone, | 123 base::Bind(&ProxyResolvingClientSocket::ProcessProxyResolveDone, |
| 157 weak_factory_.GetWeakPtr(), status)); | 124 weak_factory_.GetWeakPtr(), status)); |
| 158 } | 125 } |
| 159 user_connect_callback_ = callback; | 126 user_connect_callback_ = callback; |
| 160 return net::ERR_IO_PENDING; | 127 return net::ERR_IO_PENDING; |
| 161 } | 128 } |
| 162 | 129 |
| 163 void ProxyResolvingClientSocket::RunUserConnectCallback(int status) { | 130 void ProxyResolvingClientSocket::RunUserConnectCallback(int status) { |
| 164 DCHECK_LE(status, net::OK); | 131 DCHECK_LE(status, net::OK); |
| 165 if (old_user_connect_callback_) { | 132 net::CompletionCallback user_connect_callback = user_connect_callback_; |
| 166 net::OldCompletionCallback* user_connect_callback = | 133 user_connect_callback_.Reset(); |
| 167 old_user_connect_callback_; | 134 user_connect_callback.Run(status); |
| 168 old_user_connect_callback_ = NULL; | |
| 169 user_connect_callback->Run(status); | |
| 170 } else { | |
| 171 net::CompletionCallback user_connect_callback = user_connect_callback_; | |
| 172 user_connect_callback_.Reset(); | |
| 173 user_connect_callback.Run(status); | |
| 174 } | |
| 175 } | 135 } |
| 176 | 136 |
| 177 // Always runs asynchronously. | 137 // Always runs asynchronously. |
| 178 void ProxyResolvingClientSocket::ProcessProxyResolveDone(int status) { | 138 void ProxyResolvingClientSocket::ProcessProxyResolveDone(int status) { |
| 179 pac_request_ = NULL; | 139 pac_request_ = NULL; |
| 180 | 140 |
| 181 DCHECK_NE(status, net::ERR_IO_PENDING); | 141 DCHECK_NE(status, net::ERR_IO_PENDING); |
| 182 if (status == net::OK) { | 142 if (status == net::OK) { |
| 183 // Remove unsupported proxies from the list. | 143 // Remove unsupported proxies from the list. |
| 184 proxy_info_.RemoveProxiesWithoutScheme( | 144 proxy_info_.RemoveProxiesWithoutScheme( |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 } | 283 } |
| 324 | 284 |
| 325 void ProxyResolvingClientSocket::ReportSuccessfulProxyConnection() { | 285 void ProxyResolvingClientSocket::ReportSuccessfulProxyConnection() { |
| 326 network_session_->proxy_service()->ReportSuccess(proxy_info_); | 286 network_session_->proxy_service()->ReportSuccess(proxy_info_); |
| 327 } | 287 } |
| 328 | 288 |
| 329 void ProxyResolvingClientSocket::Disconnect() { | 289 void ProxyResolvingClientSocket::Disconnect() { |
| 330 CloseTransportSocket(); | 290 CloseTransportSocket(); |
| 331 if (pac_request_) | 291 if (pac_request_) |
| 332 network_session_->proxy_service()->CancelPacRequest(pac_request_); | 292 network_session_->proxy_service()->CancelPacRequest(pac_request_); |
| 333 old_user_connect_callback_ = NULL; | |
| 334 user_connect_callback_.Reset(); | 293 user_connect_callback_.Reset(); |
| 335 } | 294 } |
| 336 | 295 |
| 337 bool ProxyResolvingClientSocket::IsConnected() const { | 296 bool ProxyResolvingClientSocket::IsConnected() const { |
| 338 if (!transport_.get() || !transport_->socket()) | 297 if (!transport_.get() || !transport_->socket()) |
| 339 return false; | 298 return false; |
| 340 return transport_->socket()->IsConnected(); | 299 return transport_->socket()->IsConnected(); |
| 341 } | 300 } |
| 342 | 301 |
| 343 bool ProxyResolvingClientSocket::IsConnectedAndIdle() const { | 302 bool ProxyResolvingClientSocket::IsConnectedAndIdle() const { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 return base::TimeDelta::FromMicroseconds(-1); | 370 return base::TimeDelta::FromMicroseconds(-1); |
| 412 } | 371 } |
| 413 | 372 |
| 414 void ProxyResolvingClientSocket::CloseTransportSocket() { | 373 void ProxyResolvingClientSocket::CloseTransportSocket() { |
| 415 if (transport_.get() && transport_->socket()) | 374 if (transport_.get() && transport_->socket()) |
| 416 transport_->socket()->Disconnect(); | 375 transport_->socket()->Disconnect(); |
| 417 transport_.reset(); | 376 transport_.reset(); |
| 418 } | 377 } |
| 419 | 378 |
| 420 } // namespace notifier | 379 } // namespace notifier |
| OLD | NEW |