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

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

Issue 200723004: 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 Error SpdySession::InitializeWithSocket( 535 void 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 int error = DoReadLoop(READ_STATE_DO_READ, OK); 596 DCHECK_NE(availability_state_, STATE_CLOSED);
597 if (error == ERR_IO_PENDING) 597 connection_->AddHigherLayeredPool(this);
598 error = OK; 598 if (enable_sending_initial_data_)
599 if (error == OK) { 599 SendInitialData();
600 DCHECK_NE(availability_state_, STATE_CLOSED); 600 pool_ = pool;
601 connection_->AddHigherLayeredPool(this); 601
602 if (enable_sending_initial_data_) 602 // Bootstrap the read loop.
603 SendInitialData(); 603 base::MessageLoop::current()->PostTask(
604 pool_ = pool; 604 FROM_HERE,
605 } else { 605 base::Bind(&SpdySession::PumpReadLoop,
606 DcheckClosed(); 606 weak_factory_.GetWeakPtr(), READ_STATE_DO_READ, OK));
607 }
608 return static_cast<Error>(error);
609 } 607 }
610 608
611 bool SpdySession::VerifyDomainAuthentication(const std::string& domain) { 609 bool SpdySession::VerifyDomainAuthentication(const std::string& domain) {
612 if (!verify_domain_authentication_) 610 if (!verify_domain_authentication_)
613 return true; 611 return true;
614 612
615 if (availability_state_ == STATE_CLOSED) 613 if (availability_state_ == STATE_CLOSED)
616 return false; 614 return false;
617 615
618 SSLInfo ssl_info; 616 SSLInfo ssl_info;
(...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 return SESSION_ALREADY_CLOSED; 1545 return SESSION_ALREADY_CLOSED;
1548 1546
1549 net_log_.AddEvent( 1547 net_log_.AddEvent(
1550 NetLog::TYPE_SPDY_SESSION_CLOSE, 1548 NetLog::TYPE_SPDY_SESSION_CLOSE,
1551 base::Bind(&NetLogSpdySessionCloseCallback, err, &description)); 1549 base::Bind(&NetLogSpdySessionCloseCallback, err, &description));
1552 1550
1553 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SpdySession.ClosedOnError", -err); 1551 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SpdySession.ClosedOnError", -err);
1554 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySession.BytesRead.OtherErrors", 1552 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySession.BytesRead.OtherErrors",
1555 total_bytes_received_, 1, 100000000, 50); 1553 total_bytes_received_, 1, 100000000, 50);
1556 1554
1557 // |pool_| will be NULL when |InitializeWithSocket()| is in the 1555 DCHECK(pool_);
1558 // call stack. 1556 if (availability_state_ != STATE_GOING_AWAY)
1559 if (pool_ && availability_state_ != STATE_GOING_AWAY)
1560 pool_->MakeSessionUnavailable(GetWeakPtr()); 1557 pool_->MakeSessionUnavailable(GetWeakPtr());
1561 1558
1562 availability_state_ = STATE_CLOSED; 1559 availability_state_ = STATE_CLOSED;
1563 error_on_close_ = err; 1560 error_on_close_ = err;
1564 1561
1565 StartGoingAway(0, err); 1562 StartGoingAway(0, err);
1566 write_queue_.Clear(); 1563 write_queue_.Clear();
1567 1564
1568 DcheckClosed(); 1565 DcheckClosed();
1569 1566
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 void SpdySession::CloseSessionOnError(Error err, 1618 void SpdySession::CloseSessionOnError(Error err,
1622 const std::string& description) { 1619 const std::string& description) {
1623 // We may be called from anywhere, so we can't expect a particular 1620 // We may be called from anywhere, so we can't expect a particular
1624 // return value. 1621 // return value.
1625 ignore_result(DoCloseSession(err, description)); 1622 ignore_result(DoCloseSession(err, description));
1626 } 1623 }
1627 1624
1628 void SpdySession::MakeUnavailable() { 1625 void SpdySession::MakeUnavailable() {
1629 if (availability_state_ < STATE_GOING_AWAY) { 1626 if (availability_state_ < STATE_GOING_AWAY) {
1630 availability_state_ = STATE_GOING_AWAY; 1627 availability_state_ = STATE_GOING_AWAY;
1631 // |pool_| will be NULL when |InitializeWithSocket()| is in the 1628 DCHECK(pool_);
1632 // call stack. 1629 pool_->MakeSessionUnavailable(GetWeakPtr());
1633 if (pool_)
1634 pool_->MakeSessionUnavailable(GetWeakPtr());
1635 } 1630 }
1636 } 1631 }
1637 1632
1638 base::Value* SpdySession::GetInfoAsValue() const { 1633 base::Value* SpdySession::GetInfoAsValue() const {
1639 base::DictionaryValue* dict = new base::DictionaryValue(); 1634 base::DictionaryValue* dict = new base::DictionaryValue();
1640 1635
1641 dict->SetInteger("source_id", net_log_.source().id); 1636 dict->SetInteger("source_id", net_log_.source().id);
1642 1637
1643 dict->SetString("host_port_pair", host_port_pair().ToString()); 1638 dict->SetString("host_port_pair", host_port_pair().ToString());
1644 if (!pooled_aliases_.empty()) { 1639 if (!pooled_aliases_.empty()) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1679 dict->SetBoolean("received_settings", received_settings_); 1674 dict->SetBoolean("received_settings", received_settings_);
1680 1675
1681 dict->SetInteger("send_window_size", session_send_window_size_); 1676 dict->SetInteger("send_window_size", session_send_window_size_);
1682 dict->SetInteger("recv_window_size", session_recv_window_size_); 1677 dict->SetInteger("recv_window_size", session_recv_window_size_);
1683 dict->SetInteger("unacked_recv_window_bytes", 1678 dict->SetInteger("unacked_recv_window_bytes",
1684 session_unacked_recv_window_bytes_); 1679 session_unacked_recv_window_bytes_);
1685 return dict; 1680 return dict;
1686 } 1681 }
1687 1682
1688 bool SpdySession::IsReused() const { 1683 bool SpdySession::IsReused() const {
1689 return buffered_spdy_framer_->frames_received() > 0; 1684 return buffered_spdy_framer_->frames_received() > 0 ||
1685 connection_->reuse_type() == ClientSocketHandle::UNUSED_IDLE;
1690 } 1686 }
1691 1687
1692 bool SpdySession::GetLoadTimingInfo(SpdyStreamId stream_id, 1688 bool SpdySession::GetLoadTimingInfo(SpdyStreamId stream_id,
1693 LoadTimingInfo* load_timing_info) const { 1689 LoadTimingInfo* load_timing_info) const {
1694 return connection_->GetLoadTimingInfo(stream_id != kFirstStreamId, 1690 return connection_->GetLoadTimingInfo(stream_id != kFirstStreamId,
1695 load_timing_info); 1691 load_timing_info);
1696 } 1692 }
1697 1693
1698 int SpdySession::GetPeerAddress(IPEndPoint* address) const { 1694 int SpdySession::GetPeerAddress(IPEndPoint* address) const {
1699 int rv = ERR_SOCKET_NOT_CONNECTED; 1695 int rv = ERR_SOCKET_NOT_CONNECTED;
(...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after
3047 if (!queue->empty()) { 3043 if (!queue->empty()) {
3048 SpdyStreamId stream_id = queue->front(); 3044 SpdyStreamId stream_id = queue->front();
3049 queue->pop_front(); 3045 queue->pop_front();
3050 return stream_id; 3046 return stream_id;
3051 } 3047 }
3052 } 3048 }
3053 return 0; 3049 return 0;
3054 } 3050 }
3055 3051
3056 } // namespace net 3052 } // 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