Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: net/spdy/spdy_stream.cc

Issue 10810069: SPDY: Add WriteHeaders interface to SpdySession and SpdyStream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« net/spdy/spdy_stream.h ('K') | « net/spdy/spdy_stream.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 send_time_ = base::TimeTicks::Now(); 130 send_time_ = base::TimeTicks::Now();
131 return frame; 131 return frame;
132 } else { 132 } else {
133 CHECK(!cancelled()); 133 CHECK(!cancelled());
134 // We must need to write stream data. 134 // We must need to write stream data.
135 // Until the headers have been completely sent, we can not be sure 135 // Until the headers have been completely sent, we can not be sure
136 // that our stream_id is correct. 136 // that our stream_id is correct.
137 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); 137 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE);
138 DCHECK_GT(stream_id_, 0u); 138 DCHECK_GT(stream_id_, 0u);
139 DCHECK(!pending_data_frames_.empty()); 139 DCHECK(!pending_data_frames_.empty());
140 SpdyFrame* frame = pending_data_frames_.front(); 140
141 PendingFrame frame = pending_data_frames_.front();
142 SpdyHeaderBlock* headers = frame.first;
143 SpdyDataFrame* data_frame = frame.second;
141 pending_data_frames_.pop_front(); 144 pending_data_frames_.pop_front();
142 return frame; 145
146 // |frame| should have one valid data.
147 DCHECK(!headers != !data_frame);
148
149 // Send queued data frame.
150 if (data_frame)
151 return data_frame;
152
153 // Create actual HEADERS frame just in time because it depends on
154 // compression context and should not be reordered after the creation.
155 SpdyFrame* header_frame = session_->CreateHeadersFrame(
156 stream_id_, *headers, SpdyControlFlags());
157 delete headers;
158 return header_frame;
143 } 159 }
144 } 160 }
145 161
146 SpdyStream::~SpdyStream() { 162 SpdyStream::~SpdyStream() {
147 UpdateHistograms(); 163 UpdateHistograms();
148 while (!pending_data_frames_.empty()) { 164 while (!pending_data_frames_.empty()) {
149 SpdyFrame* frame = pending_data_frames_.back(); 165 PendingFrame frame = pending_data_frames_.back();
166 SpdyHeaderBlock* headers = frame.first;
167 SpdyDataFrame* data_frame = frame.second;
150 pending_data_frames_.pop_back(); 168 pending_data_frames_.pop_back();
151 delete frame; 169 if (headers)
170 delete headers;
171 if (data_frame)
172 delete data_frame;
152 } 173 }
153 } 174 }
154 175
155 void SpdyStream::SetDelegate(Delegate* delegate) { 176 void SpdyStream::SetDelegate(Delegate* delegate) {
156 CHECK(delegate); 177 CHECK(delegate);
157 delegate_ = delegate; 178 delegate_ = delegate;
158 179
159 if (pushed_) { 180 if (pushed_) {
160 CHECK(response_received()); 181 CHECK(response_received());
161 MessageLoop::current()->PostTask( 182 MessageLoop::current()->PostTask(
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 send_time_ = base::TimeTicks::Now(); 569 send_time_ = base::TimeTicks::Now();
549 DCHECK(!has_upload_data_); 570 DCHECK(!has_upload_data_);
550 DCHECK(response_received()); 571 DCHECK(response_received());
551 return ERR_IO_PENDING; 572 return ERR_IO_PENDING;
552 } 573 }
553 CHECK_EQ(STATE_NONE, io_state_); 574 CHECK_EQ(STATE_NONE, io_state_);
554 io_state_ = STATE_GET_DOMAIN_BOUND_CERT; 575 io_state_ = STATE_GET_DOMAIN_BOUND_CERT;
555 return DoLoop(OK); 576 return DoLoop(OK);
556 } 577 }
557 578
558 int SpdyStream::WriteStreamData(IOBuffer* data, int length, 579 int SpdyStream::WriteHeaders(SpdyHeaderBlock* headers) {
580 // Until the first headers by SYN_STREAM have been completely sent, we can
581 // not be sure that our stream_id is correct.
582 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE);
583 CHECK_GT(stream_id_, 0u);
584
585 pending_data_frames_.push_back(PendingFrame(headers, NULL));
586
587 SetHasWriteAvailable();
588 return ERR_IO_PENDING;
589 }
590
591 int SpdyStream::WriteStreamData(IOBuffer* data,
592 int length,
559 SpdyDataFlags flags) { 593 SpdyDataFlags flags) {
560 // Until the headers have been completely sent, we can not be sure 594 // Until the headers have been completely sent, we can not be sure
561 // that our stream_id is correct. 595 // that our stream_id is correct.
562 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); 596 DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE);
563 CHECK_GT(stream_id_, 0u); 597 CHECK_GT(stream_id_, 0u);
564 598
565 pending_data_frames_.push_back( 599 SpdyDataFrame* frame = session_->CreateDataFrame(
566 session_->CreateDataFrame(stream_id_, data, length, flags)); 600 stream_id_, data, length, flags);
567 601 if (frame) {
568 SetHasWriteAvailable(); 602 pending_data_frames_.push_back(PendingFrame(NULL, frame));
603 SetHasWriteAvailable();
604 }
569 return ERR_IO_PENDING; 605 return ERR_IO_PENDING;
570 } 606 }
571 607
572 bool SpdyStream::GetSSLInfo(SSLInfo* ssl_info, 608 bool SpdyStream::GetSSLInfo(SSLInfo* ssl_info,
573 bool* was_npn_negotiated, 609 bool* was_npn_negotiated,
574 NextProto* protocol_negotiated) { 610 NextProto* protocol_negotiated) {
575 return session_->GetSSLInfo( 611 return session_->GetSSLInfo(
576 ssl_info, was_npn_negotiated, protocol_negotiated); 612 ssl_info, was_npn_negotiated, protocol_negotiated);
577 } 613 }
578 614
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime", 834 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime",
799 recv_last_byte_time_ - recv_first_byte_time_); 835 recv_last_byte_time_ - recv_first_byte_time_);
800 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime", 836 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime",
801 recv_last_byte_time_ - send_time_); 837 recv_last_byte_time_ - send_time_);
802 838
803 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_); 839 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_);
804 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_); 840 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_);
805 } 841 }
806 842
807 } // namespace net 843 } // namespace net
OLDNEW
« net/spdy/spdy_stream.h ('K') | « net/spdy/spdy_stream.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698