Index: net/spdy/spdy_stream.cc |
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc |
index 277188662eb1ea68559e2d2178b112b7021ecb15..78f36b9d836ee55cbf4252f3ef51e57cf99aec55 100644 |
--- a/net/spdy/spdy_stream.cc |
+++ b/net/spdy/spdy_stream.cc |
@@ -137,18 +137,39 @@ SpdyFrame* SpdyStream::ProduceNextFrame() { |
DCHECK_GT(io_state_, STATE_SEND_HEADERS_COMPLETE); |
DCHECK_GT(stream_id_, 0u); |
DCHECK(!pending_data_frames_.empty()); |
- SpdyFrame* frame = pending_data_frames_.front(); |
+ |
+ PendingFrame frame = pending_data_frames_.front(); |
+ SpdyHeaderBlock* headers = frame.first; |
+ SpdyDataFrame* data_frame = frame.second; |
pending_data_frames_.pop_front(); |
- return frame; |
+ |
+ // |frame| should have one valid data. |
+ DCHECK(!headers != !data_frame); |
+ |
+ // Send queued data frame. |
+ if (data_frame) |
+ return 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_, *headers, SpdyControlFlags()); |
+ delete headers; |
+ return header_frame; |
} |
} |
SpdyStream::~SpdyStream() { |
UpdateHistograms(); |
while (!pending_data_frames_.empty()) { |
- SpdyFrame* frame = pending_data_frames_.back(); |
+ PendingFrame frame = pending_data_frames_.back(); |
+ SpdyHeaderBlock* headers = frame.first; |
+ SpdyDataFrame* data_frame = frame.second; |
pending_data_frames_.pop_back(); |
- delete frame; |
+ if (headers) |
+ delete headers; |
+ if (data_frame) |
+ delete data_frame; |
} |
} |
@@ -555,17 +576,32 @@ 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); |
+ |
+ pending_data_frames_.push_back(PendingFrame(headers, NULL)); |
+ |
+ 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)); |
- |
- SetHasWriteAvailable(); |
+ SpdyDataFrame* frame = session_->CreateDataFrame( |
+ stream_id_, data, length, flags); |
+ if (frame) { |
+ pending_data_frames_.push_back(PendingFrame(NULL, frame)); |
+ SetHasWriteAvailable(); |
+ } |
return ERR_IO_PENDING; |
} |