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

Side by Side Diff: net/spdy/spdy_session.cc

Issue 208663003: Revert of Fix SPDY error-handling if the connection gets closed just after use. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months 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 | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_session.h ('k') | net/spdy/spdy_session_pool.h » ('j') | 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) 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 "net/spdy/spdy_session.h" 5 #include "net/spdy/spdy_session.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 // requires re-working CreateFakeSpdySession(), though. 525 // requires re-working CreateFakeSpdySession(), though.
526 DCHECK(connection_->socket()); 526 DCHECK(connection_->socket());
527 // With SPDY we can't recycle sockets. 527 // With SPDY we can't recycle sockets.
528 connection_->socket()->Disconnect(); 528 connection_->socket()->Disconnect();
529 529
530 RecordHistograms(); 530 RecordHistograms();
531 531
532 net_log_.EndEvent(NetLog::TYPE_SPDY_SESSION); 532 net_log_.EndEvent(NetLog::TYPE_SPDY_SESSION);
533 } 533 }
534 534
535 void SpdySession::InitializeWithSocket( 535 Error SpdySession::InitializeWithSocket(
536 scoped_ptr<ClientSocketHandle> connection, 536 scoped_ptr<ClientSocketHandle> connection,
537 SpdySessionPool* pool, 537 SpdySessionPool* pool,
538 bool is_secure, 538 bool is_secure,
539 int certificate_error_code) { 539 int certificate_error_code) {
540 CHECK(!in_io_loop_); 540 CHECK(!in_io_loop_);
541 DCHECK_EQ(availability_state_, STATE_AVAILABLE); 541 DCHECK_EQ(availability_state_, STATE_AVAILABLE);
542 DCHECK_EQ(read_state_, READ_STATE_DO_READ); 542 DCHECK_EQ(read_state_, READ_STATE_DO_READ);
543 DCHECK_EQ(write_state_, WRITE_STATE_IDLE); 543 DCHECK_EQ(write_state_, WRITE_STATE_IDLE);
544 DCHECK(!connection_); 544 DCHECK(!connection_);
545 545
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 #if defined(SPDY_PROXY_AUTH_ORIGIN) 586 #if defined(SPDY_PROXY_AUTH_ORIGIN)
587 UMA_HISTOGRAM_BOOLEAN("Net.SpdySessions_DataReductionProxy", 587 UMA_HISTOGRAM_BOOLEAN("Net.SpdySessions_DataReductionProxy",
588 host_port_pair().Equals(HostPortPair::FromURL( 588 host_port_pair().Equals(HostPortPair::FromURL(
589 GURL(SPDY_PROXY_AUTH_ORIGIN)))); 589 GURL(SPDY_PROXY_AUTH_ORIGIN))));
590 #endif 590 #endif
591 591
592 net_log_.AddEvent( 592 net_log_.AddEvent(
593 NetLog::TYPE_SPDY_SESSION_INITIALIZED, 593 NetLog::TYPE_SPDY_SESSION_INITIALIZED,
594 connection_->socket()->NetLog().source().ToEventParametersCallback()); 594 connection_->socket()->NetLog().source().ToEventParametersCallback());
595 595
596 DCHECK_NE(availability_state_, STATE_CLOSED); 596 int error = DoReadLoop(READ_STATE_DO_READ, OK);
597 connection_->AddHigherLayeredPool(this); 597 if (error == ERR_IO_PENDING)
598 if (enable_sending_initial_data_) 598 error = OK;
599 SendInitialData(); 599 if (error == OK) {
600 pool_ = pool; 600 DCHECK_NE(availability_state_, STATE_CLOSED);
601 601 connection_->AddHigherLayeredPool(this);
602 // Bootstrap the read loop. 602 if (enable_sending_initial_data_)
603 base::MessageLoop::current()->PostTask( 603 SendInitialData();
604 FROM_HERE, 604 pool_ = pool;
605 base::Bind(&SpdySession::PumpReadLoop, 605 } else {
606 weak_factory_.GetWeakPtr(), READ_STATE_DO_READ, OK)); 606 DcheckClosed();
607 }
608 return static_cast<Error>(error);
607 } 609 }
608 610
609 bool SpdySession::VerifyDomainAuthentication(const std::string& domain) { 611 bool SpdySession::VerifyDomainAuthentication(const std::string& domain) {
610 if (!verify_domain_authentication_) 612 if (!verify_domain_authentication_)
611 return true; 613 return true;
612 614
613 if (availability_state_ == STATE_CLOSED) 615 if (availability_state_ == STATE_CLOSED)
614 return false; 616 return false;
615 617
616 SSLInfo ssl_info; 618 SSLInfo ssl_info;
(...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 return SESSION_ALREADY_CLOSED; 1547 return SESSION_ALREADY_CLOSED;
1546 1548
1547 net_log_.AddEvent( 1549 net_log_.AddEvent(
1548 NetLog::TYPE_SPDY_SESSION_CLOSE, 1550 NetLog::TYPE_SPDY_SESSION_CLOSE,
1549 base::Bind(&NetLogSpdySessionCloseCallback, err, &description)); 1551 base::Bind(&NetLogSpdySessionCloseCallback, err, &description));
1550 1552
1551 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SpdySession.ClosedOnError", -err); 1553 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SpdySession.ClosedOnError", -err);
1552 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySession.BytesRead.OtherErrors", 1554 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySession.BytesRead.OtherErrors",
1553 total_bytes_received_, 1, 100000000, 50); 1555 total_bytes_received_, 1, 100000000, 50);
1554 1556
1555 DCHECK(pool_); 1557 // |pool_| will be NULL when |InitializeWithSocket()| is in the
1556 if (availability_state_ != STATE_GOING_AWAY) 1558 // call stack.
1559 if (pool_ && availability_state_ != STATE_GOING_AWAY)
1557 pool_->MakeSessionUnavailable(GetWeakPtr()); 1560 pool_->MakeSessionUnavailable(GetWeakPtr());
1558 1561
1559 availability_state_ = STATE_CLOSED; 1562 availability_state_ = STATE_CLOSED;
1560 error_on_close_ = err; 1563 error_on_close_ = err;
1561 1564
1562 StartGoingAway(0, err); 1565 StartGoingAway(0, err);
1563 write_queue_.Clear(); 1566 write_queue_.Clear();
1564 1567
1565 DcheckClosed(); 1568 DcheckClosed();
1566 1569
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1618 void SpdySession::CloseSessionOnError(Error err, 1621 void SpdySession::CloseSessionOnError(Error err,
1619 const std::string& description) { 1622 const std::string& description) {
1620 // We may be called from anywhere, so we can't expect a particular 1623 // We may be called from anywhere, so we can't expect a particular
1621 // return value. 1624 // return value.
1622 ignore_result(DoCloseSession(err, description)); 1625 ignore_result(DoCloseSession(err, description));
1623 } 1626 }
1624 1627
1625 void SpdySession::MakeUnavailable() { 1628 void SpdySession::MakeUnavailable() {
1626 if (availability_state_ < STATE_GOING_AWAY) { 1629 if (availability_state_ < STATE_GOING_AWAY) {
1627 availability_state_ = STATE_GOING_AWAY; 1630 availability_state_ = STATE_GOING_AWAY;
1628 DCHECK(pool_); 1631 // |pool_| will be NULL when |InitializeWithSocket()| is in the
1629 pool_->MakeSessionUnavailable(GetWeakPtr()); 1632 // call stack.
1633 if (pool_)
1634 pool_->MakeSessionUnavailable(GetWeakPtr());
1630 } 1635 }
1631 } 1636 }
1632 1637
1633 base::Value* SpdySession::GetInfoAsValue() const { 1638 base::Value* SpdySession::GetInfoAsValue() const {
1634 base::DictionaryValue* dict = new base::DictionaryValue(); 1639 base::DictionaryValue* dict = new base::DictionaryValue();
1635 1640
1636 dict->SetInteger("source_id", net_log_.source().id); 1641 dict->SetInteger("source_id", net_log_.source().id);
1637 1642
1638 dict->SetString("host_port_pair", host_port_pair().ToString()); 1643 dict->SetString("host_port_pair", host_port_pair().ToString());
1639 if (!pooled_aliases_.empty()) { 1644 if (!pooled_aliases_.empty()) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1674 dict->SetBoolean("received_settings", received_settings_); 1679 dict->SetBoolean("received_settings", received_settings_);
1675 1680
1676 dict->SetInteger("send_window_size", session_send_window_size_); 1681 dict->SetInteger("send_window_size", session_send_window_size_);
1677 dict->SetInteger("recv_window_size", session_recv_window_size_); 1682 dict->SetInteger("recv_window_size", session_recv_window_size_);
1678 dict->SetInteger("unacked_recv_window_bytes", 1683 dict->SetInteger("unacked_recv_window_bytes",
1679 session_unacked_recv_window_bytes_); 1684 session_unacked_recv_window_bytes_);
1680 return dict; 1685 return dict;
1681 } 1686 }
1682 1687
1683 bool SpdySession::IsReused() const { 1688 bool SpdySession::IsReused() const {
1684 return buffered_spdy_framer_->frames_received() > 0 || 1689 return buffered_spdy_framer_->frames_received() > 0;
1685 connection_->reuse_type() == ClientSocketHandle::UNUSED_IDLE;
1686 } 1690 }
1687 1691
1688 bool SpdySession::GetLoadTimingInfo(SpdyStreamId stream_id, 1692 bool SpdySession::GetLoadTimingInfo(SpdyStreamId stream_id,
1689 LoadTimingInfo* load_timing_info) const { 1693 LoadTimingInfo* load_timing_info) const {
1690 return connection_->GetLoadTimingInfo(stream_id != kFirstStreamId, 1694 return connection_->GetLoadTimingInfo(stream_id != kFirstStreamId,
1691 load_timing_info); 1695 load_timing_info);
1692 } 1696 }
1693 1697
1694 int SpdySession::GetPeerAddress(IPEndPoint* address) const { 1698 int SpdySession::GetPeerAddress(IPEndPoint* address) const {
1695 int rv = ERR_SOCKET_NOT_CONNECTED; 1699 int rv = ERR_SOCKET_NOT_CONNECTED;
(...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after
3043 if (!queue->empty()) { 3047 if (!queue->empty()) {
3044 SpdyStreamId stream_id = queue->front(); 3048 SpdyStreamId stream_id = queue->front();
3045 queue->pop_front(); 3049 queue->pop_front();
3046 return stream_id; 3050 return stream_id;
3047 } 3051 }
3048 } 3052 }
3049 return 0; 3053 return 0;
3050 } 3054 }
3051 3055
3052 } // namespace net 3056 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_session.h ('k') | net/spdy/spdy_session_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698