Index: net/spdy/spdy_session.cc |
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc |
index db791e466b125387d1b4eb028e13d0de20803628..3be92e3c823a0af4142f43560a60cc4499b1a6cd 100644 |
--- a/net/spdy/spdy_session.cc |
+++ b/net/spdy/spdy_session.cc |
@@ -608,7 +608,8 @@ SpdySession::SpdySession( |
bool enable_compression, |
bool enable_ping_based_connection_checking, |
NextProto default_protocol, |
- size_t stream_initial_recv_window_size, |
+ size_t session_max_recv_window_size, |
+ size_t stream_max_recv_window_size, |
size_t initial_max_concurrent_streams, |
size_t max_concurrent_streams_limit, |
TimeFunc time_func, |
@@ -654,13 +655,12 @@ SpdySession::SpdySession( |
check_ping_status_pending_(false), |
send_connection_header_prefix_(false), |
flow_control_state_(FLOW_CONTROL_NONE), |
- stream_initial_send_window_size_(GetInitialWindowSize(default_protocol)), |
- stream_initial_recv_window_size_(stream_initial_recv_window_size == 0 |
- ? kDefaultInitialRecvWindowSize |
- : stream_initial_recv_window_size), |
session_send_window_size_(0), |
+ session_max_recv_window_size_(session_max_recv_window_size), |
session_recv_window_size_(0), |
session_unacked_recv_window_bytes_(0), |
+ stream_initial_send_window_size_(GetInitialWindowSize(default_protocol)), |
+ stream_max_recv_window_size_(stream_max_recv_window_size), |
net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_HTTP2_SESSION)), |
verify_domain_authentication_(verify_domain_authentication), |
enable_sending_initial_data_(enable_sending_initial_data), |
@@ -890,10 +890,8 @@ int SpdySession::CreateStream(const SpdyStreamRequest& request, |
scoped_ptr<SpdyStream> new_stream( |
new SpdyStream(request.type(), GetWeakPtr(), request.url(), |
- request.priority(), |
- stream_initial_send_window_size_, |
- stream_initial_recv_window_size_, |
- request.net_log())); |
+ request.priority(), stream_initial_send_window_size_, |
+ stream_max_recv_window_size_, request.net_log())); |
*stream = new_stream->GetWeakPtr(); |
InsertCreatedStream(new_stream.Pass()); |
@@ -2687,13 +2685,10 @@ bool SpdySession::TryCreatePushStream(SpdyStreamId stream_id, |
return false; |
} |
- scoped_ptr<SpdyStream> stream(new SpdyStream(SPDY_PUSH_STREAM, |
- GetWeakPtr(), |
- gurl, |
- request_priority, |
- stream_initial_send_window_size_, |
- stream_initial_recv_window_size_, |
- net_log_)); |
+ scoped_ptr<SpdyStream> stream( |
+ new SpdyStream(SPDY_PUSH_STREAM, GetWeakPtr(), gurl, request_priority, |
+ stream_initial_send_window_size_, |
+ stream_max_recv_window_size_, net_log_)); |
stream->set_stream_id(stream_id); |
// In spdy4/http2 PUSH_PROMISE arrives on associated stream. |
@@ -2777,10 +2772,9 @@ void SpdySession::SendInitialData() { |
settings_map[SETTINGS_MAX_CONCURRENT_STREAMS] = |
SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); |
if (flow_control_state_ >= FLOW_CONTROL_STREAM && |
- stream_initial_recv_window_size_ != GetInitialWindowSize(protocol_)) { |
+ stream_max_recv_window_size_ != GetInitialWindowSize(protocol_)) { |
settings_map[SETTINGS_INITIAL_WINDOW_SIZE] = |
- SettingsFlagsAndValue(SETTINGS_FLAG_NONE, |
- stream_initial_recv_window_size_); |
+ SettingsFlagsAndValue(SETTINGS_FLAG_NONE, stream_max_recv_window_size_); |
} |
SendSettings(settings_map); |
@@ -2789,12 +2783,14 @@ void SpdySession::SendInitialData() { |
// Bump up the receive window size to the real initial value. This |
// has to go here since the WINDOW_UPDATE frame sent by |
// IncreaseRecvWindowSize() call uses |buffered_spdy_framer_|. |
- DCHECK_GT(kDefaultInitialRecvWindowSize, session_recv_window_size_); |
- // This condition implies that |kDefaultInitialRecvWindowSize| - |
+ // This condition implies that |session_max_recv_window_size_| - |
// |session_recv_window_size_| doesn't overflow. |
- DCHECK_GT(session_recv_window_size_, 0); |
- IncreaseRecvWindowSize( |
- kDefaultInitialRecvWindowSize - session_recv_window_size_); |
+ DCHECK_GE(session_max_recv_window_size_, session_recv_window_size_); |
+ DCHECK_GE(session_recv_window_size_, 0); |
+ if (session_max_recv_window_size_ > session_recv_window_size_) { |
+ IncreaseRecvWindowSize(session_max_recv_window_size_ - |
+ session_recv_window_size_); |
+ } |
} |
if (protocol_ <= kProtoSPDY31) { |
@@ -3190,8 +3186,7 @@ void SpdySession::IncreaseRecvWindowSize(int32 delta_window_size) { |
delta_window_size, session_recv_window_size_)); |
session_unacked_recv_window_bytes_ += delta_window_size; |
- if (session_unacked_recv_window_bytes_ > |
- GetInitialWindowSize(protocol_) / 2) { |
+ if (session_unacked_recv_window_bytes_ > session_max_recv_window_size_ / 2) { |
SendWindowUpdateFrame(kSessionFlowControlStreamId, |
session_unacked_recv_window_bytes_, |
HIGHEST); |