Index: net/spdy/spdy_session.cc |
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc |
index db791e466b125387d1b4eb028e13d0de20803628..a04ca7b36ecceb04ae7bfa170c9f8224a37ad6ae 100644 |
--- a/net/spdy/spdy_session.cc |
+++ b/net/spdy/spdy_session.cc |
@@ -608,6 +608,7 @@ SpdySession::SpdySession( |
bool enable_compression, |
bool enable_ping_based_connection_checking, |
NextProto default_protocol, |
+ size_t session_max_recv_window_size, |
size_t stream_initial_recv_window_size, |
size_t initial_max_concurrent_streams, |
size_t max_concurrent_streams_limit, |
@@ -654,13 +655,16 @@ SpdySession::SpdySession( |
check_ping_status_pending_(false), |
send_connection_header_prefix_(false), |
flow_control_state_(FLOW_CONTROL_NONE), |
+ session_send_window_size_(0), |
+ session_max_recv_window_size_(session_max_recv_window_size == 0 |
+ ? kDefaultInitialRecvWindowSize |
+ : 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_initial_recv_window_size_(stream_initial_recv_window_size == 0 |
? kDefaultInitialRecvWindowSize |
: stream_initial_recv_window_size), |
- session_send_window_size_(0), |
- session_recv_window_size_(0), |
- session_unacked_recv_window_bytes_(0), |
net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_HTTP2_SESSION)), |
verify_domain_authentication_(verify_domain_authentication), |
enable_sending_initial_data_(enable_sending_initial_data), |
@@ -2786,15 +2790,20 @@ void SpdySession::SendInitialData() { |
// Next, notify the server about our initial recv window size. |
if (flow_control_state_ == FLOW_CONTROL_STREAM_AND_SESSION) { |
+ if (session_max_recv_window_size_ == 0) { |
+ session_max_recv_window_size_ = kDefaultInitialRecvWindowSize; |
+ } |
// 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| - |
// |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 +3199,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); |