| Index: net/spdy/spdy_stream.cc
|
| diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
|
| index 277188662eb1ea68559e2d2178b112b7021ecb15..44b68f8a107a55e40d35945a577cdc30bff31257 100644
|
| --- a/net/spdy/spdy_stream.cc
|
| +++ b/net/spdy/spdy_stream.cc
|
| @@ -136,19 +136,36 @@ 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();
|
| +
|
| + if (frame.type == TYPE_DATA) {
|
| + // Send queued data frame.
|
| + return frame.data_frame;
|
| + } else {
|
| + DCHECK(frame.type == TYPE_HEADER);
|
| + // 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.header_block, SpdyControlFlags());
|
| + delete frame.header_block;
|
| + return header_frame;
|
| + }
|
| }
|
| + NOTREACHED();
|
| }
|
|
|
| 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_frame;
|
| + else
|
| + delete frame.header_block;
|
| }
|
| }
|
|
|
| @@ -555,15 +572,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.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_frame = data_frame;
|
| + pending_frames_.push_back(frame);
|
|
|
| SetHasWriteAvailable();
|
| return ERR_IO_PENDING;
|
|
|