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_stream.h" | 5 #include "net/spdy/spdy_stream.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 stream_id_, static_cast<uint32>(unacked_recv_window_bytes_)); | 340 stream_id_, static_cast<uint32>(unacked_recv_window_bytes_)); |
341 unacked_recv_window_bytes_ = 0; | 341 unacked_recv_window_bytes_ = 0; |
342 } | 342 } |
343 } | 343 } |
344 | 344 |
345 void SpdyStream::DecreaseRecvWindowSize(int32 delta_window_size) { | 345 void SpdyStream::DecreaseRecvWindowSize(int32 delta_window_size) { |
346 DCHECK(session_->IsStreamActive(stream_id_)); | 346 DCHECK(session_->IsStreamActive(stream_id_)); |
347 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); | 347 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); |
348 DCHECK_GE(delta_window_size, 1); | 348 DCHECK_GE(delta_window_size, 1); |
349 | 349 |
350 // Since we never decrease the initial receive window size, | 350 // The receiving window size as the peer knows it is |
351 // |delta_window_size| should never cause |recv_window_size_| to go | 351 // |recv_window_size_ - unacked_recv_window_bytes_|, if more data are sent by |
352 // negative. If we do, the receive window isn't being respected. | 352 // the peer, that means that the receive window is not being respected. |
353 if (delta_window_size > recv_window_size_) { | 353 if (delta_window_size > recv_window_size_ - unacked_recv_window_bytes_) { |
354 session_->ResetStream( | 354 session_->ResetStream( |
355 stream_id_, RST_STREAM_PROTOCOL_ERROR, | 355 stream_id_, RST_STREAM_FLOW_CONTROL_ERROR, |
356 "delta_window_size is " + base::IntToString(delta_window_size) + | 356 "delta_window_size is " + base::IntToString(delta_window_size) + |
357 " in DecreaseRecvWindowSize, which is larger than the receive " + | 357 " in DecreaseRecvWindowSize, which is larger than the receive " + |
358 "window size of " + base::IntToString(recv_window_size_)); | 358 "window size of " + base::IntToString(recv_window_size_)); |
359 return; | 359 return; |
360 } | 360 } |
361 | 361 |
362 recv_window_size_ -= delta_window_size; | 362 recv_window_size_ -= delta_window_size; |
363 net_log_.AddEvent( | 363 net_log_.AddEvent( |
364 NetLog::TYPE_HTTP2_STREAM_UPDATE_RECV_WINDOW, | 364 NetLog::TYPE_HTTP2_STREAM_UPDATE_RECV_WINDOW, |
365 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, stream_id_, | 365 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, stream_id_, |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 928 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
929 state); | 929 state); |
930 break; | 930 break; |
931 } | 931 } |
932 return description; | 932 return description; |
933 } | 933 } |
934 | 934 |
935 #undef STATE_CASE | 935 #undef STATE_CASE |
936 | 936 |
937 } // namespace net | 937 } // namespace net |
OLD | NEW |