| OLD | NEW |
| 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> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 14 #include "base/feature_list.h" |
| 14 #include "base/location.h" | 15 #include "base/location.h" |
| 15 #include "base/logging.h" | 16 #include "base/logging.h" |
| 16 #include "base/memory/ptr_util.h" | 17 #include "base/memory/ptr_util.h" |
| 17 #include "base/metrics/histogram_macros.h" | 18 #include "base/metrics/histogram_macros.h" |
| 18 #include "base/metrics/sparse_histogram.h" | 19 #include "base/metrics/sparse_histogram.h" |
| 19 #include "base/profiler/scoped_tracker.h" | 20 #include "base/profiler/scoped_tracker.h" |
| 20 #include "base/single_thread_task_runner.h" | 21 #include "base/single_thread_task_runner.h" |
| 21 #include "base/stl_util.h" | 22 #include "base/stl_util.h" |
| 22 #include "base/strings/string_number_conversions.h" | 23 #include "base/strings/string_number_conversions.h" |
| 23 #include "base/strings/string_util.h" | 24 #include "base/strings/string_util.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 | 67 |
| 67 // Minimum seconds that unclaimed pushed streams will be kept in memory. | 68 // Minimum seconds that unclaimed pushed streams will be kept in memory. |
| 68 const int kMinPushedStreamLifetimeSeconds = 300; | 69 const int kMinPushedStreamLifetimeSeconds = 300; |
| 69 | 70 |
| 70 // Default initial value for HTTP/2 SETTINGS. | 71 // Default initial value for HTTP/2 SETTINGS. |
| 71 const uint32_t kDefaultInitialHeaderTableSize = 4096; | 72 const uint32_t kDefaultInitialHeaderTableSize = 4096; |
| 72 const uint32_t kDefaultInitialEnablePush = 1; | 73 const uint32_t kDefaultInitialEnablePush = 1; |
| 73 const uint32_t kDefaultInitialInitialWindowSize = 65535; | 74 const uint32_t kDefaultInitialInitialWindowSize = 65535; |
| 74 const uint32_t kDefaultInitialMaxFrameSize = 16384; | 75 const uint32_t kDefaultInitialMaxFrameSize = 16384; |
| 75 | 76 |
| 77 // Experiment to close idle H2 sockets when SpdySession is initialized. |
| 78 const base::Feature kCloseIdleH2SocketsEarlyExperiment{ |
| 79 "CloseIdleH2SocketsEarly", base::FEATURE_DISABLED_BY_DEFAULT}; |
| 80 |
| 76 bool IsSpdySettingAtDefaultInitialValue(SpdySettingsIds setting_id, | 81 bool IsSpdySettingAtDefaultInitialValue(SpdySettingsIds setting_id, |
| 77 uint32_t value) { | 82 uint32_t value) { |
| 78 switch (setting_id) { | 83 switch (setting_id) { |
| 79 case SETTINGS_HEADER_TABLE_SIZE: | 84 case SETTINGS_HEADER_TABLE_SIZE: |
| 80 return value == kDefaultInitialHeaderTableSize; | 85 return value == kDefaultInitialHeaderTableSize; |
| 81 case SETTINGS_ENABLE_PUSH: | 86 case SETTINGS_ENABLE_PUSH: |
| 82 return value == kDefaultInitialEnablePush; | 87 return value == kDefaultInitialEnablePush; |
| 83 case SETTINGS_MAX_CONCURRENT_STREAMS: | 88 case SETTINGS_MAX_CONCURRENT_STREAMS: |
| 84 // There is no initial limit on the number of concurrent streams. | 89 // There is no initial limit on the number of concurrent streams. |
| 85 return false; | 90 return false; |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 new_hostname, ssl_info.cert.get(), ssl_info.public_key_hashes)) { | 710 new_hostname, ssl_info.cert.get(), ssl_info.public_key_hashes)) { |
| 706 return false; | 711 return false; |
| 707 } | 712 } |
| 708 | 713 |
| 709 return true; | 714 return true; |
| 710 } | 715 } |
| 711 | 716 |
| 712 SpdySession::SpdySession(const SpdySessionKey& spdy_session_key, | 717 SpdySession::SpdySession(const SpdySessionKey& spdy_session_key, |
| 713 HttpServerProperties* http_server_properties, | 718 HttpServerProperties* http_server_properties, |
| 714 TransportSecurityState* transport_security_state, | 719 TransportSecurityState* transport_security_state, |
| 720 HttpNetworkSession* http_network_session, |
| 715 bool enable_sending_initial_data, | 721 bool enable_sending_initial_data, |
| 716 bool enable_ping_based_connection_checking, | 722 bool enable_ping_based_connection_checking, |
| 717 size_t session_max_recv_window_size, | 723 size_t session_max_recv_window_size, |
| 718 const SettingsMap& initial_settings, | 724 const SettingsMap& initial_settings, |
| 719 TimeFunc time_func, | 725 TimeFunc time_func, |
| 720 ServerPushDelegate* push_delegate, | 726 ServerPushDelegate* push_delegate, |
| 721 ProxyDelegate* proxy_delegate, | 727 ProxyDelegate* proxy_delegate, |
| 722 NetLog* net_log) | 728 NetLog* net_log) |
| 723 : in_io_loop_(false), | 729 : in_io_loop_(false), |
| 724 spdy_session_key_(spdy_session_key), | 730 spdy_session_key_(spdy_session_key), |
| 725 pool_(NULL), | 731 pool_(NULL), |
| 726 http_server_properties_(http_server_properties), | 732 http_server_properties_(http_server_properties), |
| 727 transport_security_state_(transport_security_state), | 733 transport_security_state_(transport_security_state), |
| 734 http_network_session_(http_network_session), |
| 728 read_buffer_(new IOBuffer(kReadBufferSize)), | 735 read_buffer_(new IOBuffer(kReadBufferSize)), |
| 729 stream_hi_water_mark_(kFirstStreamId), | 736 stream_hi_water_mark_(kFirstStreamId), |
| 730 last_accepted_push_stream_id_(0), | 737 last_accepted_push_stream_id_(0), |
| 731 unclaimed_pushed_streams_(this), | 738 unclaimed_pushed_streams_(this), |
| 732 push_delegate_(push_delegate), | 739 push_delegate_(push_delegate), |
| 733 num_pushed_streams_(0u), | 740 num_pushed_streams_(0u), |
| 734 num_active_pushed_streams_(0u), | 741 num_active_pushed_streams_(0u), |
| 735 bytes_pushed_count_(0u), | 742 bytes_pushed_count_(0u), |
| 736 bytes_pushed_and_unclaimed_count_(0u), | 743 bytes_pushed_and_unclaimed_count_(0u), |
| 737 in_flight_write_frame_type_(DATA), | 744 in_flight_write_frame_type_(DATA), |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_INITIALIZED, | 890 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_INITIALIZED, |
| 884 base::Bind(&NetLogSpdyInitializedCallback, | 891 base::Bind(&NetLogSpdyInitializedCallback, |
| 885 connection_->socket()->NetLog().source())); | 892 connection_->socket()->NetLog().source())); |
| 886 | 893 |
| 887 DCHECK_EQ(availability_state_, STATE_AVAILABLE); | 894 DCHECK_EQ(availability_state_, STATE_AVAILABLE); |
| 888 connection_->AddHigherLayeredPool(this); | 895 connection_->AddHigherLayeredPool(this); |
| 889 if (enable_sending_initial_data_) | 896 if (enable_sending_initial_data_) |
| 890 SendInitialData(); | 897 SendInitialData(); |
| 891 pool_ = pool; | 898 pool_ = pool; |
| 892 | 899 |
| 900 if (base::FeatureList::IsEnabled(kCloseIdleH2SocketsEarlyExperiment)) { |
| 901 // Close idle sockets in this group, since subsequent requests will go over |
| 902 // this HTTP/2 connection. |
| 903 http_network_session_->CloseIdleConnectionsInGroup( |
| 904 connection_->group_name()); |
| 905 } |
| 906 |
| 893 // Bootstrap the read loop. | 907 // Bootstrap the read loop. |
| 894 base::ThreadTaskRunnerHandle::Get()->PostTask( | 908 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 895 FROM_HERE, | 909 FROM_HERE, |
| 896 base::Bind(&SpdySession::PumpReadLoop, weak_factory_.GetWeakPtr(), | 910 base::Bind(&SpdySession::PumpReadLoop, weak_factory_.GetWeakPtr(), |
| 897 READ_STATE_DO_READ, OK)); | 911 READ_STATE_DO_READ, OK)); |
| 898 } | 912 } |
| 899 | 913 |
| 900 bool SpdySession::VerifyDomainAuthentication(const std::string& domain) { | 914 bool SpdySession::VerifyDomainAuthentication(const std::string& domain) { |
| 901 if (availability_state_ == STATE_DRAINING) | 915 if (availability_state_ == STATE_DRAINING) |
| 902 return false; | 916 return false; |
| (...skipping 2227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3130 if (!queue->empty()) { | 3144 if (!queue->empty()) { |
| 3131 SpdyStreamId stream_id = queue->front(); | 3145 SpdyStreamId stream_id = queue->front(); |
| 3132 queue->pop_front(); | 3146 queue->pop_front(); |
| 3133 return stream_id; | 3147 return stream_id; |
| 3134 } | 3148 } |
| 3135 } | 3149 } |
| 3136 return 0; | 3150 return 0; |
| 3137 } | 3151 } |
| 3138 | 3152 |
| 3139 } // namespace net | 3153 } // namespace net |
| OLD | NEW |