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

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

Issue 2315613002: Extracted NetLog class's inner enum types into their own enum classes and (Closed)
Patch Set: Created 4 years, 3 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
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 <limits> 8 #include <limits>
9 #include <map> 9 #include <map>
10 #include <utility> 10 #include <utility>
(...skipping 20 matching lines...) Expand all
31 #include "net/base/proxy_delegate.h" 31 #include "net/base/proxy_delegate.h"
32 #include "net/cert/asn1_util.h" 32 #include "net/cert/asn1_util.h"
33 #include "net/cert/cert_verify_result.h" 33 #include "net/cert/cert_verify_result.h"
34 #include "net/cert/ct_policy_status.h" 34 #include "net/cert/ct_policy_status.h"
35 #include "net/http/http_log_util.h" 35 #include "net/http/http_log_util.h"
36 #include "net/http/http_network_session.h" 36 #include "net/http/http_network_session.h"
37 #include "net/http/http_server_properties.h" 37 #include "net/http/http_server_properties.h"
38 #include "net/http/http_util.h" 38 #include "net/http/http_util.h"
39 #include "net/http/transport_security_state.h" 39 #include "net/http/transport_security_state.h"
40 #include "net/log/net_log.h" 40 #include "net/log/net_log.h"
41 #include "net/log/net_log_event_type.h"
42 #include "net/log/net_log_source_type.h"
41 #include "net/proxy/proxy_server.h" 43 #include "net/proxy/proxy_server.h"
42 #include "net/socket/ssl_client_socket.h" 44 #include "net/socket/ssl_client_socket.h"
43 #include "net/spdy/spdy_buffer_producer.h" 45 #include "net/spdy/spdy_buffer_producer.h"
44 #include "net/spdy/spdy_frame_builder.h" 46 #include "net/spdy/spdy_frame_builder.h"
45 #include "net/spdy/spdy_http_utils.h" 47 #include "net/spdy/spdy_http_utils.h"
46 #include "net/spdy/spdy_protocol.h" 48 #include "net/spdy/spdy_protocol.h"
47 #include "net/spdy/spdy_session_pool.h" 49 #include "net/spdy/spdy_session_pool.h"
48 #include "net/spdy/spdy_stream.h" 50 #include "net/spdy/spdy_stream.h"
49 #include "net/ssl/channel_id_service.h" 51 #include "net/ssl/channel_id_service.h"
50 #include "net/ssl/ssl_cipher_suite_names.h" 52 #include "net/ssl/ssl_cipher_suite_names.h"
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 next_ping_id_(1), 665 next_ping_id_(1),
664 last_activity_time_(time_func()), 666 last_activity_time_(time_func()),
665 last_compressed_frame_len_(0), 667 last_compressed_frame_len_(0),
666 check_ping_status_pending_(false), 668 check_ping_status_pending_(false),
667 session_send_window_size_(0), 669 session_send_window_size_(0),
668 session_max_recv_window_size_(session_max_recv_window_size), 670 session_max_recv_window_size_(session_max_recv_window_size),
669 session_recv_window_size_(0), 671 session_recv_window_size_(0),
670 session_unacked_recv_window_bytes_(0), 672 session_unacked_recv_window_bytes_(0),
671 stream_initial_send_window_size_(kDefaultInitialWindowSize), 673 stream_initial_send_window_size_(kDefaultInitialWindowSize),
672 stream_max_recv_window_size_(stream_max_recv_window_size), 674 stream_max_recv_window_size_(stream_max_recv_window_size),
673 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_HTTP2_SESSION)), 675 net_log_(BoundNetLog::Make(net_log, NetLogSourceType::HTTP2_SESSION)),
674 verify_domain_authentication_(verify_domain_authentication), 676 verify_domain_authentication_(verify_domain_authentication),
675 enable_sending_initial_data_(enable_sending_initial_data), 677 enable_sending_initial_data_(enable_sending_initial_data),
676 enable_ping_based_connection_checking_( 678 enable_ping_based_connection_checking_(
677 enable_ping_based_connection_checking), 679 enable_ping_based_connection_checking),
678 connection_at_risk_of_loss_time_( 680 connection_at_risk_of_loss_time_(
679 base::TimeDelta::FromSeconds(kDefaultConnectionAtRiskOfLossSeconds)), 681 base::TimeDelta::FromSeconds(kDefaultConnectionAtRiskOfLossSeconds)),
680 hung_interval_(base::TimeDelta::FromSeconds(kHungIntervalSeconds)), 682 hung_interval_(base::TimeDelta::FromSeconds(kHungIntervalSeconds)),
681 proxy_delegate_(proxy_delegate), 683 proxy_delegate_(proxy_delegate),
682 time_func_(time_func), 684 time_func_(time_func),
683 weak_factory_(this) { 685 weak_factory_(this) {
684 net_log_.BeginEvent( 686 net_log_.BeginEvent(
685 NetLog::TYPE_HTTP2_SESSION, 687 NetLogEventType::HTTP2_SESSION,
686 base::Bind(&NetLogSpdySessionCallback, &host_port_proxy_pair())); 688 base::Bind(&NetLogSpdySessionCallback, &host_port_proxy_pair()));
687 next_unclaimed_push_stream_sweep_time_ = time_func_() + 689 next_unclaimed_push_stream_sweep_time_ = time_func_() +
688 base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds); 690 base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds);
689 // TODO(mbelshe): consider randomization of the stream_hi_water_mark. 691 // TODO(mbelshe): consider randomization of the stream_hi_water_mark.
690 } 692 }
691 693
692 SpdySession::~SpdySession() { 694 SpdySession::~SpdySession() {
693 CHECK(!in_io_loop_); 695 CHECK(!in_io_loop_);
694 DcheckDraining(); 696 DcheckDraining();
695 697
696 // TODO(akalin): Check connection->is_initialized() instead. This 698 // TODO(akalin): Check connection->is_initialized() instead. This
697 // requires re-working CreateFakeSpdySession(), though. 699 // requires re-working CreateFakeSpdySession(), though.
698 DCHECK(connection_->socket()); 700 DCHECK(connection_->socket());
699 // With SPDY we can't recycle sockets. 701 // With SPDY we can't recycle sockets.
700 connection_->socket()->Disconnect(); 702 connection_->socket()->Disconnect();
701 703
702 RecordHistograms(); 704 RecordHistograms();
703 705
704 net_log_.EndEvent(NetLog::TYPE_HTTP2_SESSION); 706 net_log_.EndEvent(NetLogEventType::HTTP2_SESSION);
705 } 707 }
706 708
707 void SpdySession::InitializeWithSocket( 709 void SpdySession::InitializeWithSocket(
708 std::unique_ptr<ClientSocketHandle> connection, 710 std::unique_ptr<ClientSocketHandle> connection,
709 SpdySessionPool* pool, 711 SpdySessionPool* pool,
710 bool is_secure, 712 bool is_secure,
711 int certificate_error_code) { 713 int certificate_error_code) {
712 CHECK(!in_io_loop_); 714 CHECK(!in_io_loop_);
713 DCHECK_EQ(availability_state_, STATE_AVAILABLE); 715 DCHECK_EQ(availability_state_, STATE_AVAILABLE);
714 DCHECK_EQ(read_state_, READ_STATE_DO_READ); 716 DCHECK_EQ(read_state_, READ_STATE_DO_READ);
(...skipping 11 matching lines...) Expand all
726 certificate_error_code_ = certificate_error_code; 728 certificate_error_code_ = certificate_error_code;
727 729
728 session_send_window_size_ = kDefaultInitialWindowSize; 730 session_send_window_size_ = kDefaultInitialWindowSize;
729 session_recv_window_size_ = kDefaultInitialWindowSize; 731 session_recv_window_size_ = kDefaultInitialWindowSize;
730 732
731 buffered_spdy_framer_.reset(new BufferedSpdyFramer()); 733 buffered_spdy_framer_.reset(new BufferedSpdyFramer());
732 buffered_spdy_framer_->set_visitor(this); 734 buffered_spdy_framer_->set_visitor(this);
733 buffered_spdy_framer_->set_debug_visitor(this); 735 buffered_spdy_framer_->set_debug_visitor(this);
734 buffered_spdy_framer_->UpdateHeaderDecoderTableSize(kMaxHeaderTableSize); 736 buffered_spdy_framer_->UpdateHeaderDecoderTableSize(kMaxHeaderTableSize);
735 737
736 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_INITIALIZED, 738 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_INITIALIZED,
737 base::Bind(&NetLogSpdyInitializedCallback, 739 base::Bind(&NetLogSpdyInitializedCallback,
738 connection_->socket()->NetLog().source())); 740 connection_->socket()->NetLog().source()));
739 741
740 DCHECK_EQ(availability_state_, STATE_AVAILABLE); 742 DCHECK_EQ(availability_state_, STATE_AVAILABLE);
741 connection_->AddHigherLayeredPool(this); 743 connection_->AddHigherLayeredPool(this);
742 if (enable_sending_initial_data_) 744 if (enable_sending_initial_data_)
743 SendInitialData(); 745 SendInitialData();
744 pool_ = pool; 746 pool_ = pool;
745 747
746 // Bootstrap the read loop. 748 // Bootstrap the read loop.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 Error err = TryAccessStream(request->url()); 822 Error err = TryAccessStream(request->url());
821 if (err != OK) 823 if (err != OK)
822 return err; 824 return err;
823 825
824 if ((active_streams_.size() + created_streams_.size() - num_pushed_streams_ < 826 if ((active_streams_.size() + created_streams_.size() - num_pushed_streams_ <
825 max_concurrent_streams_)) { 827 max_concurrent_streams_)) {
826 return CreateStream(*request, stream); 828 return CreateStream(*request, stream);
827 } 829 }
828 830
829 stalled_streams_++; 831 stalled_streams_++;
830 net_log().AddEvent(NetLog::TYPE_HTTP2_SESSION_STALLED_MAX_STREAMS); 832 net_log().AddEvent(NetLogEventType::HTTP2_SESSION_STALLED_MAX_STREAMS);
831 RequestPriority priority = request->priority(); 833 RequestPriority priority = request->priority();
832 CHECK_GE(priority, MINIMUM_PRIORITY); 834 CHECK_GE(priority, MINIMUM_PRIORITY);
833 CHECK_LE(priority, MAXIMUM_PRIORITY); 835 CHECK_LE(priority, MAXIMUM_PRIORITY);
834 pending_create_stream_queues_[priority].push_back(request); 836 pending_create_stream_queues_[priority].push_back(request);
835 return ERR_IO_PENDING; 837 return ERR_IO_PENDING;
836 } 838 }
837 839
838 int SpdySession::CreateStream(const SpdyStreamRequest& request, 840 int SpdySession::CreateStream(const SpdyStreamRequest& request,
839 base::WeakPtr<SpdyStream>* stream) { 841 base::WeakPtr<SpdyStream>* stream) {
840 DCHECK_GE(request.priority(), MINIMUM_PRIORITY); 842 DCHECK_GE(request.priority(), MINIMUM_PRIORITY);
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 bool has_priority = true; 1011 bool has_priority = true;
1010 int weight = Spdy3PriorityToHttp2Weight(spdy_priority); 1012 int weight = Spdy3PriorityToHttp2Weight(spdy_priority);
1011 SpdyStreamId dependent_stream_id = 0; 1013 SpdyStreamId dependent_stream_id = 0;
1012 bool exclusive = false; 1014 bool exclusive = false;
1013 1015
1014 priority_dependency_state_.OnStreamSynSent(stream_id, spdy_priority, 1016 priority_dependency_state_.OnStreamSynSent(stream_id, spdy_priority,
1015 &dependent_stream_id, &exclusive); 1017 &dependent_stream_id, &exclusive);
1016 1018
1017 if (net_log().IsCapturing()) { 1019 if (net_log().IsCapturing()) {
1018 net_log().AddEvent( 1020 net_log().AddEvent(
1019 NetLog::TYPE_HTTP2_SESSION_SEND_HEADERS, 1021 NetLogEventType::HTTP2_SESSION_SEND_HEADERS,
1020 base::Bind(&NetLogSpdyHeadersSentCallback, &block, 1022 base::Bind(&NetLogSpdyHeadersSentCallback, &block,
1021 (flags & CONTROL_FLAG_FIN) != 0, stream_id, has_priority, 1023 (flags & CONTROL_FLAG_FIN) != 0, stream_id, has_priority,
1022 weight, dependent_stream_id, exclusive)); 1024 weight, dependent_stream_id, exclusive));
1023 } 1025 }
1024 1026
1025 SpdyHeadersIR headers(stream_id, std::move(block)); 1027 SpdyHeadersIR headers(stream_id, std::move(block));
1026 headers.set_has_priority(has_priority); 1028 headers.set_has_priority(has_priority);
1027 headers.set_weight(weight); 1029 headers.set_weight(weight);
1028 headers.set_parent_stream_id(dependent_stream_id); 1030 headers.set_parent_stream_id(dependent_stream_id);
1029 headers.set_exclusive(exclusive); 1031 headers.set_exclusive(exclusive);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 frame_flow_control_state, 1085 frame_flow_control_state,
1084 SEND_STALLED_BY_STREAM_AND_SESSION + 1); 1086 SEND_STALLED_BY_STREAM_AND_SESSION + 1);
1085 1087
1086 // Obey send window size of the stream. 1088 // Obey send window size of the stream.
1087 if (send_stalled_by_stream) { 1089 if (send_stalled_by_stream) {
1088 stream->set_send_stalled_by_flow_control(true); 1090 stream->set_send_stalled_by_flow_control(true);
1089 // Even though we're currently stalled only by the stream, we 1091 // Even though we're currently stalled only by the stream, we
1090 // might end up being stalled by the session also. 1092 // might end up being stalled by the session also.
1091 QueueSendStalledStream(*stream); 1093 QueueSendStalledStream(*stream);
1092 net_log().AddEvent( 1094 net_log().AddEvent(
1093 NetLog::TYPE_HTTP2_SESSION_STREAM_STALLED_BY_STREAM_SEND_WINDOW, 1095 NetLogEventType::HTTP2_SESSION_STREAM_STALLED_BY_STREAM_SEND_WINDOW,
1094 NetLog::IntCallback("stream_id", stream_id)); 1096 NetLog::IntCallback("stream_id", stream_id));
1095 return std::unique_ptr<SpdyBuffer>(); 1097 return std::unique_ptr<SpdyBuffer>();
1096 } 1098 }
1097 1099
1098 effective_len = std::min(effective_len, stream->send_window_size()); 1100 effective_len = std::min(effective_len, stream->send_window_size());
1099 1101
1100 // Obey send window size of the session. 1102 // Obey send window size of the session.
1101 if (send_stalled_by_session) { 1103 if (send_stalled_by_session) {
1102 stream->set_send_stalled_by_flow_control(true); 1104 stream->set_send_stalled_by_flow_control(true);
1103 QueueSendStalledStream(*stream); 1105 QueueSendStalledStream(*stream);
1104 net_log().AddEvent( 1106 net_log().AddEvent(
1105 NetLog::TYPE_HTTP2_SESSION_STREAM_STALLED_BY_SESSION_SEND_WINDOW, 1107 NetLogEventType::HTTP2_SESSION_STREAM_STALLED_BY_SESSION_SEND_WINDOW,
1106 NetLog::IntCallback("stream_id", stream_id)); 1108 NetLog::IntCallback("stream_id", stream_id));
1107 return std::unique_ptr<SpdyBuffer>(); 1109 return std::unique_ptr<SpdyBuffer>();
1108 } 1110 }
1109 1111
1110 effective_len = std::min(effective_len, session_send_window_size_); 1112 effective_len = std::min(effective_len, session_send_window_size_);
1111 1113
1112 DCHECK_GE(effective_len, 0); 1114 DCHECK_GE(effective_len, 0);
1113 1115
1114 // Clear FIN flag if only some of the data will be in the data 1116 // Clear FIN flag if only some of the data will be in the data
1115 // frame. 1117 // frame.
1116 if (effective_len < len) 1118 if (effective_len < len)
1117 flags = static_cast<SpdyDataFlags>(flags & ~DATA_FLAG_FIN); 1119 flags = static_cast<SpdyDataFlags>(flags & ~DATA_FLAG_FIN);
1118 1120
1119 if (net_log().IsCapturing()) { 1121 if (net_log().IsCapturing()) {
1120 net_log().AddEvent(NetLog::TYPE_HTTP2_SESSION_SEND_DATA, 1122 net_log().AddEvent(NetLogEventType::HTTP2_SESSION_SEND_DATA,
1121 base::Bind(&NetLogSpdyDataCallback, stream_id, 1123 base::Bind(&NetLogSpdyDataCallback, stream_id,
1122 effective_len, (flags & DATA_FLAG_FIN) != 0)); 1124 effective_len, (flags & DATA_FLAG_FIN) != 0));
1123 } 1125 }
1124 1126
1125 // Send PrefacePing for DATA_FRAMEs with nonzero payload size. 1127 // Send PrefacePing for DATA_FRAMEs with nonzero payload size.
1126 if (effective_len > 0) 1128 if (effective_len > 0)
1127 SendPrefacePingIfNoneInFlight(); 1129 SendPrefacePingIfNoneInFlight();
1128 1130
1129 // TODO(mbelshe): reduce memory copies here. 1131 // TODO(mbelshe): reduce memory copies here.
1130 DCHECK(buffered_spdy_framer_.get()); 1132 DCHECK(buffered_spdy_framer_.get());
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 CloseActiveStreamIterator(it, ERR_SPDY_PROTOCOL_ERROR); 1253 CloseActiveStreamIterator(it, ERR_SPDY_PROTOCOL_ERROR);
1252 } 1254 }
1253 1255
1254 void SpdySession::EnqueueResetStreamFrame(SpdyStreamId stream_id, 1256 void SpdySession::EnqueueResetStreamFrame(SpdyStreamId stream_id,
1255 RequestPriority priority, 1257 RequestPriority priority,
1256 SpdyRstStreamStatus status, 1258 SpdyRstStreamStatus status,
1257 const std::string& description) { 1259 const std::string& description) {
1258 DCHECK_NE(stream_id, 0u); 1260 DCHECK_NE(stream_id, 0u);
1259 1261
1260 net_log().AddEvent( 1262 net_log().AddEvent(
1261 NetLog::TYPE_HTTP2_SESSION_SEND_RST_STREAM, 1263 NetLogEventType::HTTP2_SESSION_SEND_RST_STREAM,
1262 base::Bind(&NetLogSpdyRstCallback, stream_id, status, &description)); 1264 base::Bind(&NetLogSpdyRstCallback, stream_id, status, &description));
1263 1265
1264 DCHECK(buffered_spdy_framer_.get()); 1266 DCHECK(buffered_spdy_framer_.get());
1265 std::unique_ptr<SpdySerializedFrame> rst_frame( 1267 std::unique_ptr<SpdySerializedFrame> rst_frame(
1266 buffered_spdy_framer_->CreateRstStream(stream_id, status)); 1268 buffered_spdy_framer_->CreateRstStream(stream_id, status));
1267 1269
1268 EnqueueSessionWrite(priority, RST_STREAM, std::move(rst_frame)); 1270 EnqueueSessionWrite(priority, RST_STREAM, std::move(rst_frame));
1269 RecordProtocolErrorHistogram(MapRstStreamStatusToProtocolError(status)); 1271 RecordProtocolErrorHistogram(MapRstStreamStatusToProtocolError(status));
1270 } 1272 }
1271 1273
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1664 EnqueueSessionWrite( 1666 EnqueueSessionWrite(
1665 HIGHEST, GOAWAY, 1667 HIGHEST, GOAWAY,
1666 std::unique_ptr<SpdySerializedFrame>(new SpdySerializedFrame( 1668 std::unique_ptr<SpdySerializedFrame>(new SpdySerializedFrame(
1667 buffered_spdy_framer_->SerializeFrame(goaway_ir)))); 1669 buffered_spdy_framer_->SerializeFrame(goaway_ir))));
1668 } 1670 }
1669 1671
1670 availability_state_ = STATE_DRAINING; 1672 availability_state_ = STATE_DRAINING;
1671 error_on_close_ = err; 1673 error_on_close_ = err;
1672 1674
1673 net_log_.AddEvent( 1675 net_log_.AddEvent(
1674 NetLog::TYPE_HTTP2_SESSION_CLOSE, 1676 NetLogEventType::HTTP2_SESSION_CLOSE,
1675 base::Bind(&NetLogSpdySessionCloseCallback, err, &description)); 1677 base::Bind(&NetLogSpdySessionCloseCallback, err, &description));
1676 1678
1677 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SpdySession.ClosedOnError", -err); 1679 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SpdySession.ClosedOnError", -err);
1678 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySession.BytesRead.OtherErrors", 1680 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySession.BytesRead.OtherErrors",
1679 total_bytes_received_, 1, 100000000, 50); 1681 total_bytes_received_, 1, 100000000, 50);
1680 1682
1681 if (err == OK) { 1683 if (err == OK) {
1682 // We ought to be going away already, as this is a graceful close. 1684 // We ought to be going away already, as this is a graceful close.
1683 DcheckGoingAway(); 1685 DcheckGoingAway();
1684 } else { 1686 } else {
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1909 1911
1910 SpdyStreamId stream_id = unclaimed_it->second.stream_id; 1912 SpdyStreamId stream_id = unclaimed_it->second.stream_id;
1911 unclaimed_pushed_streams_.erase(unclaimed_it); 1913 unclaimed_pushed_streams_.erase(unclaimed_it);
1912 1914
1913 ActiveStreamMap::iterator active_it = active_streams_.find(stream_id); 1915 ActiveStreamMap::iterator active_it = active_streams_.find(stream_id);
1914 if (active_it == active_streams_.end()) { 1916 if (active_it == active_streams_.end()) {
1915 NOTREACHED(); 1917 NOTREACHED();
1916 return base::WeakPtr<SpdyStream>(); 1918 return base::WeakPtr<SpdyStream>();
1917 } 1919 }
1918 1920
1919 net_log_.AddEvent(NetLog::TYPE_HTTP2_STREAM_ADOPTED_PUSH_STREAM, 1921 net_log_.AddEvent(NetLogEventType::HTTP2_STREAM_ADOPTED_PUSH_STREAM,
1920 base::Bind(&NetLogSpdyAdoptedPushStreamCallback, 1922 base::Bind(&NetLogSpdyAdoptedPushStreamCallback,
1921 active_it->second.stream->stream_id(), &url)); 1923 active_it->second.stream->stream_id(), &url));
1922 return active_it->second.stream->GetWeakPtr(); 1924 return active_it->second.stream->GetWeakPtr();
1923 } 1925 }
1924 1926
1925 url::SchemeHostPort SpdySession::GetServer() { 1927 url::SchemeHostPort SpdySession::GetServer() {
1926 return url::SchemeHostPort(is_secure_ ? "https" : "http", 1928 return url::SchemeHostPort(is_secure_ ? "https" : "http",
1927 host_port_pair().host(), host_port_pair().port()); 1929 host_port_pair().host(), host_port_pair().port());
1928 } 1930 }
1929 1931
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1996 stream->AddRawReceivedBytes(header_len); 1998 stream->AddRawReceivedBytes(header_len);
1997 } 1999 }
1998 2000
1999 void SpdySession::OnStreamFrameData(SpdyStreamId stream_id, 2001 void SpdySession::OnStreamFrameData(SpdyStreamId stream_id,
2000 const char* data, 2002 const char* data,
2001 size_t len) { 2003 size_t len) {
2002 CHECK(in_io_loop_); 2004 CHECK(in_io_loop_);
2003 DCHECK_LT(len, 1u << 24); 2005 DCHECK_LT(len, 1u << 24);
2004 if (net_log().IsCapturing()) { 2006 if (net_log().IsCapturing()) {
2005 net_log().AddEvent( 2007 net_log().AddEvent(
2006 NetLog::TYPE_HTTP2_SESSION_RECV_DATA, 2008 NetLogEventType::HTTP2_SESSION_RECV_DATA,
2007 base::Bind(&NetLogSpdyDataCallback, stream_id, len, false)); 2009 base::Bind(&NetLogSpdyDataCallback, stream_id, len, false));
2008 } 2010 }
2009 2011
2010 // Build the buffer as early as possible so that we go through the 2012 // Build the buffer as early as possible so that we go through the
2011 // session flow control checks and update 2013 // session flow control checks and update
2012 // |unacked_recv_window_bytes_| properly even when the stream is 2014 // |unacked_recv_window_bytes_| properly even when the stream is
2013 // inactive (since the other side has still reduced its session send 2015 // inactive (since the other side has still reduced its session send
2014 // window). 2016 // window).
2015 std::unique_ptr<SpdyBuffer> buffer; 2017 std::unique_ptr<SpdyBuffer> buffer;
2016 if (data) { 2018 if (data) {
(...skipping 25 matching lines...) Expand all
2042 ResetStreamIterator(it, RST_STREAM_PROTOCOL_ERROR, error); 2044 ResetStreamIterator(it, RST_STREAM_PROTOCOL_ERROR, error);
2043 return; 2045 return;
2044 } 2046 }
2045 2047
2046 stream->OnDataReceived(std::move(buffer)); 2048 stream->OnDataReceived(std::move(buffer));
2047 } 2049 }
2048 2050
2049 void SpdySession::OnStreamEnd(SpdyStreamId stream_id) { 2051 void SpdySession::OnStreamEnd(SpdyStreamId stream_id) {
2050 CHECK(in_io_loop_); 2052 CHECK(in_io_loop_);
2051 if (net_log().IsCapturing()) { 2053 if (net_log().IsCapturing()) {
2052 net_log().AddEvent(NetLog::TYPE_HTTP2_SESSION_RECV_DATA, 2054 net_log().AddEvent(NetLogEventType::HTTP2_SESSION_RECV_DATA,
2053 base::Bind(&NetLogSpdyDataCallback, stream_id, 0, true)); 2055 base::Bind(&NetLogSpdyDataCallback, stream_id, 0, true));
2054 } 2056 }
2055 2057
2056 // Build the buffer as early as possible so that we go through the 2058 // Build the buffer as early as possible so that we go through the
2057 // session flow control checks and update 2059 // session flow control checks and update
2058 // |unacked_recv_window_bytes_| properly even when the stream is 2060 // |unacked_recv_window_bytes_| properly even when the stream is
2059 // inactive (since the other side has still reduced its session send 2061 // inactive (since the other side has still reduced its session send
2060 // window). 2062 // window).
2061 std::unique_ptr<SpdyBuffer> buffer; 2063 std::unique_ptr<SpdyBuffer> buffer;
2062 2064
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2095 it->second.stream->OnPaddingConsumed(len); 2097 it->second.stream->OnPaddingConsumed(len);
2096 } 2098 }
2097 2099
2098 void SpdySession::OnSettings(bool clear_persisted) { 2100 void SpdySession::OnSettings(bool clear_persisted) {
2099 CHECK(in_io_loop_); 2101 CHECK(in_io_loop_);
2100 2102
2101 if (clear_persisted) 2103 if (clear_persisted)
2102 http_server_properties_->ClearSpdySettings(GetServer()); 2104 http_server_properties_->ClearSpdySettings(GetServer());
2103 2105
2104 if (net_log_.IsCapturing()) { 2106 if (net_log_.IsCapturing()) {
2105 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_RECV_SETTINGS, 2107 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_RECV_SETTINGS,
2106 base::Bind(&NetLogSpdySettingsCallback, host_port_pair(), 2108 base::Bind(&NetLogSpdySettingsCallback, host_port_pair(),
2107 clear_persisted)); 2109 clear_persisted));
2108 } 2110 }
2109 2111
2110 // Send an acknowledgment of the setting. 2112 // Send an acknowledgment of the setting.
2111 SpdySettingsIR settings_ir; 2113 SpdySettingsIR settings_ir;
2112 settings_ir.set_is_ack(true); 2114 settings_ir.set_is_ack(true);
2113 EnqueueSessionWrite( 2115 EnqueueSessionWrite(
2114 HIGHEST, SETTINGS, 2116 HIGHEST, SETTINGS,
2115 std::unique_ptr<SpdySerializedFrame>(new SpdySerializedFrame( 2117 std::unique_ptr<SpdySerializedFrame>(new SpdySerializedFrame(
2116 buffered_spdy_framer_->SerializeFrame(settings_ir)))); 2118 buffered_spdy_framer_->SerializeFrame(settings_ir))));
2117 } 2119 }
2118 2120
2119 void SpdySession::OnSetting(SpdySettingsIds id, uint8_t flags, uint32_t value) { 2121 void SpdySession::OnSetting(SpdySettingsIds id, uint8_t flags, uint32_t value) {
2120 CHECK(in_io_loop_); 2122 CHECK(in_io_loop_);
2121 2123
2122 HandleSetting(id, value); 2124 HandleSetting(id, value);
2123 http_server_properties_->SetSpdySetting( 2125 http_server_properties_->SetSpdySetting(
2124 GetServer(), id, static_cast<SpdySettingsFlags>(flags), value); 2126 GetServer(), id, static_cast<SpdySettingsFlags>(flags), value);
2125 received_settings_ = true; 2127 received_settings_ = true;
2126 2128
2127 // Log the setting. 2129 // Log the setting.
2128 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_RECV_SETTING, 2130 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_RECV_SETTING,
2129 base::Bind(&NetLogSpdySettingCallback, id, 2131 base::Bind(&NetLogSpdySettingCallback, id,
2130 static_cast<SpdySettingsFlags>(flags), value)); 2132 static_cast<SpdySettingsFlags>(flags), value));
2131 } 2133 }
2132 2134
2133 void SpdySession::OnSendCompressedFrame( 2135 void SpdySession::OnSendCompressedFrame(
2134 SpdyStreamId stream_id, 2136 SpdyStreamId stream_id,
2135 SpdyFrameType type, 2137 SpdyFrameType type,
2136 size_t payload_len, 2138 size_t payload_len,
2137 size_t frame_len) { 2139 size_t frame_len) {
2138 if (type != HEADERS) 2140 if (type != HEADERS)
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
2232 void SpdySession::OnHeaders(SpdyStreamId stream_id, 2234 void SpdySession::OnHeaders(SpdyStreamId stream_id,
2233 bool has_priority, 2235 bool has_priority,
2234 int weight, 2236 int weight,
2235 SpdyStreamId parent_stream_id, 2237 SpdyStreamId parent_stream_id,
2236 bool exclusive, 2238 bool exclusive,
2237 bool fin, 2239 bool fin,
2238 SpdyHeaderBlock headers) { 2240 SpdyHeaderBlock headers) {
2239 CHECK(in_io_loop_); 2241 CHECK(in_io_loop_);
2240 2242
2241 if (net_log().IsCapturing()) { 2243 if (net_log().IsCapturing()) {
2242 net_log().AddEvent(NetLog::TYPE_HTTP2_SESSION_RECV_HEADERS, 2244 net_log().AddEvent(NetLogEventType::HTTP2_SESSION_RECV_HEADERS,
2243 base::Bind(&NetLogSpdyHeadersReceivedCallback, &headers, 2245 base::Bind(&NetLogSpdyHeadersReceivedCallback, &headers,
2244 fin, stream_id)); 2246 fin, stream_id));
2245 } 2247 }
2246 2248
2247 ActiveStreamMap::iterator it = active_streams_.find(stream_id); 2249 ActiveStreamMap::iterator it = active_streams_.find(stream_id);
2248 if (it == active_streams_.end()) { 2250 if (it == active_streams_.end()) {
2249 // NOTE: it may just be that the stream was cancelled. 2251 // NOTE: it may just be that the stream was cancelled.
2250 LOG(WARNING) << "Received HEADERS for invalid stream " << stream_id; 2252 LOG(WARNING) << "Received HEADERS for invalid stream " << stream_id;
2251 return; 2253 return;
2252 } 2254 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2340 2342
2341 return true; 2343 return true;
2342 } 2344 }
2343 2345
2344 void SpdySession::OnRstStream(SpdyStreamId stream_id, 2346 void SpdySession::OnRstStream(SpdyStreamId stream_id,
2345 SpdyRstStreamStatus status) { 2347 SpdyRstStreamStatus status) {
2346 CHECK(in_io_loop_); 2348 CHECK(in_io_loop_);
2347 2349
2348 std::string description; 2350 std::string description;
2349 net_log().AddEvent( 2351 net_log().AddEvent(
2350 NetLog::TYPE_HTTP2_SESSION_RST_STREAM, 2352 NetLogEventType::HTTP2_SESSION_RST_STREAM,
2351 base::Bind(&NetLogSpdyRstCallback, stream_id, status, &description)); 2353 base::Bind(&NetLogSpdyRstCallback, stream_id, status, &description));
2352 2354
2353 ActiveStreamMap::iterator it = active_streams_.find(stream_id); 2355 ActiveStreamMap::iterator it = active_streams_.find(stream_id);
2354 if (it == active_streams_.end()) { 2356 if (it == active_streams_.end()) {
2355 // NOTE: it may just be that the stream was cancelled. 2357 // NOTE: it may just be that the stream was cancelled.
2356 LOG(WARNING) << "Received RST for invalid stream" << stream_id; 2358 LOG(WARNING) << "Received RST for invalid stream" << stream_id;
2357 return; 2359 return;
2358 } 2360 }
2359 2361
2360 CHECK_EQ(it->second.stream->stream_id(), stream_id); 2362 CHECK_EQ(it->second.stream->stream_id(), stream_id);
(...skipping 22 matching lines...) Expand all
2383 } 2385 }
2384 2386
2385 void SpdySession::OnGoAway(SpdyStreamId last_accepted_stream_id, 2387 void SpdySession::OnGoAway(SpdyStreamId last_accepted_stream_id,
2386 SpdyGoAwayStatus status, 2388 SpdyGoAwayStatus status,
2387 base::StringPiece debug_data) { 2389 base::StringPiece debug_data) {
2388 CHECK(in_io_loop_); 2390 CHECK(in_io_loop_);
2389 2391
2390 // TODO(jgraettinger): UMA histogram on |status|. 2392 // TODO(jgraettinger): UMA histogram on |status|.
2391 2393
2392 net_log_.AddEvent( 2394 net_log_.AddEvent(
2393 NetLog::TYPE_HTTP2_SESSION_GOAWAY, 2395 NetLogEventType::HTTP2_SESSION_GOAWAY,
2394 base::Bind(&NetLogSpdyGoAwayCallback, last_accepted_stream_id, 2396 base::Bind(&NetLogSpdyGoAwayCallback, last_accepted_stream_id,
2395 active_streams_.size(), unclaimed_pushed_streams_.size(), 2397 active_streams_.size(), unclaimed_pushed_streams_.size(),
2396 status, debug_data)); 2398 status, debug_data));
2397 MakeUnavailable(); 2399 MakeUnavailable();
2398 if (status == GOAWAY_HTTP_1_1_REQUIRED) { 2400 if (status == GOAWAY_HTTP_1_1_REQUIRED) {
2399 // TODO(bnc): Record histogram with number of open streams capped at 50. 2401 // TODO(bnc): Record histogram with number of open streams capped at 50.
2400 DoDrainSession(ERR_HTTP_1_1_REQUIRED, "HTTP_1_1_REQUIRED for stream."); 2402 DoDrainSession(ERR_HTTP_1_1_REQUIRED, "HTTP_1_1_REQUIRED for stream.");
2401 } else { 2403 } else {
2402 StartGoingAway(last_accepted_stream_id, ERR_ABORTED); 2404 StartGoingAway(last_accepted_stream_id, ERR_ABORTED);
2403 } 2405 }
2404 // This is to handle the case when we already don't have any active 2406 // This is to handle the case when we already don't have any active
2405 // streams (i.e., StartGoingAway() did nothing). Otherwise, we have 2407 // streams (i.e., StartGoingAway() did nothing). Otherwise, we have
2406 // active streams and so the last one being closed will finish the 2408 // active streams and so the last one being closed will finish the
2407 // going away process (see DeleteStream()). 2409 // going away process (see DeleteStream()).
2408 MaybeFinishGoingAway(); 2410 MaybeFinishGoingAway();
2409 } 2411 }
2410 2412
2411 void SpdySession::OnPing(SpdyPingId unique_id, bool is_ack) { 2413 void SpdySession::OnPing(SpdyPingId unique_id, bool is_ack) {
2412 CHECK(in_io_loop_); 2414 CHECK(in_io_loop_);
2413 2415
2414 net_log_.AddEvent( 2416 net_log_.AddEvent(
2415 NetLog::TYPE_HTTP2_SESSION_PING, 2417 NetLogEventType::HTTP2_SESSION_PING,
2416 base::Bind(&NetLogSpdyPingCallback, unique_id, is_ack, "received")); 2418 base::Bind(&NetLogSpdyPingCallback, unique_id, is_ack, "received"));
2417 2419
2418 // Send response to a PING from server. 2420 // Send response to a PING from server.
2419 if (!is_ack) { 2421 if (!is_ack) {
2420 WritePingFrame(unique_id, true); 2422 WritePingFrame(unique_id, true);
2421 return; 2423 return;
2422 } 2424 }
2423 2425
2424 --pings_in_flight_; 2426 --pings_in_flight_;
2425 if (pings_in_flight_ < 0) { 2427 if (pings_in_flight_ < 0) {
2426 RecordProtocolErrorHistogram(PROTOCOL_ERROR_UNEXPECTED_PING); 2428 RecordProtocolErrorHistogram(PROTOCOL_ERROR_UNEXPECTED_PING);
2427 DoDrainSession(ERR_SPDY_PROTOCOL_ERROR, "pings_in_flight_ is < 0."); 2429 DoDrainSession(ERR_SPDY_PROTOCOL_ERROR, "pings_in_flight_ is < 0.");
2428 pings_in_flight_ = 0; 2430 pings_in_flight_ = 0;
2429 return; 2431 return;
2430 } 2432 }
2431 2433
2432 if (pings_in_flight_ > 0) 2434 if (pings_in_flight_ > 0)
2433 return; 2435 return;
2434 2436
2435 // We will record RTT in histogram when there are no more client sent 2437 // We will record RTT in histogram when there are no more client sent
2436 // pings_in_flight_. 2438 // pings_in_flight_.
2437 RecordPingRTTHistogram(time_func_() - last_ping_sent_time_); 2439 RecordPingRTTHistogram(time_func_() - last_ping_sent_time_);
2438 } 2440 }
2439 2441
2440 void SpdySession::OnWindowUpdate(SpdyStreamId stream_id, 2442 void SpdySession::OnWindowUpdate(SpdyStreamId stream_id,
2441 int delta_window_size) { 2443 int delta_window_size) {
2442 CHECK(in_io_loop_); 2444 CHECK(in_io_loop_);
2443 2445
2444 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_RECEIVED_WINDOW_UPDATE_FRAME, 2446 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_RECEIVED_WINDOW_UPDATE_FRAME,
2445 base::Bind(&NetLogSpdyWindowUpdateFrameCallback, stream_id, 2447 base::Bind(&NetLogSpdyWindowUpdateFrameCallback, stream_id,
2446 delta_window_size)); 2448 delta_window_size));
2447 2449
2448 if (stream_id == kSessionFlowControlStreamId) { 2450 if (stream_id == kSessionFlowControlStreamId) {
2449 // WINDOW_UPDATE for the session. 2451 // WINDOW_UPDATE for the session.
2450 if (delta_window_size < 1) { 2452 if (delta_window_size < 1) {
2451 RecordProtocolErrorHistogram(PROTOCOL_ERROR_INVALID_WINDOW_UPDATE_SIZE); 2453 RecordProtocolErrorHistogram(PROTOCOL_ERROR_INVALID_WINDOW_UPDATE_SIZE);
2452 DoDrainSession( 2454 DoDrainSession(
2453 ERR_SPDY_PROTOCOL_ERROR, 2455 ERR_SPDY_PROTOCOL_ERROR,
2454 "Received WINDOW_UPDATE with an invalid delta_window_size " + 2456 "Received WINDOW_UPDATE with an invalid delta_window_size " +
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
2667 num_pushed_streams_++; 2669 num_pushed_streams_++;
2668 return true; 2670 return true;
2669 } 2671 }
2670 2672
2671 void SpdySession::OnPushPromise(SpdyStreamId stream_id, 2673 void SpdySession::OnPushPromise(SpdyStreamId stream_id,
2672 SpdyStreamId promised_stream_id, 2674 SpdyStreamId promised_stream_id,
2673 SpdyHeaderBlock headers) { 2675 SpdyHeaderBlock headers) {
2674 CHECK(in_io_loop_); 2676 CHECK(in_io_loop_);
2675 2677
2676 if (net_log_.IsCapturing()) { 2678 if (net_log_.IsCapturing()) {
2677 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_RECV_PUSH_PROMISE, 2679 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_RECV_PUSH_PROMISE,
2678 base::Bind(&NetLogSpdyPushPromiseReceivedCallback, 2680 base::Bind(&NetLogSpdyPushPromiseReceivedCallback,
2679 &headers, stream_id, promised_stream_id)); 2681 &headers, stream_id, promised_stream_id));
2680 } 2682 }
2681 2683
2682 // Any priority will do. 2684 // Any priority will do.
2683 // TODO(baranovich): pass parent stream id priority? 2685 // TODO(baranovich): pass parent stream id priority?
2684 if (!TryCreatePushStream(promised_stream_id, stream_id, 0, 2686 if (!TryCreatePushStream(promised_stream_id, stream_id, 0,
2685 std::move(headers))) 2687 std::move(headers)))
2686 return; 2688 return;
2687 } 2689 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2727 // |session_recv_window_size_| doesn't overflow. 2729 // |session_recv_window_size_| doesn't overflow.
2728 DCHECK_GE(session_max_recv_window_size_, session_recv_window_size_); 2730 DCHECK_GE(session_max_recv_window_size_, session_recv_window_size_);
2729 DCHECK_GE(session_recv_window_size_, 0); 2731 DCHECK_GE(session_recv_window_size_, 0);
2730 if (session_max_recv_window_size_ > session_recv_window_size_) { 2732 if (session_max_recv_window_size_ > session_recv_window_size_) {
2731 IncreaseRecvWindowSize(session_max_recv_window_size_ - 2733 IncreaseRecvWindowSize(session_max_recv_window_size_ -
2732 session_recv_window_size_); 2734 session_recv_window_size_);
2733 } 2735 }
2734 } 2736 }
2735 2737
2736 void SpdySession::SendSettings(const SettingsMap& settings) { 2738 void SpdySession::SendSettings(const SettingsMap& settings) {
2737 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_SEND_SETTINGS, 2739 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_SEND_SETTINGS,
2738 base::Bind(&NetLogSpdySendSettingsCallback, &settings)); 2740 base::Bind(&NetLogSpdySendSettingsCallback, &settings));
2739 // Create the SETTINGS frame and send it. 2741 // Create the SETTINGS frame and send it.
2740 DCHECK(buffered_spdy_framer_.get()); 2742 DCHECK(buffered_spdy_framer_.get());
2741 std::unique_ptr<SpdySerializedFrame> settings_frame( 2743 std::unique_ptr<SpdySerializedFrame> settings_frame(
2742 buffered_spdy_framer_->CreateSettings(settings)); 2744 buffered_spdy_framer_->CreateSettings(settings));
2743 sent_settings_ = true; 2745 sent_settings_ = true;
2744 EnqueueSessionWrite(HIGHEST, SETTINGS, std::move(settings_frame)); 2746 EnqueueSessionWrite(HIGHEST, SETTINGS, std::move(settings_frame));
2745 } 2747 }
2746 2748
2747 void SpdySession::HandleSetting(uint32_t id, uint32_t value) { 2749 void SpdySession::HandleSetting(uint32_t id, uint32_t value) {
2748 switch (id) { 2750 switch (id) {
2749 case SETTINGS_MAX_CONCURRENT_STREAMS: 2751 case SETTINGS_MAX_CONCURRENT_STREAMS:
2750 max_concurrent_streams_ = std::min(static_cast<size_t>(value), 2752 max_concurrent_streams_ = std::min(static_cast<size_t>(value),
2751 kMaxConcurrentStreamLimit); 2753 kMaxConcurrentStreamLimit);
2752 ProcessPendingStreamRequests(); 2754 ProcessPendingStreamRequests();
2753 break; 2755 break;
2754 case SETTINGS_INITIAL_WINDOW_SIZE: { 2756 case SETTINGS_INITIAL_WINDOW_SIZE: {
2755 if (value > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) { 2757 if (value > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) {
2756 net_log().AddEvent( 2758 net_log().AddEvent(
2757 NetLog::TYPE_HTTP2_SESSION_INITIAL_WINDOW_SIZE_OUT_OF_RANGE, 2759 NetLogEventType::HTTP2_SESSION_INITIAL_WINDOW_SIZE_OUT_OF_RANGE,
2758 NetLog::IntCallback("initial_window_size", value)); 2760 NetLog::IntCallback("initial_window_size", value));
2759 return; 2761 return;
2760 } 2762 }
2761 2763
2762 // SETTINGS_INITIAL_WINDOW_SIZE updates initial_send_window_size_ only. 2764 // SETTINGS_INITIAL_WINDOW_SIZE updates initial_send_window_size_ only.
2763 int32_t delta_window_size = 2765 int32_t delta_window_size =
2764 static_cast<int32_t>(value) - stream_initial_send_window_size_; 2766 static_cast<int32_t>(value) - stream_initial_send_window_size_;
2765 stream_initial_send_window_size_ = static_cast<int32_t>(value); 2767 stream_initial_send_window_size_ = static_cast<int32_t>(value);
2766 UpdateStreamsSendWindowSize(delta_window_size); 2768 UpdateStreamsSendWindowSize(delta_window_size);
2767 net_log().AddEvent( 2769 net_log().AddEvent(
2768 NetLog::TYPE_HTTP2_SESSION_UPDATE_STREAMS_SEND_WINDOW_SIZE, 2770 NetLogEventType::HTTP2_SESSION_UPDATE_STREAMS_SEND_WINDOW_SIZE,
2769 NetLog::IntCallback("delta_window_size", delta_window_size)); 2771 NetLog::IntCallback("delta_window_size", delta_window_size));
2770 break; 2772 break;
2771 } 2773 }
2772 } 2774 }
2773 } 2775 }
2774 2776
2775 void SpdySession::UpdateStreamsSendWindowSize(int32_t delta_window_size) { 2777 void SpdySession::UpdateStreamsSendWindowSize(int32_t delta_window_size) {
2776 for (ActiveStreamMap::iterator it = active_streams_.begin(); 2778 for (ActiveStreamMap::iterator it = active_streams_.begin();
2777 it != active_streams_.end(); ++it) { 2779 it != active_streams_.end(); ++it) {
2778 it->second.stream->AdjustSendWindowSize(delta_window_size); 2780 it->second.stream->AdjustSendWindowSize(delta_window_size);
(...skipping 22 matching lines...) Expand all
2801 void SpdySession::SendWindowUpdateFrame(SpdyStreamId stream_id, 2803 void SpdySession::SendWindowUpdateFrame(SpdyStreamId stream_id,
2802 uint32_t delta_window_size, 2804 uint32_t delta_window_size,
2803 RequestPriority priority) { 2805 RequestPriority priority) {
2804 ActiveStreamMap::const_iterator it = active_streams_.find(stream_id); 2806 ActiveStreamMap::const_iterator it = active_streams_.find(stream_id);
2805 if (it != active_streams_.end()) { 2807 if (it != active_streams_.end()) {
2806 CHECK_EQ(it->second.stream->stream_id(), stream_id); 2808 CHECK_EQ(it->second.stream->stream_id(), stream_id);
2807 } else { 2809 } else {
2808 CHECK_EQ(stream_id, kSessionFlowControlStreamId); 2810 CHECK_EQ(stream_id, kSessionFlowControlStreamId);
2809 } 2811 }
2810 2812
2811 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_SENT_WINDOW_UPDATE_FRAME, 2813 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_SENT_WINDOW_UPDATE_FRAME,
2812 base::Bind(&NetLogSpdyWindowUpdateFrameCallback, stream_id, 2814 base::Bind(&NetLogSpdyWindowUpdateFrameCallback, stream_id,
2813 delta_window_size)); 2815 delta_window_size));
2814 2816
2815 DCHECK(buffered_spdy_framer_.get()); 2817 DCHECK(buffered_spdy_framer_.get());
2816 std::unique_ptr<SpdySerializedFrame> window_update_frame( 2818 std::unique_ptr<SpdySerializedFrame> window_update_frame(
2817 buffered_spdy_framer_->CreateWindowUpdate(stream_id, delta_window_size)); 2819 buffered_spdy_framer_->CreateWindowUpdate(stream_id, delta_window_size));
2818 EnqueueSessionWrite(priority, WINDOW_UPDATE, std::move(window_update_frame)); 2820 EnqueueSessionWrite(priority, WINDOW_UPDATE, std::move(window_update_frame));
2819 } 2821 }
2820 2822
2821 void SpdySession::WritePingFrame(SpdyPingId unique_id, bool is_ack) { 2823 void SpdySession::WritePingFrame(SpdyPingId unique_id, bool is_ack) {
2822 DCHECK(buffered_spdy_framer_.get()); 2824 DCHECK(buffered_spdy_framer_.get());
2823 std::unique_ptr<SpdySerializedFrame> ping_frame( 2825 std::unique_ptr<SpdySerializedFrame> ping_frame(
2824 buffered_spdy_framer_->CreatePingFrame(unique_id, is_ack)); 2826 buffered_spdy_framer_->CreatePingFrame(unique_id, is_ack));
2825 EnqueueSessionWrite(HIGHEST, PING, std::move(ping_frame)); 2827 EnqueueSessionWrite(HIGHEST, PING, std::move(ping_frame));
2826 2828
2827 if (net_log().IsCapturing()) { 2829 if (net_log().IsCapturing()) {
2828 net_log().AddEvent( 2830 net_log().AddEvent(
2829 NetLog::TYPE_HTTP2_SESSION_PING, 2831 NetLogEventType::HTTP2_SESSION_PING,
2830 base::Bind(&NetLogSpdyPingCallback, unique_id, is_ack, "sent")); 2832 base::Bind(&NetLogSpdyPingCallback, unique_id, is_ack, "sent"));
2831 } 2833 }
2832 if (!is_ack) { 2834 if (!is_ack) {
2833 next_ping_id_ += 2; 2835 next_ping_id_ += 2;
2834 ++pings_in_flight_; 2836 ++pings_in_flight_;
2835 PlanToCheckPingStatus(); 2837 PlanToCheckPingStatus();
2836 last_ping_sent_time_ = time_func_(); 2838 last_ping_sent_time_ = time_func_();
2837 } 2839 }
2838 } 2840 }
2839 2841
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
3010 ERR_SPDY_PROTOCOL_ERROR, 3012 ERR_SPDY_PROTOCOL_ERROR,
3011 "Received WINDOW_UPDATE [delta: " + 3013 "Received WINDOW_UPDATE [delta: " +
3012 base::IntToString(delta_window_size) + 3014 base::IntToString(delta_window_size) +
3013 "] for session overflows session_send_window_size_ [current: " + 3015 "] for session overflows session_send_window_size_ [current: " +
3014 base::IntToString(session_send_window_size_) + "]"); 3016 base::IntToString(session_send_window_size_) + "]");
3015 return; 3017 return;
3016 } 3018 }
3017 3019
3018 session_send_window_size_ += delta_window_size; 3020 session_send_window_size_ += delta_window_size;
3019 3021
3020 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_UPDATE_SEND_WINDOW, 3022 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_UPDATE_SEND_WINDOW,
3021 base::Bind(&NetLogSpdySessionWindowUpdateCallback, 3023 base::Bind(&NetLogSpdySessionWindowUpdateCallback,
3022 delta_window_size, session_send_window_size_)); 3024 delta_window_size, session_send_window_size_));
3023 3025
3024 DCHECK(!IsSendStalled()); 3026 DCHECK(!IsSendStalled());
3025 ResumeSendStalledStreams(); 3027 ResumeSendStalledStreams();
3026 } 3028 }
3027 3029
3028 void SpdySession::DecreaseSendWindowSize(int32_t delta_window_size) { 3030 void SpdySession::DecreaseSendWindowSize(int32_t delta_window_size) {
3029 // We only call this method when sending a frame. Therefore, 3031 // We only call this method when sending a frame. Therefore,
3030 // |delta_window_size| should be within the valid frame size range. 3032 // |delta_window_size| should be within the valid frame size range.
3031 DCHECK_GE(delta_window_size, 1); 3033 DCHECK_GE(delta_window_size, 1);
3032 DCHECK_LE(delta_window_size, kMaxSpdyFrameChunkSize); 3034 DCHECK_LE(delta_window_size, kMaxSpdyFrameChunkSize);
3033 3035
3034 // |send_window_size_| should have been at least |delta_window_size| for 3036 // |send_window_size_| should have been at least |delta_window_size| for
3035 // this call to happen. 3037 // this call to happen.
3036 DCHECK_GE(session_send_window_size_, delta_window_size); 3038 DCHECK_GE(session_send_window_size_, delta_window_size);
3037 3039
3038 session_send_window_size_ -= delta_window_size; 3040 session_send_window_size_ -= delta_window_size;
3039 3041
3040 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_UPDATE_SEND_WINDOW, 3042 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_UPDATE_SEND_WINDOW,
3041 base::Bind(&NetLogSpdySessionWindowUpdateCallback, 3043 base::Bind(&NetLogSpdySessionWindowUpdateCallback,
3042 -delta_window_size, session_send_window_size_)); 3044 -delta_window_size, session_send_window_size_));
3043 } 3045 }
3044 3046
3045 void SpdySession::OnReadBufferConsumed( 3047 void SpdySession::OnReadBufferConsumed(
3046 size_t consume_size, 3048 size_t consume_size,
3047 SpdyBuffer::ConsumeSource consume_source) { 3049 SpdyBuffer::ConsumeSource consume_source) {
3048 // We can be called with |in_io_loop_| set if a read SpdyBuffer is 3050 // We can be called with |in_io_loop_| set if a read SpdyBuffer is
3049 // deleted (e.g., discarded by a SpdyReadQueue). 3051 // deleted (e.g., discarded by a SpdyReadQueue).
3050 DCHECK_GE(consume_size, 1u); 3052 DCHECK_GE(consume_size, 1u);
3051 DCHECK_LE(consume_size, 3053 DCHECK_LE(consume_size,
3052 static_cast<size_t>(std::numeric_limits<int32_t>::max())); 3054 static_cast<size_t>(std::numeric_limits<int32_t>::max()));
3053 3055
3054 IncreaseRecvWindowSize(static_cast<int32_t>(consume_size)); 3056 IncreaseRecvWindowSize(static_cast<int32_t>(consume_size));
3055 } 3057 }
3056 3058
3057 void SpdySession::IncreaseRecvWindowSize(int32_t delta_window_size) { 3059 void SpdySession::IncreaseRecvWindowSize(int32_t delta_window_size) {
3058 DCHECK_GE(session_unacked_recv_window_bytes_, 0); 3060 DCHECK_GE(session_unacked_recv_window_bytes_, 0);
3059 DCHECK_GE(session_recv_window_size_, session_unacked_recv_window_bytes_); 3061 DCHECK_GE(session_recv_window_size_, session_unacked_recv_window_bytes_);
3060 DCHECK_GE(delta_window_size, 1); 3062 DCHECK_GE(delta_window_size, 1);
3061 // Check for overflow. 3063 // Check for overflow.
3062 DCHECK_LE(delta_window_size, 3064 DCHECK_LE(delta_window_size,
3063 std::numeric_limits<int32_t>::max() - session_recv_window_size_); 3065 std::numeric_limits<int32_t>::max() - session_recv_window_size_);
3064 3066
3065 session_recv_window_size_ += delta_window_size; 3067 session_recv_window_size_ += delta_window_size;
3066 net_log_.AddEvent(NetLog::TYPE_HTTP2_STREAM_UPDATE_RECV_WINDOW, 3068 net_log_.AddEvent(NetLogEventType::HTTP2_STREAM_UPDATE_RECV_WINDOW,
3067 base::Bind(&NetLogSpdySessionWindowUpdateCallback, 3069 base::Bind(&NetLogSpdySessionWindowUpdateCallback,
3068 delta_window_size, session_recv_window_size_)); 3070 delta_window_size, session_recv_window_size_));
3069 3071
3070 session_unacked_recv_window_bytes_ += delta_window_size; 3072 session_unacked_recv_window_bytes_ += delta_window_size;
3071 if (session_unacked_recv_window_bytes_ > session_max_recv_window_size_ / 2) { 3073 if (session_unacked_recv_window_bytes_ > session_max_recv_window_size_ / 2) {
3072 SendWindowUpdateFrame(kSessionFlowControlStreamId, 3074 SendWindowUpdateFrame(kSessionFlowControlStreamId,
3073 session_unacked_recv_window_bytes_, 3075 session_unacked_recv_window_bytes_,
3074 HIGHEST); 3076 HIGHEST);
3075 session_unacked_recv_window_bytes_ = 0; 3077 session_unacked_recv_window_bytes_ = 0;
3076 } 3078 }
(...skipping 12 matching lines...) Expand all
3089 RecordProtocolErrorHistogram(PROTOCOL_ERROR_RECEIVE_WINDOW_VIOLATION); 3091 RecordProtocolErrorHistogram(PROTOCOL_ERROR_RECEIVE_WINDOW_VIOLATION);
3090 DoDrainSession( 3092 DoDrainSession(
3091 ERR_SPDY_FLOW_CONTROL_ERROR, 3093 ERR_SPDY_FLOW_CONTROL_ERROR,
3092 "delta_window_size is " + base::IntToString(delta_window_size) + 3094 "delta_window_size is " + base::IntToString(delta_window_size) +
3093 " in DecreaseRecvWindowSize, which is larger than the receive " + 3095 " in DecreaseRecvWindowSize, which is larger than the receive " +
3094 "window size of " + base::IntToString(session_recv_window_size_)); 3096 "window size of " + base::IntToString(session_recv_window_size_));
3095 return; 3097 return;
3096 } 3098 }
3097 3099
3098 session_recv_window_size_ -= delta_window_size; 3100 session_recv_window_size_ -= delta_window_size;
3099 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_UPDATE_RECV_WINDOW, 3101 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_UPDATE_RECV_WINDOW,
3100 base::Bind(&NetLogSpdySessionWindowUpdateCallback, 3102 base::Bind(&NetLogSpdySessionWindowUpdateCallback,
3101 -delta_window_size, session_recv_window_size_)); 3103 -delta_window_size, session_recv_window_size_));
3102 } 3104 }
3103 3105
3104 void SpdySession::QueueSendStalledStream(const SpdyStream& stream) { 3106 void SpdySession::QueueSendStalledStream(const SpdyStream& stream) {
3105 DCHECK(stream.send_stalled_by_flow_control()); 3107 DCHECK(stream.send_stalled_by_flow_control());
3106 RequestPriority priority = stream.priority(); 3108 RequestPriority priority = stream.priority();
3107 CHECK_GE(priority, MINIMUM_PRIORITY); 3109 CHECK_GE(priority, MINIMUM_PRIORITY);
3108 CHECK_LE(priority, MAXIMUM_PRIORITY); 3110 CHECK_LE(priority, MAXIMUM_PRIORITY);
3109 stream_send_unstall_queue_[priority].push_back(stream.stream_id()); 3111 stream_send_unstall_queue_[priority].push_back(stream.stream_id());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3143 if (!queue->empty()) { 3145 if (!queue->empty()) {
3144 SpdyStreamId stream_id = queue->front(); 3146 SpdyStreamId stream_id = queue->front();
3145 queue->pop_front(); 3147 queue->pop_front();
3146 return stream_id; 3148 return stream_id;
3147 } 3149 }
3148 } 3150 }
3149 return 0; 3151 return 0;
3150 } 3152 }
3151 3153
3152 } // namespace net 3154 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698