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 3 // found in the LICENSE file. 4 // 5 // TODO(ukai): code is similar with http_network_transaction.cc. We should 6 // think about ways to share code, if possible. 7 8 #include "net/socket_stream/socket_stream.h" 9 10 #include <set> 11 #include <string> 12 #include <vector> 13 14 #include "base/bind.h" 15 #include "base/bind_helpers.h" 16 #include "base/compiler_specific.h" 17 #include "base/logging.h" 18 #include "base/message_loop/message_loop.h" 19 #include "base/strings/string_util.h" 20 #include "base/strings/stringprintf.h" 21 #include "base/strings/utf_string_conversions.h" 22 #include "net/base/auth.h" 23 #include "net/base/io_buffer.h" 24 #include "net/base/load_flags.h" 25 #include "net/base/net_errors.h" 26 #include "net/base/net_util.h" 27 #include "net/dns/host_resolver.h" 28 #include "net/http/http_auth_controller.h" 29 #include "net/http/http_network_session.h" 30 #include "net/http/http_request_headers.h" 31 #include "net/http/http_request_info.h" 32 #include "net/http/http_response_headers.h" 33 #include "net/http/http_stream_factory.h" 34 #include "net/http/http_transaction_factory.h" 35 #include "net/http/http_util.h" 36 #include "net/socket/client_socket_factory.h" 37 #include "net/socket/client_socket_handle.h" 38 #include "net/socket/socks5_client_socket.h" 39 #include "net/socket/socks_client_socket.h" 40 #include "net/socket/ssl_client_socket.h" 41 #include "net/socket/tcp_client_socket.h" 42 #include "net/socket_stream/socket_stream_metrics.h" 43 #include "net/ssl/ssl_cert_request_info.h" 44 #include "net/ssl/ssl_info.h" 45 #include "net/url_request/url_request.h" 46 #include "net/url_request/url_request_context.h" 47 48 static const int kMaxPendingSendAllowed = 32768; // 32 kilobytes. 49 static const int kReadBufferSize = 4096; 50 51 namespace net { 52 53 int SocketStream::Delegate::OnStartOpenConnection( 54 SocketStream* socket, const CompletionCallback& callback) { 55 return OK; 56 } 57 58 void SocketStream::Delegate::OnAuthRequired(SocketStream* socket, 59 AuthChallengeInfo* auth_info) { 60 // By default, no credential is available and close the connection. 61 socket->Close(); 62 } 63 64 void SocketStream::Delegate::OnSSLCertificateError( 65 SocketStream* socket, 66 const SSLInfo& ssl_info, 67 bool fatal) { 68 socket->CancelWithSSLError(ssl_info); 69 } 70 71 bool SocketStream::Delegate::CanGetCookies(SocketStream* socket, 72 const GURL& url) { 73 return true; 74 } 75 76 bool SocketStream::Delegate::CanSetCookie(SocketStream* request, 77 const GURL& url, 78 const std::string& cookie_line, 79 CookieOptions* options) { 80 return true; 81 } 82 83 SocketStream::ResponseHeaders::ResponseHeaders() : IOBuffer() {} 84 85 void SocketStream::ResponseHeaders::Realloc(size_t new_size) { 86 headers_.reset(static_cast<char*>(realloc(headers_.release(), new_size))); 87 } 88 89 SocketStream::ResponseHeaders::~ResponseHeaders() { data_ = NULL; } 90 91 SocketStream::SocketStream(const GURL& url, Delegate* delegate, 92 URLRequestContext* context, 93 CookieStore* cookie_store) 94 : delegate_(delegate), 95 url_(url), 96 max_pending_send_allowed_(kMaxPendingSendAllowed), 97 context_(context), 98 next_state_(STATE_NONE), 99 factory_(ClientSocketFactory::GetDefaultFactory()), 100 proxy_mode_(kDirectConnection), 101 proxy_url_(url), 102 pac_request_(NULL), 103 connection_(new ClientSocketHandle), 104 privacy_mode_(PRIVACY_MODE_DISABLED), 105 // Unretained() is required; without it, Bind() creates a circular 106 // dependency and the SocketStream object will not be freed. 107 io_callback_(base::Bind(&SocketStream::OnIOCompleted, 108 base::Unretained(this))), 109 read_buf_(NULL), 110 current_write_buf_(NULL), 111 waiting_for_write_completion_(false), 112 closing_(false), 113 server_closed_(false), 114 metrics_(new SocketStreamMetrics(url)), 115 cookie_store_(cookie_store) { 116 DCHECK(base::MessageLoop::current()) 117 << "The current base::MessageLoop must exist"; 118 DCHECK(base::MessageLoopForIO::IsCurrent()) 119 << "The current base::MessageLoop must be TYPE_IO"; 120 DCHECK(delegate_); 121 122 if (context_) { 123 if (!cookie_store_.get()) 124 cookie_store_ = context_->cookie_store(); 125 126 net_log_ = BoundNetLog::Make( 127 context->net_log(), 128 NetLog::SOURCE_SOCKET_STREAM); 129 130 net_log_.BeginEvent(NetLog::TYPE_REQUEST_ALIVE); 131 } 132 } 133 134 SocketStream::UserData* SocketStream::GetUserData( 135 const void* key) const { 136 UserDataMap::const_iterator found = user_data_.find(key); 137 if (found != user_data_.end()) 138 return found->second.get(); 139 return NULL; 140 } 141 142 void SocketStream::SetUserData(const void* key, UserData* data) { 143 user_data_[key] = linked_ptr<UserData>(data); 144 } 145 146 bool SocketStream::is_secure() const { 147 return url_.SchemeIs("wss"); 148 } 149 150 void SocketStream::DetachContext() { 151 if (!context_) 152 return; 153 154 if (pac_request_) { 155 context_->proxy_service()->CancelPacRequest(pac_request_); 156 pac_request_ = NULL; 157 } 158 159 net_log_.EndEvent(NetLog::TYPE_REQUEST_ALIVE); 160 net_log_ = BoundNetLog(); 161 162 context_ = NULL; 163 cookie_store_ = NULL; 164 } 165 166 void SocketStream::CheckPrivacyMode() { 167 if (context_ && context_->network_delegate()) { 168 bool enable = context_->network_delegate()->CanEnablePrivacyMode(url_, 169 url_); 170 privacy_mode_ = enable ? PRIVACY_MODE_ENABLED : PRIVACY_MODE_DISABLED; 171 // Disable Channel ID if privacy mode is enabled. 172 if (enable) 173 server_ssl_config_.channel_id_enabled = false; 174 } 175 } 176 177 void SocketStream::Connect() { 178 DCHECK(base::MessageLoop::current()) 179 << "The current base::MessageLoop must exist"; 180 DCHECK(base::MessageLoopForIO::IsCurrent()) 181 << "The current base::MessageLoop must be TYPE_IO"; 182 if (context_) { 183 context_->ssl_config_service()->GetSSLConfig(&server_ssl_config_); 184 proxy_ssl_config_ = server_ssl_config_; 185 } 186 CheckPrivacyMode(); 187 188 DCHECK_EQ(next_state_, STATE_NONE); 189 190 AddRef(); // Released in Finish() 191 // Open a connection asynchronously, so that delegate won't be called 192 // back before returning Connect(). 193 next_state_ = STATE_BEFORE_CONNECT; 194 net_log_.BeginEvent( 195 NetLog::TYPE_SOCKET_STREAM_CONNECT, 196 NetLog::StringCallback("url", &url_.possibly_invalid_spec())); 197 base::MessageLoop::current()->PostTask( 198 FROM_HERE, base::Bind(&SocketStream::DoLoop, this, OK)); 199 } 200 201 size_t SocketStream::GetTotalSizeOfPendingWriteBufs() const { 202 size_t total_size = 0; 203 for (PendingDataQueue::const_iterator iter = pending_write_bufs_.begin(); 204 iter != pending_write_bufs_.end(); 205 ++iter) 206 total_size += (*iter)->size(); 207 return total_size; 208 } 209 210 bool SocketStream::SendData(const char* data, int len) { 211 DCHECK(base::MessageLoop::current()) 212 << "The current base::MessageLoop must exist"; 213 DCHECK(base::MessageLoopForIO::IsCurrent()) 214 << "The current base::MessageLoop must be TYPE_IO"; 215 DCHECK_GT(len, 0); 216 217 if (!connection_->socket() || 218 !connection_->socket()->IsConnected() || next_state_ == STATE_NONE) { 219 return false; 220 } 221 222 int total_buffered_bytes = len; 223 if (current_write_buf_.get()) { 224 // Since 225 // - the purpose of this check is to limit the amount of buffer used by 226 // this instance. 227 // - the DrainableIOBuffer doesn't release consumed memory. 228 // we need to use not BytesRemaining() but size() here. 229 total_buffered_bytes += current_write_buf_->size(); 230 } 231 total_buffered_bytes += GetTotalSizeOfPendingWriteBufs(); 232 if (total_buffered_bytes > max_pending_send_allowed_) 233 return false; 234 235 // TODO(tyoshino): Split data into smaller chunks e.g. 8KiB to free consumed 236 // buffer progressively 237 pending_write_bufs_.push_back(make_scoped_refptr( 238 new IOBufferWithSize(len))); 239 memcpy(pending_write_bufs_.back()->data(), data, len); 240 241 // If current_write_buf_ is not NULL, it means that a) there's ongoing write 242 // operation or b) the connection is being closed. If a), the buffer we just 243 // pushed will be automatically handled when the completion callback runs 244 // the loop, and therefore we don't need to enqueue DoLoop(). If b), it's ok 245 // to do nothing. If current_write_buf_ is NULL, to make sure DoLoop() is 246 // ran soon, enequeue it. 247 if (!current_write_buf_.get()) { 248 // Send pending data asynchronously, so that delegate won't be called 249 // back before returning from SendData(). 250 base::MessageLoop::current()->PostTask( 251 FROM_HERE, base::Bind(&SocketStream::DoLoop, this, OK)); 252 } 253 254 return true; 255 } 256 257 void SocketStream::Close() { 258 DCHECK(base::MessageLoop::current()) 259 << "The current base::MessageLoop must exist"; 260 DCHECK(base::MessageLoopForIO::IsCurrent()) 261 << "The current base::MessageLoop must be TYPE_IO"; 262 // If next_state_ is STATE_NONE, the socket was not opened, or already 263 // closed. So, return immediately. 264 // Otherwise, it might call Finish() more than once, so breaks balance 265 // of AddRef() and Release() in Connect() and Finish(), respectively. 266 if (next_state_ == STATE_NONE) 267 return; 268 base::MessageLoop::current()->PostTask( 269 FROM_HERE, base::Bind(&SocketStream::DoClose, this)); 270 } 271 272 void SocketStream::RestartWithAuth(const AuthCredentials& credentials) { 273 DCHECK(base::MessageLoop::current()) 274 << "The current base::MessageLoop must exist"; 275 DCHECK(base::MessageLoopForIO::IsCurrent()) 276 << "The current base::MessageLoop must be TYPE_IO"; 277 DCHECK(proxy_auth_controller_.get()); 278 if (!connection_->socket()) { 279 DVLOG(1) << "Socket is closed before restarting with auth."; 280 return; 281 } 282 283 proxy_auth_controller_->ResetAuth(credentials); 284 285 base::MessageLoop::current()->PostTask( 286 FROM_HERE, base::Bind(&SocketStream::DoRestartWithAuth, this)); 287 } 288 289 void SocketStream::DetachDelegate() { 290 if (!delegate_) 291 return; 292 delegate_ = NULL; 293 // Prevent the rest of the function from executing if we are being called from 294 // within Finish(). 295 if (next_state_ == STATE_NONE) 296 return; 297 net_log_.AddEvent(NetLog::TYPE_CANCELLED); 298 // We don't need to send pending data when client detach the delegate. 299 pending_write_bufs_.clear(); 300 Close(); 301 } 302 303 const ProxyServer& SocketStream::proxy_server() const { 304 return proxy_info_.proxy_server(); 305 } 306 307 void SocketStream::SetClientSocketFactory( 308 ClientSocketFactory* factory) { 309 DCHECK(factory); 310 factory_ = factory; 311 } 312 313 void SocketStream::CancelWithError(int error) { 314 base::MessageLoop::current()->PostTask( 315 FROM_HERE, base::Bind(&SocketStream::DoLoop, this, error)); 316 } 317 318 void SocketStream::CancelWithSSLError(const SSLInfo& ssl_info) { 319 CancelWithError(MapCertStatusToNetError(ssl_info.cert_status)); 320 } 321 322 void SocketStream::ContinueDespiteError() { 323 base::MessageLoop::current()->PostTask( 324 FROM_HERE, base::Bind(&SocketStream::DoLoop, this, OK)); 325 } 326 327 SocketStream::~SocketStream() { 328 DetachContext(); 329 DCHECK(!delegate_); 330 DCHECK(!pac_request_); 331 } 332 333 SocketStream::RequestHeaders::~RequestHeaders() { data_ = NULL; } 334 335 void SocketStream::set_addresses(const AddressList& addresses) { 336 addresses_ = addresses; 337 } 338 339 void SocketStream::DoClose() { 340 closing_ = true; 341 // If next_state_ is: 342 // - STATE_TCP_CONNECT_COMPLETE, it's waiting other socket establishing 343 // connection. 344 // - STATE_AUTH_REQUIRED, it's waiting for restarting. 345 // - STATE_RESOLVE_PROTOCOL_COMPLETE, it's waiting for delegate_ to finish 346 // OnStartOpenConnection method call 347 // In these states, we'll close the SocketStream now. 348 if (next_state_ == STATE_TCP_CONNECT_COMPLETE || 349 next_state_ == STATE_AUTH_REQUIRED || 350 next_state_ == STATE_RESOLVE_PROTOCOL_COMPLETE) { 351 DoLoop(ERR_ABORTED); 352 return; 353 } 354 // If next_state_ is STATE_READ_WRITE, we'll run DoLoop and close 355 // the SocketStream. 356 // If it's writing now, we should defer the closing after the current 357 // writing is completed. 358 if (next_state_ == STATE_READ_WRITE && !current_write_buf_.get()) 359 DoLoop(ERR_ABORTED); 360 361 // In other next_state_, we'll wait for callback of other APIs, such as 362 // ResolveProxy(). 363 } 364 365 void SocketStream::Finish(int result) { 366 DCHECK(base::MessageLoop::current()) 367 << "The current base::MessageLoop must exist"; 368 DCHECK(base::MessageLoopForIO::IsCurrent()) 369 << "The current base::MessageLoop must be TYPE_IO"; 370 DCHECK_LE(result, OK); 371 if (result == OK) 372 result = ERR_CONNECTION_CLOSED; 373 DCHECK_EQ(next_state_, STATE_NONE); 374 DVLOG(1) << "Finish result=" << ErrorToString(result); 375 376 metrics_->OnClose(); 377 378 if (result != ERR_CONNECTION_CLOSED && delegate_) 379 delegate_->OnError(this, result); 380 if (result != ERR_PROTOCOL_SWITCHED && delegate_) 381 delegate_->OnClose(this); 382 delegate_ = NULL; 383 384 Release(); 385 } 386 387 int SocketStream::DidEstablishConnection() { 388 if (!connection_->socket() || !connection_->socket()->IsConnected()) { 389 next_state_ = STATE_CLOSE; 390 return ERR_CONNECTION_FAILED; 391 } 392 next_state_ = STATE_READ_WRITE; 393 metrics_->OnConnected(); 394 395 net_log_.EndEvent(NetLog::TYPE_SOCKET_STREAM_CONNECT); 396 if (delegate_) 397 delegate_->OnConnected(this, max_pending_send_allowed_); 398 399 return OK; 400 } 401 402 int SocketStream::DidReceiveData(int result) { 403 DCHECK(read_buf_.get()); 404 DCHECK_GT(result, 0); 405 net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_RECEIVED); 406 int len = result; 407 metrics_->OnRead(len); 408 if (delegate_) { 409 // Notify recevied data to delegate. 410 delegate_->OnReceivedData(this, read_buf_->data(), len); 411 } 412 read_buf_ = NULL; 413 return OK; 414 } 415 416 void SocketStream::DidSendData(int result) { 417 DCHECK_GT(result, 0); 418 DCHECK(current_write_buf_.get()); 419 net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_SENT); 420 421 int bytes_sent = result; 422 423 metrics_->OnWrite(bytes_sent); 424 425 current_write_buf_->DidConsume(result); 426 427 if (current_write_buf_->BytesRemaining()) 428 return; 429 430 size_t bytes_freed = current_write_buf_->size(); 431 432 current_write_buf_ = NULL; 433 434 // We freed current_write_buf_ and this instance is now able to accept more 435 // data via SendData() (note that DidConsume() doesn't free consumed memory). 436 // We can tell that to delegate_ by calling OnSentData(). 437 if (delegate_) 438 delegate_->OnSentData(this, bytes_freed); 439 } 440 441 void SocketStream::OnIOCompleted(int result) { 442 DoLoop(result); 443 } 444 445 void SocketStream::OnReadCompleted(int result) { 446 if (result == 0) { 447 // 0 indicates end-of-file, so socket was closed. 448 // Don't close the socket if it's still writing. 449 server_closed_ = true; 450 } else if (result > 0 && read_buf_.get()) { 451 result = DidReceiveData(result); 452 } 453 DoLoop(result); 454 } 455 456 void SocketStream::OnWriteCompleted(int result) { 457 waiting_for_write_completion_ = false; 458 if (result > 0) { 459 DidSendData(result); 460 result = OK; 461 } 462 DoLoop(result); 463 } 464 465 void SocketStream::DoLoop(int result) { 466 if (next_state_ == STATE_NONE) 467 return; 468 469 // If context was not set, close immediately. 470 if (!context_) 471 next_state_ = STATE_CLOSE; 472 473 do { 474 State state = next_state_; 475 next_state_ = STATE_NONE; 476 switch (state) { 477 case STATE_BEFORE_CONNECT: 478 DCHECK_EQ(OK, result); 479 result = DoBeforeConnect(); 480 break; 481 case STATE_BEFORE_CONNECT_COMPLETE: 482 result = DoBeforeConnectComplete(result); 483 break; 484 case STATE_RESOLVE_PROXY: 485 DCHECK_EQ(OK, result); 486 result = DoResolveProxy(); 487 break; 488 case STATE_RESOLVE_PROXY_COMPLETE: 489 result = DoResolveProxyComplete(result); 490 break; 491 case STATE_RESOLVE_HOST: 492 DCHECK_EQ(OK, result); 493 result = DoResolveHost(); 494 break; 495 case STATE_RESOLVE_HOST_COMPLETE: 496 result = DoResolveHostComplete(result); 497 break; 498 case STATE_RESOLVE_PROTOCOL: 499 result = DoResolveProtocol(result); 500 break; 501 case STATE_RESOLVE_PROTOCOL_COMPLETE: 502 result = DoResolveProtocolComplete(result); 503 break; 504 case STATE_TCP_CONNECT: 505 result = DoTcpConnect(result); 506 break; 507 case STATE_TCP_CONNECT_COMPLETE: 508 result = DoTcpConnectComplete(result); 509 break; 510 case STATE_GENERATE_PROXY_AUTH_TOKEN: 511 result = DoGenerateProxyAuthToken(); 512 break; 513 case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE: 514 result = DoGenerateProxyAuthTokenComplete(result); 515 break; 516 case STATE_WRITE_TUNNEL_HEADERS: 517 DCHECK_EQ(OK, result); 518 result = DoWriteTunnelHeaders(); 519 break; 520 case STATE_WRITE_TUNNEL_HEADERS_COMPLETE: 521 result = DoWriteTunnelHeadersComplete(result); 522 break; 523 case STATE_READ_TUNNEL_HEADERS: 524 DCHECK_EQ(OK, result); 525 result = DoReadTunnelHeaders(); 526 break; 527 case STATE_READ_TUNNEL_HEADERS_COMPLETE: 528 result = DoReadTunnelHeadersComplete(result); 529 break; 530 case STATE_SOCKS_CONNECT: 531 DCHECK_EQ(OK, result); 532 result = DoSOCKSConnect(); 533 break; 534 case STATE_SOCKS_CONNECT_COMPLETE: 535 result = DoSOCKSConnectComplete(result); 536 break; 537 case STATE_SECURE_PROXY_CONNECT: 538 DCHECK_EQ(OK, result); 539 result = DoSecureProxyConnect(); 540 break; 541 case STATE_SECURE_PROXY_CONNECT_COMPLETE: 542 result = DoSecureProxyConnectComplete(result); 543 break; 544 case STATE_SECURE_PROXY_HANDLE_CERT_ERROR: 545 result = DoSecureProxyHandleCertError(result); 546 break; 547 case STATE_SECURE_PROXY_HANDLE_CERT_ERROR_COMPLETE: 548 result = DoSecureProxyHandleCertErrorComplete(result); 549 break; 550 case STATE_SSL_CONNECT: 551 DCHECK_EQ(OK, result); 552 result = DoSSLConnect(); 553 break; 554 case STATE_SSL_CONNECT_COMPLETE: 555 result = DoSSLConnectComplete(result); 556 break; 557 case STATE_SSL_HANDLE_CERT_ERROR: 558 result = DoSSLHandleCertError(result); 559 break; 560 case STATE_SSL_HANDLE_CERT_ERROR_COMPLETE: 561 result = DoSSLHandleCertErrorComplete(result); 562 break; 563 case STATE_READ_WRITE: 564 result = DoReadWrite(result); 565 break; 566 case STATE_AUTH_REQUIRED: 567 // It might be called when DoClose is called while waiting in 568 // STATE_AUTH_REQUIRED. 569 Finish(result); 570 return; 571 case STATE_CLOSE: 572 DCHECK_LE(result, OK); 573 Finish(result); 574 return; 575 default: 576 NOTREACHED() << "bad state " << state; 577 Finish(result); 578 return; 579 } 580 if (state == STATE_RESOLVE_PROTOCOL && result == ERR_PROTOCOL_SWITCHED) 581 continue; 582 // If the connection is not established yet and had actual errors, 583 // record the error. In next iteration, it will close the connection. 584 if (state != STATE_READ_WRITE && result < ERR_IO_PENDING) { 585 net_log_.EndEventWithNetErrorCode( 586 NetLog::TYPE_SOCKET_STREAM_CONNECT, result); 587 } 588 } while (result != ERR_IO_PENDING); 589 } 590 591 int SocketStream::DoBeforeConnect() { 592 next_state_ = STATE_BEFORE_CONNECT_COMPLETE; 593 if (!context_ || !context_->network_delegate()) 594 return OK; 595 596 int result = context_->network_delegate()->NotifyBeforeSocketStreamConnect( 597 this, io_callback_); 598 if (result != OK && result != ERR_IO_PENDING) 599 next_state_ = STATE_CLOSE; 600 601 return result; 602 } 603 604 int SocketStream::DoBeforeConnectComplete(int result) { 605 DCHECK_NE(ERR_IO_PENDING, result); 606 607 if (result == OK) 608 next_state_ = STATE_RESOLVE_PROXY; 609 else 610 next_state_ = STATE_CLOSE; 611 612 return result; 613 } 614 615 int SocketStream::DoResolveProxy() { 616 DCHECK(context_); 617 DCHECK(!pac_request_); 618 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; 619 620 if (!proxy_url_.is_valid()) { 621 next_state_ = STATE_CLOSE; 622 return ERR_INVALID_ARGUMENT; 623 } 624 625 // TODO(toyoshim): Check server advertisement of SPDY through the HTTP 626 // Alternate-Protocol header, then switch to SPDY if SPDY is available. 627 // Usually we already have a session to the SPDY server because JavaScript 628 // running WebSocket itself would be served by SPDY. But, in some situation 629 // (E.g. Used by Chrome Extensions or used for cross origin connection), this 630 // connection might be the first one. At that time, we should check 631 // Alternate-Protocol header here for ws:// or TLS NPN extension for wss:// . 632 633 return context_->proxy_service()->ResolveProxy( 634 proxy_url_, net::LOAD_NORMAL, &proxy_info_, io_callback_, &pac_request_, 635 NULL, net_log_); 636 } 637 638 int SocketStream::DoResolveProxyComplete(int result) { 639 pac_request_ = NULL; 640 if (result != OK) { 641 DVLOG(1) << "Failed to resolve proxy: " << result; 642 if (delegate_) 643 delegate_->OnError(this, result); 644 proxy_info_.UseDirect(); 645 } 646 if (proxy_info_.is_direct()) { 647 // If proxy was not found for original URL (i.e. websocket URL), 648 // try again with https URL, like Safari implementation. 649 // Note that we don't want to use http proxy, because we'll use tunnel 650 // proxy using CONNECT method, which is used by https proxy. 651 if (!proxy_url_.SchemeIs("https")) { 652 const std::string scheme = "https"; 653 GURL::Replacements repl; 654 repl.SetSchemeStr(scheme); 655 proxy_url_ = url_.ReplaceComponents(repl); 656 DVLOG(1) << "Try https proxy: " << proxy_url_; 657 next_state_ = STATE_RESOLVE_PROXY; 658 return OK; 659 } 660 } 661 662 if (proxy_info_.is_empty()) { 663 // No proxies/direct to choose from. This happens when we don't support any 664 // of the proxies in the returned list. 665 return ERR_NO_SUPPORTED_PROXIES; 666 } 667 668 next_state_ = STATE_RESOLVE_HOST; 669 return OK; 670 } 671 672 int SocketStream::DoResolveHost() { 673 next_state_ = STATE_RESOLVE_HOST_COMPLETE; 674 675 DCHECK(!proxy_info_.is_empty()); 676 if (proxy_info_.is_direct()) 677 proxy_mode_ = kDirectConnection; 678 else if (proxy_info_.proxy_server().is_socks()) 679 proxy_mode_ = kSOCKSProxy; 680 else 681 proxy_mode_ = kTunnelProxy; 682 683 // Determine the host and port to connect to. 684 HostPortPair host_port_pair; 685 if (proxy_mode_ != kDirectConnection) { 686 host_port_pair = proxy_info_.proxy_server().host_port_pair(); 687 } else { 688 host_port_pair = HostPortPair::FromURL(url_); 689 } 690 691 HostResolver::RequestInfo resolve_info(host_port_pair); 692 693 DCHECK(context_->host_resolver()); 694 resolver_.reset(new SingleRequestHostResolver(context_->host_resolver())); 695 return resolver_->Resolve(resolve_info, 696 DEFAULT_PRIORITY, 697 &addresses_, 698 base::Bind(&SocketStream::OnIOCompleted, this), 699 net_log_); 700 } 701 702 int SocketStream::DoResolveHostComplete(int result) { 703 if (result == OK) 704 next_state_ = STATE_RESOLVE_PROTOCOL; 705 else 706 next_state_ = STATE_CLOSE; 707 // TODO(ukai): if error occured, reconsider proxy after error. 708 return result; 709 } 710 711 int SocketStream::DoResolveProtocol(int result) { 712 DCHECK_EQ(OK, result); 713 714 if (!delegate_) { 715 next_state_ = STATE_CLOSE; 716 return result; 717 } 718 719 next_state_ = STATE_RESOLVE_PROTOCOL_COMPLETE; 720 result = delegate_->OnStartOpenConnection(this, io_callback_); 721 if (result == ERR_IO_PENDING) 722 metrics_->OnWaitConnection(); 723 else if (result != OK && result != ERR_PROTOCOL_SWITCHED) 724 next_state_ = STATE_CLOSE; 725 return result; 726 } 727 728 int SocketStream::DoResolveProtocolComplete(int result) { 729 DCHECK_NE(ERR_IO_PENDING, result); 730 731 if (result == ERR_PROTOCOL_SWITCHED) { 732 next_state_ = STATE_CLOSE; 733 metrics_->OnCountWireProtocolType( 734 SocketStreamMetrics::WIRE_PROTOCOL_SPDY); 735 } else if (result == OK) { 736 next_state_ = STATE_TCP_CONNECT; 737 metrics_->OnCountWireProtocolType( 738 SocketStreamMetrics::WIRE_PROTOCOL_WEBSOCKET); 739 } else { 740 next_state_ = STATE_CLOSE; 741 } 742 return result; 743 } 744 745 int SocketStream::DoTcpConnect(int result) { 746 if (result != OK) { 747 next_state_ = STATE_CLOSE; 748 return result; 749 } 750 next_state_ = STATE_TCP_CONNECT_COMPLETE; 751 DCHECK(factory_); 752 connection_->SetSocket( 753 factory_->CreateTransportClientSocket(addresses_, 754 net_log_.net_log(), 755 net_log_.source())); 756 metrics_->OnStartConnection(); 757 return connection_->socket()->Connect(io_callback_); 758 } 759 760 int SocketStream::DoTcpConnectComplete(int result) { 761 // TODO(ukai): if error occured, reconsider proxy after error. 762 if (result != OK) { 763 next_state_ = STATE_CLOSE; 764 return result; 765 } 766 767 if (proxy_mode_ == kTunnelProxy) { 768 if (proxy_info_.is_https()) 769 next_state_ = STATE_SECURE_PROXY_CONNECT; 770 else 771 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; 772 } else if (proxy_mode_ == kSOCKSProxy) { 773 next_state_ = STATE_SOCKS_CONNECT; 774 } else if (is_secure()) { 775 next_state_ = STATE_SSL_CONNECT; 776 } else { 777 result = DidEstablishConnection(); 778 } 779 return result; 780 } 781 782 int SocketStream::DoGenerateProxyAuthToken() { 783 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE; 784 if (!proxy_auth_controller_.get()) { 785 DCHECK(context_); 786 DCHECK(context_->http_transaction_factory()); 787 DCHECK(context_->http_transaction_factory()->GetSession()); 788 HttpNetworkSession* session = 789 context_->http_transaction_factory()->GetSession(); 790 const char* scheme = proxy_info_.is_https() ? "https://" : "http://"; 791 GURL auth_url(scheme + 792 proxy_info_.proxy_server().host_port_pair().ToString()); 793 proxy_auth_controller_ = 794 new HttpAuthController(HttpAuth::AUTH_PROXY, 795 auth_url, 796 session->http_auth_cache(), 797 session->http_auth_handler_factory()); 798 } 799 HttpRequestInfo request_info; 800 request_info.url = url_; 801 request_info.method = "CONNECT"; 802 return proxy_auth_controller_->MaybeGenerateAuthToken( 803 &request_info, io_callback_, net_log_); 804 } 805 806 int SocketStream::DoGenerateProxyAuthTokenComplete(int result) { 807 if (result != OK) { 808 next_state_ = STATE_CLOSE; 809 return result; 810 } 811 812 next_state_ = STATE_WRITE_TUNNEL_HEADERS; 813 return result; 814 } 815 816 int SocketStream::DoWriteTunnelHeaders() { 817 DCHECK_EQ(kTunnelProxy, proxy_mode_); 818 819 next_state_ = STATE_WRITE_TUNNEL_HEADERS_COMPLETE; 820 821 if (!tunnel_request_headers_.get()) { 822 metrics_->OnCountConnectionType(SocketStreamMetrics::TUNNEL_CONNECTION); 823 tunnel_request_headers_ = new RequestHeaders(); 824 tunnel_request_headers_bytes_sent_ = 0; 825 } 826 if (tunnel_request_headers_->headers_.empty()) { 827 HttpRequestHeaders request_headers; 828 request_headers.SetHeader("Host", GetHostAndOptionalPort(url_)); 829 request_headers.SetHeader("Proxy-Connection", "keep-alive"); 830 if (proxy_auth_controller_.get() && proxy_auth_controller_->HaveAuth()) 831 proxy_auth_controller_->AddAuthorizationHeader(&request_headers); 832 tunnel_request_headers_->headers_ = base::StringPrintf( 833 "CONNECT %s HTTP/1.1\r\n" 834 "%s", 835 GetHostAndPort(url_).c_str(), 836 request_headers.ToString().c_str()); 837 } 838 tunnel_request_headers_->SetDataOffset(tunnel_request_headers_bytes_sent_); 839 int buf_len = static_cast<int>(tunnel_request_headers_->headers_.size() - 840 tunnel_request_headers_bytes_sent_); 841 DCHECK_GT(buf_len, 0); 842 return connection_->socket()->Write( 843 tunnel_request_headers_.get(), buf_len, io_callback_); 844 } 845 846 int SocketStream::DoWriteTunnelHeadersComplete(int result) { 847 DCHECK_EQ(kTunnelProxy, proxy_mode_); 848 849 if (result < 0) { 850 next_state_ = STATE_CLOSE; 851 return result; 852 } 853 854 tunnel_request_headers_bytes_sent_ += result; 855 if (tunnel_request_headers_bytes_sent_ < 856 tunnel_request_headers_->headers_.size()) { 857 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; 858 } else { 859 // Handling a cert error or a client cert request requires reconnection. 860 // DoWriteTunnelHeaders() will be called again. 861 // Thus |tunnel_request_headers_bytes_sent_| should be reset to 0 for 862 // sending |tunnel_request_headers_| correctly. 863 tunnel_request_headers_bytes_sent_ = 0; 864 next_state_ = STATE_READ_TUNNEL_HEADERS; 865 } 866 return OK; 867 } 868 869 int SocketStream::DoReadTunnelHeaders() { 870 DCHECK_EQ(kTunnelProxy, proxy_mode_); 871 872 next_state_ = STATE_READ_TUNNEL_HEADERS_COMPLETE; 873 874 if (!tunnel_response_headers_.get()) { 875 tunnel_response_headers_ = new ResponseHeaders(); 876 tunnel_response_headers_capacity_ = kMaxTunnelResponseHeadersSize; 877 tunnel_response_headers_->Realloc(tunnel_response_headers_capacity_); 878 tunnel_response_headers_len_ = 0; 879 } 880 881 int buf_len = tunnel_response_headers_capacity_ - 882 tunnel_response_headers_len_; 883 tunnel_response_headers_->SetDataOffset(tunnel_response_headers_len_); 884 CHECK(tunnel_response_headers_->data()); 885 886 return connection_->socket()->Read( 887 tunnel_response_headers_.get(), buf_len, io_callback_); 888 } 889 890 int SocketStream::DoReadTunnelHeadersComplete(int result) { 891 DCHECK_EQ(kTunnelProxy, proxy_mode_); 892 893 if (result < 0) { 894 next_state_ = STATE_CLOSE; 895 return result; 896 } 897 898 if (result == 0) { 899 // 0 indicates end-of-file, so socket was closed. 900 next_state_ = STATE_CLOSE; 901 return ERR_CONNECTION_CLOSED; 902 } 903 904 tunnel_response_headers_len_ += result; 905 DCHECK(tunnel_response_headers_len_ <= tunnel_response_headers_capacity_); 906 907 int eoh = HttpUtil::LocateEndOfHeaders( 908 tunnel_response_headers_->headers(), tunnel_response_headers_len_, 0); 909 if (eoh == -1) { 910 if (tunnel_response_headers_len_ >= kMaxTunnelResponseHeadersSize) { 911 next_state_ = STATE_CLOSE; 912 return ERR_RESPONSE_HEADERS_TOO_BIG; 913 } 914 915 next_state_ = STATE_READ_TUNNEL_HEADERS; 916 return OK; 917 } 918 // DidReadResponseHeaders 919 scoped_refptr<HttpResponseHeaders> headers; 920 headers = new HttpResponseHeaders( 921 HttpUtil::AssembleRawHeaders(tunnel_response_headers_->headers(), eoh)); 922 if (headers->GetParsedHttpVersion() < HttpVersion(1, 0)) { 923 // Require the "HTTP/1.x" status line. 924 next_state_ = STATE_CLOSE; 925 return ERR_TUNNEL_CONNECTION_FAILED; 926 } 927 switch (headers->response_code()) { 928 case 200: // OK 929 if (is_secure()) { 930 DCHECK_EQ(eoh, tunnel_response_headers_len_); 931 next_state_ = STATE_SSL_CONNECT; 932 } else { 933 result = DidEstablishConnection(); 934 if (result < 0) { 935 next_state_ = STATE_CLOSE; 936 return result; 937 } 938 if ((eoh < tunnel_response_headers_len_) && delegate_) 939 delegate_->OnReceivedData( 940 this, tunnel_response_headers_->headers() + eoh, 941 tunnel_response_headers_len_ - eoh); 942 } 943 return OK; 944 case 407: // Proxy Authentication Required. 945 if (proxy_mode_ != kTunnelProxy) 946 return ERR_UNEXPECTED_PROXY_AUTH; 947 948 result = proxy_auth_controller_->HandleAuthChallenge( 949 headers, false, true, net_log_); 950 if (result != OK) 951 return result; 952 DCHECK(!proxy_info_.is_empty()); 953 next_state_ = STATE_AUTH_REQUIRED; 954 if (proxy_auth_controller_->HaveAuth()) { 955 base::MessageLoop::current()->PostTask( 956 FROM_HERE, base::Bind(&SocketStream::DoRestartWithAuth, this)); 957 return ERR_IO_PENDING; 958 } 959 if (delegate_) { 960 // Wait until RestartWithAuth or Close is called. 961 base::MessageLoop::current()->PostTask( 962 FROM_HERE, base::Bind(&SocketStream::DoAuthRequired, this)); 963 return ERR_IO_PENDING; 964 } 965 break; 966 default: 967 break; 968 } 969 next_state_ = STATE_CLOSE; 970 return ERR_TUNNEL_CONNECTION_FAILED; 971 } 972 973 int SocketStream::DoSOCKSConnect() { 974 DCHECK_EQ(kSOCKSProxy, proxy_mode_); 975 976 next_state_ = STATE_SOCKS_CONNECT_COMPLETE; 977 978 HostResolver::RequestInfo req_info(HostPortPair::FromURL(url_)); 979 980 DCHECK(!proxy_info_.is_empty()); 981 scoped_ptr<StreamSocket> s; 982 if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5) { 983 s.reset(new SOCKS5ClientSocket(connection_.Pass(), req_info)); 984 } else { 985 s.reset(new SOCKSClientSocket(connection_.Pass(), 986 req_info, 987 DEFAULT_PRIORITY, 988 context_->host_resolver())); 989 } 990 connection_.reset(new ClientSocketHandle); 991 connection_->SetSocket(s.Pass()); 992 metrics_->OnCountConnectionType(SocketStreamMetrics::SOCKS_CONNECTION); 993 return connection_->socket()->Connect(io_callback_); 994 } 995 996 int SocketStream::DoSOCKSConnectComplete(int result) { 997 DCHECK_EQ(kSOCKSProxy, proxy_mode_); 998 999 if (result == OK) { 1000 if (is_secure()) 1001 next_state_ = STATE_SSL_CONNECT; 1002 else 1003 result = DidEstablishConnection(); 1004 } else { 1005 next_state_ = STATE_CLOSE; 1006 } 1007 return result; 1008 } 1009 1010 int SocketStream::DoSecureProxyConnect() { 1011 DCHECK(factory_); 1012 SSLClientSocketContext ssl_context; 1013 ssl_context.cert_verifier = context_->cert_verifier(); 1014 ssl_context.transport_security_state = context_->transport_security_state(); 1015 ssl_context.channel_id_service = context_->channel_id_service(); 1016 scoped_ptr<StreamSocket> socket(factory_->CreateSSLClientSocket( 1017 connection_.Pass(), 1018 proxy_info_.proxy_server().host_port_pair(), 1019 proxy_ssl_config_, 1020 ssl_context)); 1021 connection_.reset(new ClientSocketHandle); 1022 connection_->SetSocket(socket.Pass()); 1023 next_state_ = STATE_SECURE_PROXY_CONNECT_COMPLETE; 1024 metrics_->OnCountConnectionType(SocketStreamMetrics::SECURE_PROXY_CONNECTION); 1025 return connection_->socket()->Connect(io_callback_); 1026 } 1027 1028 int SocketStream::DoSecureProxyConnectComplete(int result) { 1029 DCHECK_EQ(STATE_NONE, next_state_); 1030 // Reconnect with client authentication. 1031 if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) 1032 return HandleCertificateRequest(result, &proxy_ssl_config_); 1033 1034 if (IsCertificateError(result)) 1035 next_state_ = STATE_SECURE_PROXY_HANDLE_CERT_ERROR; 1036 else if (result == OK) 1037 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; 1038 else 1039 next_state_ = STATE_CLOSE; 1040 return result; 1041 } 1042 1043 int SocketStream::DoSecureProxyHandleCertError(int result) { 1044 DCHECK_EQ(STATE_NONE, next_state_); 1045 DCHECK(IsCertificateError(result)); 1046 result = HandleCertificateError(result); 1047 if (result == ERR_IO_PENDING) 1048 next_state_ = STATE_SECURE_PROXY_HANDLE_CERT_ERROR_COMPLETE; 1049 else 1050 next_state_ = STATE_CLOSE; 1051 return result; 1052 } 1053 1054 int SocketStream::DoSecureProxyHandleCertErrorComplete(int result) { 1055 DCHECK_EQ(STATE_NONE, next_state_); 1056 if (result == OK) { 1057 if (!connection_->socket()->IsConnectedAndIdle()) 1058 return AllowCertErrorForReconnection(&proxy_ssl_config_); 1059 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; 1060 } else { 1061 next_state_ = STATE_CLOSE; 1062 } 1063 return result; 1064 } 1065 1066 int SocketStream::DoSSLConnect() { 1067 DCHECK(factory_); 1068 SSLClientSocketContext ssl_context; 1069 ssl_context.cert_verifier = context_->cert_verifier(); 1070 ssl_context.transport_security_state = context_->transport_security_state(); 1071 ssl_context.channel_id_service = context_->channel_id_service(); 1072 scoped_ptr<StreamSocket> socket( 1073 factory_->CreateSSLClientSocket(connection_.Pass(), 1074 HostPortPair::FromURL(url_), 1075 server_ssl_config_, 1076 ssl_context)); 1077 connection_.reset(new ClientSocketHandle); 1078 connection_->SetSocket(socket.Pass()); 1079 next_state_ = STATE_SSL_CONNECT_COMPLETE; 1080 metrics_->OnCountConnectionType(SocketStreamMetrics::SSL_CONNECTION); 1081 return connection_->socket()->Connect(io_callback_); 1082 } 1083 1084 int SocketStream::DoSSLConnectComplete(int result) { 1085 DCHECK_EQ(STATE_NONE, next_state_); 1086 // Reconnect with client authentication. 1087 if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) 1088 return HandleCertificateRequest(result, &server_ssl_config_); 1089 1090 if (IsCertificateError(result)) 1091 next_state_ = STATE_SSL_HANDLE_CERT_ERROR; 1092 else if (result == OK) 1093 result = DidEstablishConnection(); 1094 else 1095 next_state_ = STATE_CLOSE; 1096 return result; 1097 } 1098 1099 int SocketStream::DoSSLHandleCertError(int result) { 1100 DCHECK_EQ(STATE_NONE, next_state_); 1101 DCHECK(IsCertificateError(result)); 1102 result = HandleCertificateError(result); 1103 if (result == OK || result == ERR_IO_PENDING) 1104 next_state_ = STATE_SSL_HANDLE_CERT_ERROR_COMPLETE; 1105 else 1106 next_state_ = STATE_CLOSE; 1107 return result; 1108 } 1109 1110 int SocketStream::DoSSLHandleCertErrorComplete(int result) { 1111 DCHECK_EQ(STATE_NONE, next_state_); 1112 // TODO(toyoshim): Upgrade to SPDY through TLS NPN extension if possible. 1113 // If we use HTTPS and this is the first connection to the SPDY server, 1114 // we should take care of TLS NPN extension here. 1115 1116 if (result == OK) { 1117 if (!connection_->socket()->IsConnectedAndIdle()) 1118 return AllowCertErrorForReconnection(&server_ssl_config_); 1119 result = DidEstablishConnection(); 1120 } else { 1121 next_state_ = STATE_CLOSE; 1122 } 1123 return result; 1124 } 1125 1126 int SocketStream::DoReadWrite(int result) { 1127 if (result < OK) { 1128 next_state_ = STATE_CLOSE; 1129 return result; 1130 } 1131 if (!connection_->socket() || !connection_->socket()->IsConnected()) { 1132 next_state_ = STATE_CLOSE; 1133 return ERR_CONNECTION_CLOSED; 1134 } 1135 1136 // If client has requested close(), and there's nothing to write, then 1137 // let's close the socket. 1138 // We don't care about receiving data after the socket is closed. 1139 if (closing_ && !current_write_buf_.get() && pending_write_bufs_.empty()) { 1140 connection_->socket()->Disconnect(); 1141 next_state_ = STATE_CLOSE; 1142 return OK; 1143 } 1144 1145 next_state_ = STATE_READ_WRITE; 1146 1147 // If server already closed the socket, we don't try to read. 1148 if (!server_closed_) { 1149 if (!read_buf_.get()) { 1150 // No read pending and server didn't close the socket. 1151 read_buf_ = new IOBuffer(kReadBufferSize); 1152 result = connection_->socket()->Read( 1153 read_buf_.get(), 1154 kReadBufferSize, 1155 base::Bind(&SocketStream::OnReadCompleted, base::Unretained(this))); 1156 if (result > 0) { 1157 return DidReceiveData(result); 1158 } else if (result == 0) { 1159 // 0 indicates end-of-file, so socket was closed. 1160 next_state_ = STATE_CLOSE; 1161 server_closed_ = true; 1162 return ERR_CONNECTION_CLOSED; 1163 } 1164 // If read is pending, try write as well. 1165 // Otherwise, return the result and do next loop (to close the 1166 // connection). 1167 if (result != ERR_IO_PENDING) { 1168 next_state_ = STATE_CLOSE; 1169 server_closed_ = true; 1170 return result; 1171 } 1172 } 1173 // Read is pending. 1174 DCHECK(read_buf_.get()); 1175 } 1176 1177 if (waiting_for_write_completion_) 1178 return ERR_IO_PENDING; 1179 1180 if (!current_write_buf_.get()) { 1181 if (pending_write_bufs_.empty()) { 1182 // Nothing buffered for send. 1183 return ERR_IO_PENDING; 1184 } 1185 1186 current_write_buf_ = new DrainableIOBuffer( 1187 pending_write_bufs_.front().get(), pending_write_bufs_.front()->size()); 1188 pending_write_bufs_.pop_front(); 1189 } 1190 1191 result = connection_->socket()->Write( 1192 current_write_buf_.get(), 1193 current_write_buf_->BytesRemaining(), 1194 base::Bind(&SocketStream::OnWriteCompleted, base::Unretained(this))); 1195 1196 if (result == ERR_IO_PENDING) { 1197 waiting_for_write_completion_ = true; 1198 } else if (result < 0) { 1199 // Shortcut. Enter STATE_CLOSE now by changing next_state_ here than by 1200 // calling DoReadWrite() again with the error code. 1201 next_state_ = STATE_CLOSE; 1202 } else if (result > 0) { 1203 // Write is not pending. Return OK and do next loop. 1204 DidSendData(result); 1205 result = OK; 1206 } 1207 1208 return result; 1209 } 1210 1211 GURL SocketStream::ProxyAuthOrigin() const { 1212 DCHECK(!proxy_info_.is_empty()); 1213 return GURL("http://" + 1214 proxy_info_.proxy_server().host_port_pair().ToString()); 1215 } 1216 1217 int SocketStream::HandleCertificateRequest(int result, SSLConfig* ssl_config) { 1218 if (ssl_config->send_client_cert) { 1219 // We already have performed SSL client authentication once and failed. 1220 return result; 1221 } 1222 1223 DCHECK(connection_->socket()); 1224 scoped_refptr<SSLCertRequestInfo> cert_request_info = new SSLCertRequestInfo; 1225 SSLClientSocket* ssl_socket = 1226 static_cast<SSLClientSocket*>(connection_->socket()); 1227 ssl_socket->GetSSLCertRequestInfo(cert_request_info.get()); 1228 1229 HttpTransactionFactory* factory = context_->http_transaction_factory(); 1230 if (!factory) 1231 return result; 1232 scoped_refptr<HttpNetworkSession> session = factory->GetSession(); 1233 if (!session.get()) 1234 return result; 1235 1236 // If the user selected one of the certificates in client_certs or declined 1237 // to provide one for this server before, use the past decision 1238 // automatically. 1239 scoped_refptr<X509Certificate> client_cert; 1240 if (!session->ssl_client_auth_cache()->Lookup( 1241 cert_request_info->host_and_port, &client_cert)) { 1242 return result; 1243 } 1244 1245 // Note: |client_cert| may be NULL, indicating that the caller 1246 // wishes to proceed anonymously (eg: continue the handshake 1247 // without sending a client cert) 1248 // 1249 // Check that the certificate selected is still a certificate the server 1250 // is likely to accept, based on the criteria supplied in the 1251 // CertificateRequest message. 1252 const std::vector<std::string>& cert_authorities = 1253 cert_request_info->cert_authorities; 1254 if (client_cert.get() && !cert_authorities.empty() && 1255 !client_cert->IsIssuedByEncoded(cert_authorities)) { 1256 return result; 1257 } 1258 1259 ssl_config->send_client_cert = true; 1260 ssl_config->client_cert = client_cert; 1261 next_state_ = STATE_TCP_CONNECT; 1262 return OK; 1263 } 1264 1265 int SocketStream::AllowCertErrorForReconnection(SSLConfig* ssl_config) { 1266 DCHECK(ssl_config); 1267 // The SSL handshake didn't finish, or the server closed the SSL connection. 1268 // So, we should restart establishing connection with the certificate in 1269 // allowed bad certificates in |ssl_config|. 1270 // See also net/http/http_network_transaction.cc HandleCertificateError() and 1271 // RestartIgnoringLastError(). 1272 SSLClientSocket* ssl_socket = 1273 static_cast<SSLClientSocket*>(connection_->socket()); 1274 SSLInfo ssl_info; 1275 ssl_socket->GetSSLInfo(&ssl_info); 1276 if (ssl_info.cert.get() == NULL || 1277 ssl_config->IsAllowedBadCert(ssl_info.cert.get(), NULL)) { 1278 // If we already have the certificate in the set of allowed bad 1279 // certificates, we did try it and failed again, so we should not 1280 // retry again: the connection should fail at last. 1281 next_state_ = STATE_CLOSE; 1282 return ERR_UNEXPECTED; 1283 } 1284 // Add the bad certificate to the set of allowed certificates in the 1285 // SSL config object. 1286 SSLConfig::CertAndStatus bad_cert; 1287 if (!X509Certificate::GetDEREncoded(ssl_info.cert->os_cert_handle(), 1288 &bad_cert.der_cert)) { 1289 next_state_ = STATE_CLOSE; 1290 return ERR_UNEXPECTED; 1291 } 1292 bad_cert.cert_status = ssl_info.cert_status; 1293 ssl_config->allowed_bad_certs.push_back(bad_cert); 1294 // Restart connection ignoring the bad certificate. 1295 connection_->socket()->Disconnect(); 1296 connection_->SetSocket(scoped_ptr<StreamSocket>()); 1297 next_state_ = STATE_TCP_CONNECT; 1298 return OK; 1299 } 1300 1301 void SocketStream::DoAuthRequired() { 1302 if (delegate_ && proxy_auth_controller_.get()) 1303 delegate_->OnAuthRequired(this, proxy_auth_controller_->auth_info().get()); 1304 else 1305 DoLoop(ERR_UNEXPECTED); 1306 } 1307 1308 void SocketStream::DoRestartWithAuth() { 1309 DCHECK_EQ(next_state_, STATE_AUTH_REQUIRED); 1310 tunnel_request_headers_ = NULL; 1311 tunnel_request_headers_bytes_sent_ = 0; 1312 tunnel_response_headers_ = NULL; 1313 tunnel_response_headers_capacity_ = 0; 1314 tunnel_response_headers_len_ = 0; 1315 1316 next_state_ = STATE_TCP_CONNECT; 1317 DoLoop(OK); 1318 } 1319 1320 int SocketStream::HandleCertificateError(int result) { 1321 DCHECK(IsCertificateError(result)); 1322 SSLClientSocket* ssl_socket = 1323 static_cast<SSLClientSocket*>(connection_->socket()); 1324 DCHECK(ssl_socket); 1325 1326 if (!context_) 1327 return result; 1328 1329 if (SSLClientSocket::IgnoreCertError(result, LOAD_IGNORE_ALL_CERT_ERRORS)) { 1330 const HttpNetworkSession::Params* session_params = 1331 context_->GetNetworkSessionParams(); 1332 if (session_params && session_params->ignore_certificate_errors) 1333 return OK; 1334 } 1335 1336 if (!delegate_) 1337 return result; 1338 1339 SSLInfo ssl_info; 1340 ssl_socket->GetSSLInfo(&ssl_info); 1341 1342 TransportSecurityState* state = context_->transport_security_state(); 1343 const bool fatal = state && state->ShouldSSLErrorsBeFatal(url_.host()); 1344 1345 delegate_->OnSSLCertificateError(this, ssl_info, fatal); 1346 return ERR_IO_PENDING; 1347 } 1348 1349 CookieStore* SocketStream::cookie_store() const { 1350 return cookie_store_.get(); 1351 } 1352 1353 } // namespace net 1354