Chromium Code Reviews| 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/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 // We must need to write stream data. | 135 // We must need to write stream data. |
| 136 // Until the headers have been completely sent, we can not be sure | 136 // Until the headers have been completely sent, we can not be sure |
| 137 // that our stream_id is correct. | 137 // that our stream_id is correct. |
| 138 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); | 138 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); |
| 139 DCHECK_GT(stream_id_, 0u); | 139 DCHECK_GT(stream_id_, 0u); |
| 140 DCHECK(!pending_frames_.empty()); | 140 DCHECK(!pending_frames_.empty()); |
| 141 | 141 |
| 142 PendingFrame frame = pending_frames_.front(); | 142 PendingFrame frame = pending_frames_.front(); |
| 143 pending_frames_.pop_front(); | 143 pending_frames_.pop_front(); |
| 144 | 144 |
| 145 waiting_completions_.push_back(frame.type); | |
| 146 | |
| 145 if (frame.type == TYPE_DATA) { | 147 if (frame.type == TYPE_DATA) { |
| 146 // Send queued data frame. | 148 // Send queued data frame. |
| 147 return frame.data_frame; | 149 return frame.data_frame; |
| 148 } else { | 150 } else { |
| 149 DCHECK(frame.type == TYPE_HEADER); | 151 DCHECK(frame.type == TYPE_HEADERS); |
|
Ryan Hamilton
2012/08/13 17:10:02
It doesn't look like the HEADERS frame is added to
Takashi Toyoshima
2012/08/14 09:14:02
I added frame.type at line 145 for both of TYPE_DA
| |
| 150 // Create actual HEADERS frame just in time because it depends on | 152 // Create actual HEADERS frame just in time because it depends on |
| 151 // compression context and should not be reordered after the creation. | 153 // compression context and should not be reordered after the creation. |
| 152 SpdyFrame* header_frame = session_->CreateHeadersFrame( | 154 SpdyFrame* header_frame = session_->CreateHeadersFrame( |
| 153 stream_id_, *frame.header_block, SpdyControlFlags()); | 155 stream_id_, *frame.header_block, SpdyControlFlags()); |
| 154 delete frame.header_block; | 156 delete frame.header_block; |
| 155 return header_frame; | 157 return header_frame; |
| 156 } | 158 } |
| 157 } | 159 } |
| 158 NOTREACHED(); | 160 NOTREACHED(); |
| 159 } | 161 } |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 573 return DoLoop(OK); | 575 return DoLoop(OK); |
| 574 } | 576 } |
| 575 | 577 |
| 576 int SpdyStream::WriteHeaders(SpdyHeaderBlock* headers) { | 578 int SpdyStream::WriteHeaders(SpdyHeaderBlock* headers) { |
| 577 // Until the first headers by SYN_STREAM have been completely sent, we can | 579 // Until the first headers by SYN_STREAM have been completely sent, we can |
| 578 // not be sure that our stream_id is correct. | 580 // not be sure that our stream_id is correct. |
| 579 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); | 581 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); |
| 580 CHECK_GT(stream_id_, 0u); | 582 CHECK_GT(stream_id_, 0u); |
| 581 | 583 |
| 582 PendingFrame frame; | 584 PendingFrame frame; |
| 583 frame.type = TYPE_HEADER; | 585 frame.type = TYPE_HEADERS; |
| 584 frame.header_block = headers; | 586 frame.header_block = headers; |
| 585 pending_frames_.push_back(frame); | 587 pending_frames_.push_back(frame); |
| 586 | 588 |
| 587 SetHasWriteAvailable(); | 589 SetHasWriteAvailable(); |
| 588 return ERR_IO_PENDING; | 590 return ERR_IO_PENDING; |
| 589 } | 591 } |
| 590 | 592 |
| 591 int SpdyStream::WriteStreamData(IOBuffer* data, | 593 int SpdyStream::WriteStreamData(IOBuffer* data, |
| 592 int length, | 594 int length, |
| 593 SpdyDataFlags flags) { | 595 SpdyDataFlags flags) { |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 815 result = delegate_->OnSendBodyComplete(result, &eof); | 817 result = delegate_->OnSendBodyComplete(result, &eof); |
| 816 if (!eof) | 818 if (!eof) |
| 817 io_state_ = STATE_SEND_BODY; | 819 io_state_ = STATE_SEND_BODY; |
| 818 else | 820 else |
| 819 io_state_ = STATE_WAITING_FOR_RESPONSE; | 821 io_state_ = STATE_WAITING_FOR_RESPONSE; |
| 820 | 822 |
| 821 return result; | 823 return result; |
| 822 } | 824 } |
| 823 | 825 |
| 824 int SpdyStream::DoOpen(int result) { | 826 int SpdyStream::DoOpen(int result) { |
| 825 if (delegate_) | 827 if (delegate_) { |
| 826 delegate_->OnDataSent(result); | 828 FrameType type = waiting_completions_.front(); |
| 829 waiting_completions_.pop_front(); | |
| 830 if (type == TYPE_DATA) { | |
| 831 delegate_->OnDataSent(result); | |
| 832 } else { | |
| 833 DCHECK(type == TYPE_HEADERS); | |
| 834 delegate_->OnHeadersSent(); | |
| 835 } | |
| 836 } | |
| 827 io_state_ = STATE_OPEN; | 837 io_state_ = STATE_OPEN; |
| 828 return result; | 838 return result; |
| 829 } | 839 } |
| 830 | 840 |
| 831 void SpdyStream::UpdateHistograms() { | 841 void SpdyStream::UpdateHistograms() { |
| 832 // We need all timers to be filled in, otherwise metrics can be bogus. | 842 // We need all timers to be filled in, otherwise metrics can be bogus. |
| 833 if (send_time_.is_null() || recv_first_byte_time_.is_null() || | 843 if (send_time_.is_null() || recv_first_byte_time_.is_null() || |
| 834 recv_last_byte_time_.is_null()) | 844 recv_last_byte_time_.is_null()) |
| 835 return; | 845 return; |
| 836 | 846 |
| 837 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTimeToFirstByte", | 847 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTimeToFirstByte", |
| 838 recv_first_byte_time_ - send_time_); | 848 recv_first_byte_time_ - send_time_); |
| 839 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime", | 849 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime", |
| 840 recv_last_byte_time_ - recv_first_byte_time_); | 850 recv_last_byte_time_ - recv_first_byte_time_); |
| 841 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime", | 851 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime", |
| 842 recv_last_byte_time_ - send_time_); | 852 recv_last_byte_time_ - send_time_); |
| 843 | 853 |
| 844 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_); | 854 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_); |
| 845 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_); | 855 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_); |
| 846 } | 856 } |
| 847 | 857 |
| 848 } // namespace net | 858 } // namespace net |
| OLD | NEW |