Chromium Code Reviews| Index: net/spdy/spdy_stream.cc |
| diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc |
| index 277188662eb1ea68559e2d2178b112b7021ecb15..d9e1c24488f288a65a58d13e0d4c50fbcb9c5224 100644 |
| --- a/net/spdy/spdy_stream.cc |
| +++ b/net/spdy/spdy_stream.cc |
| @@ -136,19 +136,33 @@ SpdyFrame* SpdyStream::ProduceNextFrame() { |
| // that our stream_id is correct. |
| DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); |
| DCHECK_GT(stream_id_, 0u); |
| - DCHECK(!pending_data_frames_.empty()); |
| - SpdyFrame* frame = pending_data_frames_.front(); |
| - pending_data_frames_.pop_front(); |
| - return frame; |
| + DCHECK(!pending_frames_.empty()); |
| + |
| + PendingFrame frame = pending_frames_.front(); |
| + pending_frames_.pop_front(); |
| + |
| + // Send queued data frame. |
| + if (frame.type == TYPE_DATA) |
|
Ryan Hamilton
2012/08/02 16:32:23
This code is much cleaner now. Nice!
nit: I wou
Takashi Toyoshima
2012/08/03 05:11:12
looks safer.
I follow your idea.
Also, I added NO
|
| + return frame.data.data_frame; |
| + |
| + // Create actual HEADERS frame just in time because it depends on |
| + // compression context and should not be reordered after the creation. |
| + SpdyFrame* header_frame = session_->CreateHeadersFrame( |
| + stream_id_, *frame.data.header_block, SpdyControlFlags()); |
| + delete frame.data.header_block; |
| + return header_frame; |
| } |
| } |
| SpdyStream::~SpdyStream() { |
| UpdateHistograms(); |
| - while (!pending_data_frames_.empty()) { |
| - SpdyFrame* frame = pending_data_frames_.back(); |
| - pending_data_frames_.pop_back(); |
| - delete frame; |
| + while (!pending_frames_.empty()) { |
| + PendingFrame frame = pending_frames_.back(); |
| + pending_frames_.pop_back(); |
| + if (frame.type == TYPE_DATA) |
| + delete frame.data.data_frame; |
| + else |
| + delete frame.data.header_block; |
| } |
| } |
| @@ -555,15 +569,38 @@ int SpdyStream::SendRequest(bool has_upload_data) { |
| return DoLoop(OK); |
| } |
| -int SpdyStream::WriteStreamData(IOBuffer* data, int length, |
| +int SpdyStream::WriteHeaders(SpdyHeaderBlock* headers) { |
| + // Until the first headers by SYN_STREAM have been completely sent, we can |
| + // not be sure that our stream_id is correct. |
| + DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); |
| + CHECK_GT(stream_id_, 0u); |
| + |
| + PendingFrame frame; |
| + frame.type = TYPE_HEADER; |
| + frame.data.header_block = headers; |
| + pending_frames_.push_back(frame); |
| + |
| + SetHasWriteAvailable(); |
| + return ERR_IO_PENDING; |
| +} |
| + |
| +int SpdyStream::WriteStreamData(IOBuffer* data, |
| + int length, |
| SpdyDataFlags flags) { |
| // Until the headers have been completely sent, we can not be sure |
| // that our stream_id is correct. |
| DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); |
| CHECK_GT(stream_id_, 0u); |
| - pending_data_frames_.push_back( |
| - session_->CreateDataFrame(stream_id_, data, length, flags)); |
| + SpdyDataFrame* data_frame = session_->CreateDataFrame( |
| + stream_id_, data, length, flags); |
| + if (!data_frame) |
| + return ERR_IO_PENDING; |
| + |
| + PendingFrame frame; |
| + frame.type = TYPE_DATA; |
| + frame.data.data_frame = data_frame; |
| + pending_frames_.push_back(frame); |
| SetHasWriteAvailable(); |
| return ERR_IO_PENDING; |