Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Side by Side Diff: net/socket_stream/socket_stream.cc

Issue 345025: Set STATE_CLOSE when error occured. (Closed)
Patch Set: Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 // TODO(ukai): code is similar with http_network_transaction.cc. We should 5 // TODO(ukai): code is similar with http_network_transaction.cc. We should
6 // think about ways to share code, if possible. 6 // think about ways to share code, if possible.
7 7
8 #include "net/socket_stream/socket_stream.h" 8 #include "net/socket_stream/socket_stream.h"
9 9
10 #include <string> 10 #include <string>
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 } 208 }
209 209
210 void SocketStream::SetClientSocketFactory( 210 void SocketStream::SetClientSocketFactory(
211 ClientSocketFactory* factory) { 211 ClientSocketFactory* factory) {
212 DCHECK(factory); 212 DCHECK(factory);
213 factory_ = factory; 213 factory_ = factory;
214 } 214 }
215 215
216 int SocketStream::DidEstablishConnection() { 216 int SocketStream::DidEstablishConnection() {
217 if (!socket_.get() || !socket_->IsConnected()) { 217 if (!socket_.get() || !socket_->IsConnected()) {
218 next_state_ = STATE_CLOSE;
218 return ERR_CONNECTION_FAILED; 219 return ERR_CONNECTION_FAILED;
219 } 220 }
220 next_state_ = STATE_READ_WRITE; 221 next_state_ = STATE_READ_WRITE;
221 222
222 if (delegate_) 223 if (delegate_)
223 delegate_->OnConnected(this, max_pending_send_allowed_); 224 delegate_->OnConnected(this, max_pending_send_allowed_);
224 225
225 return OK; 226 return OK;
226 } 227 }
227 228
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 result = DoReadWrite(result); 343 result = DoReadWrite(result);
343 break; 344 break;
344 case STATE_CLOSE: 345 case STATE_CLOSE:
345 DCHECK_LE(result, OK); 346 DCHECK_LE(result, OK);
346 if (result == OK) 347 if (result == OK)
347 result = ERR_CONNECTION_CLOSED; 348 result = ERR_CONNECTION_CLOSED;
348 Finish(result); 349 Finish(result);
349 return; 350 return;
350 default: 351 default:
351 NOTREACHED() << "bad state"; 352 NOTREACHED() << "bad state";
352 result = ERR_UNEXPECTED; 353 Finish(result);
353 break; 354 break;
354 } 355 }
355 } while (result != ERR_IO_PENDING); 356 } while (result != ERR_IO_PENDING);
356 } 357 }
357 358
358 int SocketStream::DoResolveProxy() { 359 int SocketStream::DoResolveProxy() {
359 DCHECK(!pac_request_); 360 DCHECK(!pac_request_);
360 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; 361 next_state_ = STATE_RESOLVE_PROXY_COMPLETE;
361 362
362 return proxy_service()->ResolveProxy( 363 return proxy_service()->ResolveProxy(
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 402
402 HostResolver::RequestInfo resolve_info(host, port); 403 HostResolver::RequestInfo resolve_info(host, port);
403 404
404 resolver_.reset(new SingleRequestHostResolver(host_resolver_.get())); 405 resolver_.reset(new SingleRequestHostResolver(host_resolver_.get()));
405 return resolver_->Resolve(resolve_info, &addresses_, &io_callback_, NULL); 406 return resolver_->Resolve(resolve_info, &addresses_, &io_callback_, NULL);
406 } 407 }
407 408
408 int SocketStream::DoResolveHostComplete(int result) { 409 int SocketStream::DoResolveHostComplete(int result) {
409 if (result == OK) 410 if (result == OK)
410 next_state_ = STATE_TCP_CONNECT; 411 next_state_ = STATE_TCP_CONNECT;
412 else
413 next_state_ = STATE_CLOSE;
411 // TODO(ukai): if error occured, reconsider proxy after error. 414 // TODO(ukai): if error occured, reconsider proxy after error.
412 return result; 415 return result;
413 } 416 }
414 417
415 int SocketStream::DoTcpConnect() { 418 int SocketStream::DoTcpConnect() {
416 next_state_ = STATE_TCP_CONNECT_COMPLETE; 419 next_state_ = STATE_TCP_CONNECT_COMPLETE;
417 DCHECK(factory_); 420 DCHECK(factory_);
418 socket_.reset(factory_->CreateTCPClientSocket(addresses_)); 421 socket_.reset(factory_->CreateTCPClientSocket(addresses_));
419 return socket_->Connect(&io_callback_); 422 return socket_->Connect(&io_callback_);
420 } 423 }
421 424
422 int SocketStream::DoTcpConnectComplete(int result) { 425 int SocketStream::DoTcpConnectComplete(int result) {
423 // TODO(ukai): if error occured, reconsider proxy after error. 426 // TODO(ukai): if error occured, reconsider proxy after error.
424 if (result != OK) 427 if (result != OK) {
428 next_state_ = STATE_CLOSE;
425 return result; 429 return result;
430 }
426 431
427 if (proxy_mode_ == kTunnelProxy) 432 if (proxy_mode_ == kTunnelProxy)
428 next_state_ = STATE_WRITE_TUNNEL_HEADERS; 433 next_state_ = STATE_WRITE_TUNNEL_HEADERS;
429 else if (proxy_mode_ == kSOCKSProxy) 434 else if (proxy_mode_ == kSOCKSProxy)
430 next_state_ = STATE_SOCKS_CONNECT; 435 next_state_ = STATE_SOCKS_CONNECT;
431 else if (is_secure()) { 436 else if (is_secure()) {
432 next_state_ = STATE_SSL_CONNECT; 437 next_state_ = STATE_SSL_CONNECT;
433 } else { 438 } else {
434 result = DidEstablishConnection(); 439 result = DidEstablishConnection();
435 } 440 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 tunnel_request_headers_->SetDataOffset(tunnel_request_headers_bytes_sent_); 493 tunnel_request_headers_->SetDataOffset(tunnel_request_headers_bytes_sent_);
489 int buf_len = static_cast<int>(tunnel_request_headers_->headers_.size() - 494 int buf_len = static_cast<int>(tunnel_request_headers_->headers_.size() -
490 tunnel_request_headers_bytes_sent_); 495 tunnel_request_headers_bytes_sent_);
491 DCHECK_GT(buf_len, 0); 496 DCHECK_GT(buf_len, 0);
492 return socket_->Write(tunnel_request_headers_, buf_len, &io_callback_); 497 return socket_->Write(tunnel_request_headers_, buf_len, &io_callback_);
493 } 498 }
494 499
495 int SocketStream::DoWriteTunnelHeadersComplete(int result) { 500 int SocketStream::DoWriteTunnelHeadersComplete(int result) {
496 DCHECK_EQ(kTunnelProxy, proxy_mode_); 501 DCHECK_EQ(kTunnelProxy, proxy_mode_);
497 502
498 if (result < 0) 503 if (result < 0) {
504 next_state_ = STATE_CLOSE;
499 return result; 505 return result;
506 }
500 507
501 tunnel_request_headers_bytes_sent_ += result; 508 tunnel_request_headers_bytes_sent_ += result;
502 if (tunnel_request_headers_bytes_sent_ < 509 if (tunnel_request_headers_bytes_sent_ <
503 tunnel_request_headers_->headers_.size()) 510 tunnel_request_headers_->headers_.size())
504 next_state_ = STATE_WRITE_TUNNEL_HEADERS; 511 next_state_ = STATE_WRITE_TUNNEL_HEADERS;
505 else 512 else
506 next_state_ = STATE_READ_TUNNEL_HEADERS; 513 next_state_ = STATE_READ_TUNNEL_HEADERS;
507 return OK; 514 return OK;
508 } 515 }
509 516
(...skipping 13 matching lines...) Expand all
523 tunnel_response_headers_len_; 530 tunnel_response_headers_len_;
524 tunnel_response_headers_->SetDataOffset(tunnel_response_headers_len_); 531 tunnel_response_headers_->SetDataOffset(tunnel_response_headers_len_);
525 CHECK(tunnel_response_headers_->data()); 532 CHECK(tunnel_response_headers_->data());
526 533
527 return socket_->Read(tunnel_response_headers_, buf_len, &io_callback_); 534 return socket_->Read(tunnel_response_headers_, buf_len, &io_callback_);
528 } 535 }
529 536
530 int SocketStream::DoReadTunnelHeadersComplete(int result) { 537 int SocketStream::DoReadTunnelHeadersComplete(int result) {
531 DCHECK_EQ(kTunnelProxy, proxy_mode_); 538 DCHECK_EQ(kTunnelProxy, proxy_mode_);
532 539
533 if (result < 0) 540 if (result < 0) {
541 next_state_ = STATE_CLOSE;
534 return result; 542 return result;
543 }
535 544
536 if (result == 0) { 545 if (result == 0) {
537 // 0 indicates end-of-file, so socket was closed. 546 // 0 indicates end-of-file, so socket was closed.
538 next_state_ = STATE_CLOSE; 547 next_state_ = STATE_CLOSE;
539 return ERR_CONNECTION_CLOSED; 548 return ERR_CONNECTION_CLOSED;
540 } 549 }
541 550
542 tunnel_response_headers_len_ += result; 551 tunnel_response_headers_len_ += result;
543 DCHECK(tunnel_response_headers_len_ <= tunnel_response_headers_capacity_); 552 DCHECK(tunnel_response_headers_len_ <= tunnel_response_headers_capacity_);
544 553
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 // Wait until RestartWithAuth or Close is called. 601 // Wait until RestartWithAuth or Close is called.
593 MessageLoop::current()->PostTask( 602 MessageLoop::current()->PostTask(
594 FROM_HERE, 603 FROM_HERE,
595 NewRunnableMethod(this, &SocketStream::DoAuthRequired)); 604 NewRunnableMethod(this, &SocketStream::DoAuthRequired));
596 next_state_ = STATE_AUTH_REQUIRED; 605 next_state_ = STATE_AUTH_REQUIRED;
597 return ERR_IO_PENDING; 606 return ERR_IO_PENDING;
598 } 607 }
599 default: 608 default:
600 break; 609 break;
601 } 610 }
611 next_state_ = STATE_CLOSE;
602 return ERR_TUNNEL_CONNECTION_FAILED; 612 return ERR_TUNNEL_CONNECTION_FAILED;
603 } 613 }
604 614
605 int SocketStream::DoSOCKSConnect() { 615 int SocketStream::DoSOCKSConnect() {
606 DCHECK_EQ(kSOCKSProxy, proxy_mode_); 616 DCHECK_EQ(kSOCKSProxy, proxy_mode_);
607 617
608 next_state_ = STATE_SOCKS_CONNECT_COMPLETE; 618 next_state_ = STATE_SOCKS_CONNECT_COMPLETE;
609 619
610 ClientSocket* s = socket_.release(); 620 ClientSocket* s = socket_.release();
611 HostResolver::RequestInfo req_info(url_.HostNoBrackets(), 621 HostResolver::RequestInfo req_info(url_.HostNoBrackets(),
612 url_.EffectiveIntPort()); 622 url_.EffectiveIntPort());
613 623
614 if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5) 624 if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5)
615 s = new SOCKS5ClientSocket(s, req_info, host_resolver_.get()); 625 s = new SOCKS5ClientSocket(s, req_info, host_resolver_.get());
616 else 626 else
617 s = new SOCKSClientSocket(s, req_info, host_resolver_.get()); 627 s = new SOCKSClientSocket(s, req_info, host_resolver_.get());
618 socket_.reset(s); 628 socket_.reset(s);
619 return socket_->Connect(&io_callback_); 629 return socket_->Connect(&io_callback_);
620 } 630 }
621 631
622 int SocketStream::DoSOCKSConnectComplete(int result) { 632 int SocketStream::DoSOCKSConnectComplete(int result) {
623 DCHECK_EQ(kSOCKSProxy, proxy_mode_); 633 DCHECK_EQ(kSOCKSProxy, proxy_mode_);
624 634
625 if (result == OK) { 635 if (result == OK) {
626 if (is_secure()) 636 if (is_secure())
627 next_state_ = STATE_SSL_CONNECT; 637 next_state_ = STATE_SSL_CONNECT;
628 else 638 else
629 DidEstablishConnection(); 639 DidEstablishConnection();
tyoshino (SeeGerritForStatus) 2009/11/02 02:18:27 result = DidEstablishConnection ?
630 } 640 }
631 return result; 641 return result;
632 } 642 }
633 643
634 int SocketStream::DoSSLConnect() { 644 int SocketStream::DoSSLConnect() {
635 DCHECK(factory_); 645 DCHECK(factory_);
636 socket_.reset(factory_->CreateSSLClientSocket( 646 socket_.reset(factory_->CreateSSLClientSocket(
637 socket_.release(), url_.HostNoBrackets(), ssl_config_)); 647 socket_.release(), url_.HostNoBrackets(), ssl_config_));
638 next_state_ = STATE_SSL_CONNECT_COMPLETE; 648 next_state_ = STATE_SSL_CONNECT_COMPLETE;
639 return socket_->Connect(&io_callback_); 649 return socket_->Connect(&io_callback_);
640 } 650 }
641 651
642 int SocketStream::DoSSLConnectComplete(int result) { 652 int SocketStream::DoSSLConnectComplete(int result) {
643 if (IsCertificateError(result)) 653 if (IsCertificateError(result))
644 result = HandleCertificateError(result); 654 result = HandleCertificateError(result);
645 655
646 if (result == OK) 656 if (result == OK)
647 result = DidEstablishConnection(); 657 result = DidEstablishConnection();
658 else
659 next_state_ = STATE_CLOSE;
648 return result; 660 return result;
649 } 661 }
650 662
651 int SocketStream::DoReadWrite(int result) { 663 int SocketStream::DoReadWrite(int result) {
652 if (result < OK) { 664 if (result < OK) {
665 next_state_ = STATE_CLOSE;
653 return result; 666 return result;
654 } 667 }
655 if (!socket_.get() || !socket_->IsConnected()) { 668 if (!socket_.get() || !socket_->IsConnected()) {
669 next_state_ = STATE_CLOSE;
656 return ERR_CONNECTION_CLOSED; 670 return ERR_CONNECTION_CLOSED;
657 } 671 }
658 672
659 next_state_ = STATE_READ_WRITE; 673 next_state_ = STATE_READ_WRITE;
660 674
661 if (!read_buf_) { 675 if (!read_buf_) {
662 // No read pending. 676 // No read pending.
663 read_buf_ = new IOBuffer(kReadBufferSize); 677 read_buf_ = new IOBuffer(kReadBufferSize);
664 result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_); 678 result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_);
665 if (result > 0) { 679 if (result > 0) {
666 DidReceiveData(result); 680 DidReceiveData(result);
667 return OK; 681 return OK;
668 } else if (result == 0) { 682 } else if (result == 0) {
669 // 0 indicates end-of-file, so socket was closed. 683 // 0 indicates end-of-file, so socket was closed.
684 next_state_ = STATE_CLOSE;
670 return ERR_CONNECTION_CLOSED; 685 return ERR_CONNECTION_CLOSED;
671 } 686 }
672 // If read is pending, try write as well. 687 // If read is pending, try write as well.
673 // Otherwise, return the result and do next loop. 688 // Otherwise, return the result and do next loop.
674 if (result != ERR_IO_PENDING) 689 if (result != ERR_IO_PENDING) {
690 next_state_ = STATE_CLOSE;
675 return result; 691 return result;
692 }
676 } 693 }
677 // Read is pending. 694 // Read is pending.
678 DCHECK(read_buf_); 695 DCHECK(read_buf_);
679 696
680 if (write_buf_ && !current_write_buf_) { 697 if (write_buf_ && !current_write_buf_) {
681 // No write pending. 698 // No write pending.
682 current_write_buf_ = new DrainableIOBuffer(write_buf_, write_buf_size_); 699 current_write_buf_ = new DrainableIOBuffer(write_buf_, write_buf_size_);
683 current_write_buf_->SetOffset(write_buf_offset_); 700 current_write_buf_->SetOffset(write_buf_offset_);
684 result = socket_->Write(current_write_buf_, 701 result = socket_->Write(current_write_buf_,
685 current_write_buf_->BytesRemaining(), 702 current_write_buf_->BytesRemaining(),
686 &write_callback_); 703 &write_callback_);
687 if (result > 0) { 704 if (result > 0) {
688 DidSendData(result); 705 DidSendData(result);
689 return OK; 706 return OK;
690 } 707 }
tyoshino (SeeGerritForStatus) 2009/11/02 02:18:27 Here, we should do the same as Read? if (result !=
691 return result; 708 return result;
692 } 709 }
693 710
694 // We arrived here when both operation is pending. 711 // We arrived here when both operation is pending.
695 return ERR_IO_PENDING; 712 return ERR_IO_PENDING;
696 } 713 }
697 714
698 GURL SocketStream::ProxyAuthOrigin() const { 715 GURL SocketStream::ProxyAuthOrigin() const {
699 return GURL("http://" + proxy_info_.proxy_server().host_and_port()); 716 return GURL("http://" + proxy_info_.proxy_server().host_and_port());
700 } 717 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 806
790 SSLConfigService* SocketStream::ssl_config_service() const { 807 SSLConfigService* SocketStream::ssl_config_service() const {
791 return context_->ssl_config_service(); 808 return context_->ssl_config_service();
792 } 809 }
793 810
794 ProxyService* SocketStream::proxy_service() const { 811 ProxyService* SocketStream::proxy_service() const {
795 return context_->proxy_service(); 812 return context_->proxy_service();
796 } 813 }
797 814
798 } // namespace net 815 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698