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

Unified 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: for commit 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_stream.h ('k') | net/spdy/spdy_stream_spdy2_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « net/spdy/spdy_stream.h ('k') | net/spdy/spdy_stream_spdy2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698