Chromium Code Reviews| Index: net/spdy/spdy_session.cc |
| diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc |
| index 050d35beae9204adfd1771ccc7bf7730a7288c49..ed6a6937a1bd930d876e51499c366b46c34373c0 100644 |
| --- a/net/spdy/spdy_session.cc |
| +++ b/net/spdy/spdy_session.cc |
| @@ -300,6 +300,7 @@ class NetLogSpdyGoAwayParameter : public NetLog::EventParameters { |
| NextProto g_default_protocol = kProtoUnknown; |
| size_t g_init_max_concurrent_streams = 10; |
| size_t g_max_concurrent_stream_limit = 256; |
| +size_t g_default_initial_rcv_window_size = 10 * 1024 * 1024; // 10MB |
| bool g_enable_ping_based_connection_checking = true; |
| } // namespace |
| @@ -315,6 +316,11 @@ void SpdySession::set_max_concurrent_streams(size_t value) { |
| } |
| // static |
| +void SpdySession::set_default_initial_recv_window_size(size_t value) { |
| + g_default_initial_rcv_window_size = value; |
| +} |
| + |
| +// static |
| void SpdySession::set_enable_ping_based_connection_checking(bool enable) { |
| g_enable_ping_based_connection_checking = enable; |
| } |
| @@ -331,6 +337,7 @@ void SpdySession::ResetStaticSettingsToInit() { |
| g_default_protocol = kProtoUnknown; |
| g_init_max_concurrent_streams = 10; |
| g_max_concurrent_stream_limit = 256; |
| + g_default_initial_rcv_window_size = kSpdyStreamInitialWindowSize; |
| g_enable_ping_based_connection_checking = true; |
| } |
| @@ -369,7 +376,7 @@ SpdySession::SpdySession(const HostPortProxyPair& host_port_proxy_pair, |
| check_ping_status_pending_(false), |
| flow_control_(false), |
| initial_send_window_size_(kSpdyStreamInitialWindowSize), |
| - initial_recv_window_size_(kSpdyStreamInitialWindowSize), |
| + initial_recv_window_size_(g_default_initial_rcv_window_size), |
| net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SPDY_SESSION)), |
| verify_domain_authentication_(verify_domain_authentication), |
| credential_state_(SpdyCredentialState::kDefaultNumSlots), |
| @@ -447,7 +454,7 @@ net::Error SpdySession::InitializeWithSocket( |
| buffered_spdy_framer_.reset(new BufferedSpdyFramer(version)); |
| buffered_spdy_framer_->set_visitor(this); |
| - SendSettings(); |
| + SendInitialSettings(); |
| // Write out any data that we might have to send, such as the settings frame. |
| WriteSocketLater(); |
| @@ -1696,42 +1703,72 @@ uint32 ApplyCwndFieldTrialPolicy(int cwnd) { |
| return cwnd; |
| } |
| -void SpdySession::SendSettings() { |
| - const SettingsMap& settings_map = |
| - http_server_properties_->GetSpdySettings(host_port_pair()); |
| - if (settings_map.empty()) |
| - return; |
| +void SpdySession::SendInitialSettings() { |
| + SettingsMap settings_to_send; |
| + |
| + // First notify the server about the settings they should use when |
| + // communicating with use. |
| + if (GetProtocolVersion() > 2 && |
| + initial_recv_window_size_ != kSpdyStreamInitialWindowSize) { |
| + // Create a new settings frame notifying the sever of our |
| + // initial window size. |
|
ramant (doing other things)
2012/06/04 20:22:35
nit: could we update the comment (because initial
Ryan Hamilton
2012/06/04 20:48:50
Ugh. That would be a bug. We do not want to over
|
| + settings_to_send[SETTINGS_INITIAL_WINDOW_SIZE] = |
| + SettingsFlagsAndValue(SETTINGS_FLAG_NONE, initial_recv_window_size_); |
| + /* |
| + net_log_.AddEvent( |
| + NetLog::TYPE_SPDY_SESSION_SEND_SETTINGS, |
| + make_scoped_refptr(new NetLogSpdySettingsParameter(settings_map))); |
| - // Record Histogram Data and Apply the SpdyCwnd FieldTrial if applicable. |
| - const SpdySettingsIds id = SETTINGS_CURRENT_CWND; |
| - SettingsMap::const_iterator it = settings_map.find(id); |
| - uint32 value = 0; |
| - if (it != settings_map.end()) |
| - value = it->second.second; |
| - uint32 cwnd = ApplyCwndFieldTrialPolicy(value); |
| - UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySettingsCwndSent", cwnd, 1, 200, 100); |
| - if (cwnd != value) { |
| - http_server_properties_->SetSpdySetting( |
| - host_port_pair(), id, SETTINGS_FLAG_PLEASE_PERSIST, cwnd); |
| + // Create the SETTINGS frame and send it. |
| + DCHECK(buffered_spdy_framer_.get()); |
| + scoped_ptr<SpdySettingsControlFrame> settings_frame( |
| + buffered_spdy_framer_->CreateSettings(settings_map)); |
| + sent_settings_ = true; |
| + QueueFrame(settings_frame.get(), HIGHEST, NULL); |
|
ramant (doing other things)
2012/06/04 20:22:35
nit: Should we delete the commented out code?
Ryan Hamilton
2012/06/04 20:48:50
Whoops! Done. (Now factored into a new helper me
|
| + */ |
| } |
| - const SettingsMap& settings_map_new = |
| + const SettingsMap& settings_map = |
| http_server_properties_->GetSpdySettings(host_port_pair()); |
| - for (SettingsMap::const_iterator i = settings_map_new.begin(), |
| - end = settings_map_new.end(); i != end; ++i) { |
| - const SpdySettingsIds new_id = i->first; |
| - const uint32 new_val = i->second.second; |
| - HandleSetting(new_id, new_val); |
| + |
| + // Next notify the server about the settings they have previously |
| + // told use to use when communicating with them. |
|
ramant (doing other things)
2012/06/04 20:22:35
nit: could we update this comment because we are n
Ryan Hamilton
2012/06/04 20:48:50
Since I had to change the code, I kept the comment
|
| + if (!settings_map.empty()) { |
| + // Record Histogram Data and Apply the SpdyCwnd FieldTrial if applicable. |
| + const SpdySettingsIds id = SETTINGS_CURRENT_CWND; |
| + SettingsMap::const_iterator it = settings_map.find(id); |
| + uint32 value = 0; |
| + if (it != settings_map.end()) |
| + value = it->second.second; |
| + uint32 cwnd = ApplyCwndFieldTrialPolicy(value); |
| + UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySettingsCwndSent", cwnd, 1, 200, 100); |
| + if (cwnd != value) { |
| + http_server_properties_->SetSpdySetting( |
| + host_port_pair(), id, SETTINGS_FLAG_PLEASE_PERSIST, cwnd); |
| + } |
| + |
| + const SettingsMap& settings_map_new = |
| + http_server_properties_->GetSpdySettings(host_port_pair()); |
| + for (SettingsMap::const_iterator i = settings_map_new.begin(), |
| + end = settings_map_new.end(); i != end; ++i) { |
| + const SpdySettingsIds new_id = i->first; |
| + const uint32 new_val = i->second.second; |
| + HandleSetting(new_id, new_val); |
| + settings_to_send[i->first] = i->second; |
| + } |
| } |
| + if (settings_to_send.empty()) |
| + return; |
| + |
| net_log_.AddEvent( |
| NetLog::TYPE_SPDY_SESSION_SEND_SETTINGS, |
| - make_scoped_refptr(new NetLogSpdySettingsParameter(settings_map_new))); |
| + make_scoped_refptr(new NetLogSpdySettingsParameter(settings_to_send))); |
| // Create the SETTINGS frame and send it. |
| DCHECK(buffered_spdy_framer_.get()); |
| scoped_ptr<SpdySettingsControlFrame> settings_frame( |
| - buffered_spdy_framer_->CreateSettings(settings_map_new)); |
| + buffered_spdy_framer_->CreateSettings(settings_to_send)); |
| sent_settings_ = true; |
| QueueFrame(settings_frame.get(), HIGHEST, NULL); |
| } |