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 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 "send_window_size_ [current: %d]", delta_window_size, stream_id_, | 266 "send_window_size_ [current: %d]", delta_window_size, stream_id_, |
267 send_window_size_); | 267 send_window_size_); |
268 session_->ResetStream(stream_id_, RST_STREAM_FLOW_CONTROL_ERROR, desc); | 268 session_->ResetStream(stream_id_, RST_STREAM_FLOW_CONTROL_ERROR, desc); |
269 return; | 269 return; |
270 } | 270 } |
271 } | 271 } |
272 | 272 |
273 send_window_size_ += delta_window_size; | 273 send_window_size_ += delta_window_size; |
274 | 274 |
275 net_log_.AddEvent( | 275 net_log_.AddEvent( |
276 NetLog::TYPE_SPDY_STREAM_UPDATE_SEND_WINDOW, | 276 NetLog::TYPE_HTTP2_STREAM_UPDATE_SEND_WINDOW, |
277 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, | 277 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, stream_id_, |
278 stream_id_, delta_window_size, send_window_size_)); | 278 delta_window_size, send_window_size_)); |
279 | 279 |
280 PossiblyResumeIfSendStalled(); | 280 PossiblyResumeIfSendStalled(); |
281 } | 281 } |
282 | 282 |
283 void SpdyStream::DecreaseSendWindowSize(int32 delta_window_size) { | 283 void SpdyStream::DecreaseSendWindowSize(int32 delta_window_size) { |
284 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); | 284 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); |
285 | 285 |
286 if (IsClosed()) | 286 if (IsClosed()) |
287 return; | 287 return; |
288 | 288 |
289 // We only call this method when sending a frame. Therefore, | 289 // We only call this method when sending a frame. Therefore, |
290 // |delta_window_size| should be within the valid frame size range. | 290 // |delta_window_size| should be within the valid frame size range. |
291 DCHECK_GE(delta_window_size, 1); | 291 DCHECK_GE(delta_window_size, 1); |
292 DCHECK_LE(delta_window_size, kMaxSpdyFrameChunkSize); | 292 DCHECK_LE(delta_window_size, kMaxSpdyFrameChunkSize); |
293 | 293 |
294 // |send_window_size_| should have been at least |delta_window_size| for | 294 // |send_window_size_| should have been at least |delta_window_size| for |
295 // this call to happen. | 295 // this call to happen. |
296 DCHECK_GE(send_window_size_, delta_window_size); | 296 DCHECK_GE(send_window_size_, delta_window_size); |
297 | 297 |
298 send_window_size_ -= delta_window_size; | 298 send_window_size_ -= delta_window_size; |
299 | 299 |
300 net_log_.AddEvent( | 300 net_log_.AddEvent( |
301 NetLog::TYPE_SPDY_STREAM_UPDATE_SEND_WINDOW, | 301 NetLog::TYPE_HTTP2_STREAM_UPDATE_SEND_WINDOW, |
302 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, | 302 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, stream_id_, |
303 stream_id_, -delta_window_size, send_window_size_)); | 303 -delta_window_size, send_window_size_)); |
304 } | 304 } |
305 | 305 |
306 void SpdyStream::OnReadBufferConsumed( | 306 void SpdyStream::OnReadBufferConsumed( |
307 size_t consume_size, | 307 size_t consume_size, |
308 SpdyBuffer::ConsumeSource consume_source) { | 308 SpdyBuffer::ConsumeSource consume_source) { |
309 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); | 309 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); |
310 DCHECK_GE(consume_size, 1u); | 310 DCHECK_GE(consume_size, 1u); |
311 DCHECK_LE(consume_size, static_cast<size_t>(kint32max)); | 311 DCHECK_LE(consume_size, static_cast<size_t>(kint32max)); |
312 IncreaseRecvWindowSize(static_cast<int32>(consume_size)); | 312 IncreaseRecvWindowSize(static_cast<int32>(consume_size)); |
313 } | 313 } |
314 | 314 |
315 void SpdyStream::IncreaseRecvWindowSize(int32 delta_window_size) { | 315 void SpdyStream::IncreaseRecvWindowSize(int32 delta_window_size) { |
316 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); | 316 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); |
317 | 317 |
318 // By the time a read is processed by the delegate, this stream may | 318 // By the time a read is processed by the delegate, this stream may |
319 // already be inactive. | 319 // already be inactive. |
320 if (!session_->IsStreamActive(stream_id_)) | 320 if (!session_->IsStreamActive(stream_id_)) |
321 return; | 321 return; |
322 | 322 |
323 DCHECK_GE(unacked_recv_window_bytes_, 0); | 323 DCHECK_GE(unacked_recv_window_bytes_, 0); |
324 DCHECK_GE(recv_window_size_, unacked_recv_window_bytes_); | 324 DCHECK_GE(recv_window_size_, unacked_recv_window_bytes_); |
325 DCHECK_GE(delta_window_size, 1); | 325 DCHECK_GE(delta_window_size, 1); |
326 // Check for overflow. | 326 // Check for overflow. |
327 DCHECK_LE(delta_window_size, kint32max - recv_window_size_); | 327 DCHECK_LE(delta_window_size, kint32max - recv_window_size_); |
328 | 328 |
329 recv_window_size_ += delta_window_size; | 329 recv_window_size_ += delta_window_size; |
330 net_log_.AddEvent( | 330 net_log_.AddEvent( |
331 NetLog::TYPE_SPDY_STREAM_UPDATE_RECV_WINDOW, | 331 NetLog::TYPE_HTTP2_STREAM_UPDATE_RECV_WINDOW, |
332 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, | 332 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, stream_id_, |
333 stream_id_, delta_window_size, recv_window_size_)); | 333 delta_window_size, recv_window_size_)); |
334 | 334 |
335 unacked_recv_window_bytes_ += delta_window_size; | 335 unacked_recv_window_bytes_ += delta_window_size; |
336 if (unacked_recv_window_bytes_ > | 336 if (unacked_recv_window_bytes_ > |
337 session_->stream_initial_recv_window_size() / 2) { | 337 session_->stream_initial_recv_window_size() / 2) { |
338 session_->SendStreamWindowUpdate( | 338 session_->SendStreamWindowUpdate( |
339 stream_id_, static_cast<uint32>(unacked_recv_window_bytes_)); | 339 stream_id_, static_cast<uint32>(unacked_recv_window_bytes_)); |
340 unacked_recv_window_bytes_ = 0; | 340 unacked_recv_window_bytes_ = 0; |
341 } | 341 } |
342 } | 342 } |
343 | 343 |
344 void SpdyStream::DecreaseRecvWindowSize(int32 delta_window_size) { | 344 void SpdyStream::DecreaseRecvWindowSize(int32 delta_window_size) { |
345 DCHECK(session_->IsStreamActive(stream_id_)); | 345 DCHECK(session_->IsStreamActive(stream_id_)); |
346 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); | 346 DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); |
347 DCHECK_GE(delta_window_size, 1); | 347 DCHECK_GE(delta_window_size, 1); |
348 | 348 |
349 // Since we never decrease the initial receive window size, | 349 // Since we never decrease the initial receive window size, |
350 // |delta_window_size| should never cause |recv_window_size_| to go | 350 // |delta_window_size| should never cause |recv_window_size_| to go |
351 // negative. If we do, the receive window isn't being respected. | 351 // negative. If we do, the receive window isn't being respected. |
352 if (delta_window_size > recv_window_size_) { | 352 if (delta_window_size > recv_window_size_) { |
353 session_->ResetStream( | 353 session_->ResetStream( |
354 stream_id_, RST_STREAM_PROTOCOL_ERROR, | 354 stream_id_, RST_STREAM_PROTOCOL_ERROR, |
355 "delta_window_size is " + base::IntToString(delta_window_size) + | 355 "delta_window_size is " + base::IntToString(delta_window_size) + |
356 " in DecreaseRecvWindowSize, which is larger than the receive " + | 356 " in DecreaseRecvWindowSize, which is larger than the receive " + |
357 "window size of " + base::IntToString(recv_window_size_)); | 357 "window size of " + base::IntToString(recv_window_size_)); |
358 return; | 358 return; |
359 } | 359 } |
360 | 360 |
361 recv_window_size_ -= delta_window_size; | 361 recv_window_size_ -= delta_window_size; |
362 net_log_.AddEvent( | 362 net_log_.AddEvent( |
363 NetLog::TYPE_SPDY_STREAM_UPDATE_RECV_WINDOW, | 363 NetLog::TYPE_HTTP2_STREAM_UPDATE_RECV_WINDOW, |
364 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, | 364 base::Bind(&NetLogSpdyStreamWindowUpdateCallback, stream_id_, |
365 stream_id_, -delta_window_size, recv_window_size_)); | 365 -delta_window_size, recv_window_size_)); |
366 } | 366 } |
367 | 367 |
368 int SpdyStream::GetPeerAddress(IPEndPoint* address) const { | 368 int SpdyStream::GetPeerAddress(IPEndPoint* address) const { |
369 return session_->GetPeerAddress(address); | 369 return session_->GetPeerAddress(address); |
370 } | 370 } |
371 | 371 |
372 int SpdyStream::GetLocalAddress(IPEndPoint* address) const { | 372 int SpdyStream::GetLocalAddress(IPEndPoint* address) const { |
373 return session_->GetLocalAddress(address); | 373 return session_->GetLocalAddress(address); |
374 } | 374 } |
375 | 375 |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 pending_send_data_ = NULL; | 608 pending_send_data_ = NULL; |
609 return OK; | 609 return OK; |
610 } | 610 } |
611 } | 611 } |
612 | 612 |
613 SpdyMajorVersion SpdyStream::GetProtocolVersion() const { | 613 SpdyMajorVersion SpdyStream::GetProtocolVersion() const { |
614 return session_->GetProtocolVersion(); | 614 return session_->GetProtocolVersion(); |
615 } | 615 } |
616 | 616 |
617 void SpdyStream::LogStreamError(int status, const std::string& description) { | 617 void SpdyStream::LogStreamError(int status, const std::string& description) { |
618 net_log_.AddEvent(NetLog::TYPE_SPDY_STREAM_ERROR, | 618 net_log_.AddEvent(NetLog::TYPE_HTTP2_STREAM_ERROR, |
619 base::Bind(&NetLogSpdyStreamErrorCallback, | 619 base::Bind(&NetLogSpdyStreamErrorCallback, stream_id_, |
620 stream_id_, status, &description)); | 620 status, &description)); |
621 } | 621 } |
622 | 622 |
623 void SpdyStream::OnClose(int status) { | 623 void SpdyStream::OnClose(int status) { |
624 // In most cases, the stream should already be CLOSED. The exception is when a | 624 // In most cases, the stream should already be CLOSED. The exception is when a |
625 // SpdySession is shutting down while the stream is in an intermediate state. | 625 // SpdySession is shutting down while the stream is in an intermediate state. |
626 io_state_ = STATE_CLOSED; | 626 io_state_ = STATE_CLOSED; |
627 response_status_ = status; | 627 response_status_ = status; |
628 Delegate* delegate = delegate_; | 628 Delegate* delegate = delegate_; |
629 delegate_ = NULL; | 629 delegate_ = NULL; |
630 if (delegate) | 630 if (delegate) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 bool SpdyStream::GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) { | 702 bool SpdyStream::GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) { |
703 return session_->GetSSLCertRequestInfo(cert_request_info); | 703 return session_->GetSSLCertRequestInfo(cert_request_info); |
704 } | 704 } |
705 | 705 |
706 void SpdyStream::PossiblyResumeIfSendStalled() { | 706 void SpdyStream::PossiblyResumeIfSendStalled() { |
707 if (IsLocallyClosed()) { | 707 if (IsLocallyClosed()) { |
708 return; | 708 return; |
709 } | 709 } |
710 if (send_stalled_by_flow_control_ && !session_->IsSendStalled() && | 710 if (send_stalled_by_flow_control_ && !session_->IsSendStalled() && |
711 send_window_size_ > 0) { | 711 send_window_size_ > 0) { |
712 net_log_.AddEvent( | 712 net_log_.AddEvent(NetLog::TYPE_HTTP2_STREAM_FLOW_CONTROL_UNSTALLED, |
713 NetLog::TYPE_SPDY_STREAM_FLOW_CONTROL_UNSTALLED, | 713 NetLog::IntegerCallback("stream_id", stream_id_)); |
714 NetLog::IntegerCallback("stream_id", stream_id_)); | |
715 send_stalled_by_flow_control_ = false; | 714 send_stalled_by_flow_control_ = false; |
716 QueueNextDataFrame(); | 715 QueueNextDataFrame(); |
717 } | 716 } |
718 } | 717 } |
719 | 718 |
720 bool SpdyStream::IsClosed() const { | 719 bool SpdyStream::IsClosed() const { |
721 return io_state_ == STATE_CLOSED; | 720 return io_state_ == STATE_CLOSED; |
722 } | 721 } |
723 | 722 |
724 bool SpdyStream::IsLocallyClosed() const { | 723 bool SpdyStream::IsLocallyClosed() const { |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 917 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
919 state); | 918 state); |
920 break; | 919 break; |
921 } | 920 } |
922 return description; | 921 return description; |
923 } | 922 } |
924 | 923 |
925 #undef STATE_CASE | 924 #undef STATE_CASE |
926 | 925 |
927 } // namespace net | 926 } // namespace net |
OLD | NEW |