Index: net/spdy/spdy_session.cc |
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc |
index 1fd628378b47822982837fac059febfcef8ad356..e5c00d351c8d74e9de0c662cdfed4ebbe6f7f545 100644 |
--- a/net/spdy/spdy_session.cc |
+++ b/net/spdy/spdy_session.cc |
@@ -655,7 +655,7 @@ SpdySession::SpdySession(const SpdySessionKey& spdy_session_key, |
bool enable_sending_initial_data, |
bool enable_ping_based_connection_checking, |
size_t session_max_recv_window_size, |
- size_t stream_max_recv_window_size, |
+ const SettingsMap& settings, |
TimeFunc time_func, |
ServerPushDelegate* push_delegate, |
ProxyDelegate* proxy_delegate, |
@@ -681,8 +681,10 @@ SpdySession::SpdySession(const SpdySessionKey& spdy_session_key, |
read_state_(READ_STATE_DO_READ), |
write_state_(WRITE_STATE_IDLE), |
error_on_close_(OK), |
+ settings_(settings), |
max_concurrent_streams_(kInitialMaxConcurrentStreams), |
- max_concurrent_pushed_streams_(kMaxConcurrentPushedStreams), |
+ max_concurrent_pushed_streams_( |
+ settings.at(SETTINGS_MAX_CONCURRENT_STREAMS)), |
streams_initiated_count_(0), |
streams_pushed_count_(0), |
streams_pushed_and_claimed_count_(0), |
@@ -697,7 +699,8 @@ SpdySession::SpdySession(const SpdySessionKey& spdy_session_key, |
session_recv_window_size_(0), |
session_unacked_recv_window_bytes_(0), |
stream_initial_send_window_size_(kDefaultInitialWindowSize), |
- stream_max_recv_window_size_(stream_max_recv_window_size), |
+ max_header_table_size_(settings.at(SETTINGS_HEADER_TABLE_SIZE)), |
+ stream_max_recv_window_size_(settings.at(SETTINGS_INITIAL_WINDOW_SIZE)), |
net_log_( |
NetLogWithSource::Make(net_log, NetLogSourceType::HTTP2_SESSION)), |
enable_sending_initial_data_(enable_sending_initial_data), |
@@ -714,6 +717,11 @@ SpdySession::SpdySession(const SpdySessionKey& spdy_session_key, |
base::Bind(&NetLogSpdySessionCallback, &host_port_proxy_pair())); |
next_unclaimed_push_stream_sweep_time_ = time_func_() + |
base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds); |
+ |
+ DCHECK(settings_.find(SETTINGS_HEADER_TABLE_SIZE) != settings_.end()); |
Ryan Hamilton
2016/12/27 22:32:43
Consider base::ContainsKey(settings_, SETTINGS_foo
Bence
2016/12/28 00:53:24
Done.
|
+ DCHECK(settings_.find(SETTINGS_MAX_CONCURRENT_STREAMS) != settings_.end()); |
+ DCHECK(settings_.find(SETTINGS_INITIAL_WINDOW_SIZE) != settings_.end()); |
+ |
// TODO(mbelshe): consider randomization of the stream_hi_water_mark. |
} |
@@ -755,7 +763,7 @@ void SpdySession::InitializeWithSocket( |
buffered_spdy_framer_.reset(new BufferedSpdyFramer()); |
buffered_spdy_framer_->set_visitor(this); |
buffered_spdy_framer_->set_debug_visitor(this); |
- buffered_spdy_framer_->UpdateHeaderDecoderTableSize(kMaxHeaderTableSize); |
+ buffered_spdy_framer_->UpdateHeaderDecoderTableSize(max_header_table_size_); |
net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_INITIALIZED, |
base::Bind(&NetLogSpdyInitializedCallback, |
@@ -2646,12 +2654,35 @@ void SpdySession::SendInitialData() { |
std::move(connection_header_prefix_frame)); |
// First, notify the server about the settings they should use when |
- // communicating with us. |
+ // communicating with us. Only send settings that have a value different from |
+ // the protocol default value. |
SettingsMap settings_map; |
- settings_map[SETTINGS_HEADER_TABLE_SIZE] = kMaxHeaderTableSize; |
- settings_map[SETTINGS_MAX_CONCURRENT_STREAMS] = kMaxConcurrentPushedStreams; |
- if (stream_max_recv_window_size_ != kDefaultInitialWindowSize) { |
- settings_map[SETTINGS_INITIAL_WINDOW_SIZE] = stream_max_recv_window_size_; |
+ for (auto setting : settings_) { |
+ switch (setting.first) { |
+ case SETTINGS_HEADER_TABLE_SIZE: |
+ if (setting.second == 4096) |
Ryan Hamilton
2016/12/27 22:32:43
Can we define these magic numbers somewhere?
Bence
2016/12/28 00:53:24
Done.
|
+ continue; |
+ break; |
+ case SETTINGS_ENABLE_PUSH: |
+ if (setting.second == 1) |
+ continue; |
+ break; |
+ case SETTINGS_MAX_CONCURRENT_STREAMS: |
+ break; |
+ case SETTINGS_INITIAL_WINDOW_SIZE: |
+ if (setting.second == 65535) |
+ continue; |
+ break; |
+ case SETTINGS_MAX_FRAME_SIZE: |
+ if (setting.second == 16384) |
+ continue; |
+ break; |
+ case SETTINGS_MAX_HEADER_LIST_SIZE: |
+ break; |
+ default: |
+ break; |
+ } |
+ settings_map.insert(setting); |
} |
SendSettings(settings_map); |