| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/glue/proxy_resolving_client_socket.h" | 5 #include "jingle/glue/proxy_resolving_client_socket.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 connect_callback_( | 37 connect_callback_( |
| 38 base::Bind(&ProxyResolvingClientSocket::ProcessConnectDone, | 38 base::Bind(&ProxyResolvingClientSocket::ProcessConnectDone, |
| 39 base::Unretained(this))), | 39 base::Unretained(this))), |
| 40 ssl_config_(ssl_config), | 40 ssl_config_(ssl_config), |
| 41 pac_request_(NULL), | 41 pac_request_(NULL), |
| 42 dest_host_port_pair_(dest_host_port_pair), | 42 dest_host_port_pair_(dest_host_port_pair), |
| 43 // Assume that we intend to do TLS on this socket; all | 43 // Assume that we intend to do TLS on this socket; all |
| 44 // current use cases do. | 44 // current use cases do. |
| 45 proxy_url_("https://" + dest_host_port_pair_.ToString()), | 45 proxy_url_("https://" + dest_host_port_pair_.ToString()), |
| 46 tried_direct_connect_fallback_(false), | 46 tried_direct_connect_fallback_(false), |
| 47 bound_net_log_(net::BoundNetLog::Make( | 47 net_log_(net::NetLogWithSource::Make( |
| 48 request_context_getter->GetURLRequestContext()->net_log(), | 48 request_context_getter->GetURLRequestContext()->net_log(), |
| 49 net::NetLogSourceType::SOCKET)), | 49 net::NetLogSourceType::SOCKET)), |
| 50 weak_factory_(this) { | 50 weak_factory_(this) { |
| 51 DCHECK(request_context_getter.get()); | 51 DCHECK(request_context_getter.get()); |
| 52 net::URLRequestContext* request_context = | 52 net::URLRequestContext* request_context = |
| 53 request_context_getter->GetURLRequestContext(); | 53 request_context_getter->GetURLRequestContext(); |
| 54 DCHECK(request_context); | 54 DCHECK(request_context); |
| 55 DCHECK(!dest_host_port_pair_.host().empty()); | 55 DCHECK(!dest_host_port_pair_.host().empty()); |
| 56 DCHECK_GT(dest_host_port_pair_.port(), 0); | 56 DCHECK_GT(dest_host_port_pair_.port(), 0); |
| 57 DCHECK(proxy_url_.is_valid()); | 57 DCHECK(proxy_url_.is_valid()); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 tried_direct_connect_fallback_ = false; | 140 tried_direct_connect_fallback_ = false; |
| 141 | 141 |
| 142 // First we try and resolve the proxy. | 142 // First we try and resolve the proxy. |
| 143 int status = network_session_->proxy_service()->ResolveProxy( | 143 int status = network_session_->proxy_service()->ResolveProxy( |
| 144 proxy_url_, | 144 proxy_url_, |
| 145 std::string(), | 145 std::string(), |
| 146 &proxy_info_, | 146 &proxy_info_, |
| 147 proxy_resolve_callback_, | 147 proxy_resolve_callback_, |
| 148 &pac_request_, | 148 &pac_request_, |
| 149 NULL, | 149 NULL, |
| 150 bound_net_log_); | 150 net_log_); |
| 151 if (status != net::ERR_IO_PENDING) { | 151 if (status != net::ERR_IO_PENDING) { |
| 152 // We defer execution of ProcessProxyResolveDone instead of calling it | 152 // We defer execution of ProcessProxyResolveDone instead of calling it |
| 153 // directly here for simplicity. From the caller's point of view, | 153 // directly here for simplicity. From the caller's point of view, |
| 154 // the connect always happens asynchronously. | 154 // the connect always happens asynchronously. |
| 155 base::ThreadTaskRunnerHandle::Get()->PostTask( | 155 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 156 FROM_HERE, | 156 FROM_HERE, |
| 157 base::Bind(&ProxyResolvingClientSocket::ProcessProxyResolveDone, | 157 base::Bind(&ProxyResolvingClientSocket::ProcessProxyResolveDone, |
| 158 weak_factory_.GetWeakPtr(), status)); | 158 weak_factory_.GetWeakPtr(), status)); |
| 159 } | 159 } |
| 160 user_connect_callback_ = callback; | 160 user_connect_callback_ = callback; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 CloseTransportSocket(); | 197 CloseTransportSocket(); |
| 198 RunUserConnectCallback(status); | 198 RunUserConnectCallback(status); |
| 199 return; | 199 return; |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 transport_.reset(new net::ClientSocketHandle); | 203 transport_.reset(new net::ClientSocketHandle); |
| 204 // Now that we have resolved the proxy, we need to connect. | 204 // Now that we have resolved the proxy, we need to connect. |
| 205 status = net::InitSocketHandleForRawConnect( | 205 status = net::InitSocketHandleForRawConnect( |
| 206 dest_host_port_pair_, network_session_.get(), proxy_info_, ssl_config_, | 206 dest_host_port_pair_, network_session_.get(), proxy_info_, ssl_config_, |
| 207 ssl_config_, net::PRIVACY_MODE_DISABLED, bound_net_log_, transport_.get(), | 207 ssl_config_, net::PRIVACY_MODE_DISABLED, net_log_, transport_.get(), |
| 208 connect_callback_); | 208 connect_callback_); |
| 209 if (status != net::ERR_IO_PENDING) { | 209 if (status != net::ERR_IO_PENDING) { |
| 210 // Since this method is always called asynchronously. it is OK to call | 210 // Since this method is always called asynchronously. it is OK to call |
| 211 // ProcessConnectDone synchronously. | 211 // ProcessConnectDone synchronously. |
| 212 ProcessConnectDone(status); | 212 ProcessConnectDone(status); |
| 213 } | 213 } |
| 214 } | 214 } |
| 215 | 215 |
| 216 void ProxyResolvingClientSocket::ProcessConnectDone(int status) { | 216 void ProxyResolvingClientSocket::ProcessConnectDone(int status) { |
| 217 if (status != net::OK) { | 217 if (status != net::OK) { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 return error; | 285 return error; |
| 286 } | 286 } |
| 287 | 287 |
| 288 if (proxy_info_.is_https() && ssl_config_.send_client_cert) { | 288 if (proxy_info_.is_https() && ssl_config_.send_client_cert) { |
| 289 network_session_->ssl_client_auth_cache()->Remove( | 289 network_session_->ssl_client_auth_cache()->Remove( |
| 290 proxy_info_.proxy_server().host_port_pair()); | 290 proxy_info_.proxy_server().host_port_pair()); |
| 291 } | 291 } |
| 292 | 292 |
| 293 int rv = network_session_->proxy_service()->ReconsiderProxyAfterError( | 293 int rv = network_session_->proxy_service()->ReconsiderProxyAfterError( |
| 294 proxy_url_, std::string(), error, &proxy_info_, proxy_resolve_callback_, | 294 proxy_url_, std::string(), error, &proxy_info_, proxy_resolve_callback_, |
| 295 &pac_request_, NULL, bound_net_log_); | 295 &pac_request_, NULL, net_log_); |
| 296 if (rv == net::OK || rv == net::ERR_IO_PENDING) { | 296 if (rv == net::OK || rv == net::ERR_IO_PENDING) { |
| 297 CloseTransportSocket(); | 297 CloseTransportSocket(); |
| 298 } else { | 298 } else { |
| 299 // If ReconsiderProxyAfterError() failed synchronously, it means | 299 // If ReconsiderProxyAfterError() failed synchronously, it means |
| 300 // there was nothing left to fall-back to, so fail the transaction | 300 // there was nothing left to fall-back to, so fail the transaction |
| 301 // with the last connection error we got. | 301 // with the last connection error we got. |
| 302 rv = error; | 302 rv = error; |
| 303 } | 303 } |
| 304 | 304 |
| 305 // We either have new proxy info or there was an error in falling back. | 305 // We either have new proxy info or there was an error in falling back. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 } | 363 } |
| 364 | 364 |
| 365 int ProxyResolvingClientSocket::GetLocalAddress( | 365 int ProxyResolvingClientSocket::GetLocalAddress( |
| 366 net::IPEndPoint* address) const { | 366 net::IPEndPoint* address) const { |
| 367 if (transport_.get() && transport_->socket()) | 367 if (transport_.get() && transport_->socket()) |
| 368 return transport_->socket()->GetLocalAddress(address); | 368 return transport_->socket()->GetLocalAddress(address); |
| 369 NOTREACHED(); | 369 NOTREACHED(); |
| 370 return net::ERR_SOCKET_NOT_CONNECTED; | 370 return net::ERR_SOCKET_NOT_CONNECTED; |
| 371 } | 371 } |
| 372 | 372 |
| 373 const net::BoundNetLog& ProxyResolvingClientSocket::NetLog() const { | 373 const net::NetLogWithSource& ProxyResolvingClientSocket::NetLog() const { |
| 374 if (transport_.get() && transport_->socket()) | 374 if (transport_.get() && transport_->socket()) |
| 375 return transport_->socket()->NetLog(); | 375 return transport_->socket()->NetLog(); |
| 376 NOTREACHED(); | 376 NOTREACHED(); |
| 377 return bound_net_log_; | 377 return net_log_; |
| 378 } | 378 } |
| 379 | 379 |
| 380 void ProxyResolvingClientSocket::SetSubresourceSpeculation() { | 380 void ProxyResolvingClientSocket::SetSubresourceSpeculation() { |
| 381 if (transport_.get() && transport_->socket()) | 381 if (transport_.get() && transport_->socket()) |
| 382 transport_->socket()->SetSubresourceSpeculation(); | 382 transport_->socket()->SetSubresourceSpeculation(); |
| 383 else | 383 else |
| 384 NOTREACHED(); | 384 NOTREACHED(); |
| 385 } | 385 } |
| 386 | 386 |
| 387 void ProxyResolvingClientSocket::SetOmniboxSpeculation() { | 387 void ProxyResolvingClientSocket::SetOmniboxSpeculation() { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 return 0; | 423 return 0; |
| 424 } | 424 } |
| 425 | 425 |
| 426 void ProxyResolvingClientSocket::CloseTransportSocket() { | 426 void ProxyResolvingClientSocket::CloseTransportSocket() { |
| 427 if (transport_.get() && transport_->socket()) | 427 if (transport_.get() && transport_->socket()) |
| 428 transport_->socket()->Disconnect(); | 428 transport_->socket()->Disconnect(); |
| 429 transport_.reset(); | 429 transport_.reset(); |
| 430 } | 430 } |
| 431 | 431 |
| 432 } // namespace jingle_glue | 432 } // namespace jingle_glue |
| OLD | NEW |