summaryrefslogtreecommitdiffstats
path: root/net/spdy/spdy_http_stream.cc
diff options
context:
space:
mode:
authorsatish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-04 07:54:39 +0000
committersatish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-04 07:54:39 +0000
commitbf96f533df6515f9ddea3278515a77ab81c00263 (patch)
tree72ba664e83a3a5880b1b16bd379d041c2e85e368 /net/spdy/spdy_http_stream.cc
parent26c2f823d194dc69819b7def92f920f0ec861df5 (diff)
downloadchromium_src-bf96f533df6515f9ddea3278515a77ab81c00263.zip
chromium_src-bf96f533df6515f9ddea3278515a77ab81c00263.tar.gz
chromium_src-bf96f533df6515f9ddea3278515a77ab81c00263.tar.bz2
Add chunked uploads support to SPDY
As part of this, I had to move the chunked encoding part from UploadData::Element::SetChunk to HttpStreamParser::DoSendBody as SPDY doesn't have this encoded format and UploadData needs to serve both. BUG=none TEST=net_unittests (2 new tests added) Review URL: http://codereview.chromium.org/6292013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@76892 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy/spdy_http_stream.cc')
-rw-r--r--net/spdy/spdy_http_stream.cc31
1 files changed, 26 insertions, 5 deletions
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc
index e07578e..51a2efd 100644
--- a/net/spdy/spdy_http_stream.cc
+++ b/net/spdy/spdy_http_stream.cc
@@ -177,6 +177,11 @@ void SpdyHttpStream::SetConnectionReused() {
// SPDY doesn't need an indicator here.
}
+void SpdyHttpStream::set_chunk_callback(ChunkCallback* callback) {
+ if (request_body_stream_ != NULL)
+ request_body_stream_->set_chunk_callback(callback);
+}
+
int SpdyHttpStream::SendRequest(const HttpRequestHeaders& request_headers,
UploadDataStream* request_body,
HttpResponseInfo* response,
@@ -200,7 +205,7 @@ int SpdyHttpStream::SendRequest(const HttpRequestHeaders& request_headers,
CHECK(!request_body_stream_.get());
if (request_body) {
- if (request_body->size())
+ if (request_body->size() || request_body->is_chunked())
request_body_stream_.reset(request_body);
else
delete request_body;
@@ -264,17 +269,33 @@ bool SpdyHttpStream::OnSendHeadersComplete(int status) {
int SpdyHttpStream::OnSendBody() {
CHECK(request_body_stream_.get());
+
int buf_len = static_cast<int>(request_body_stream_->buf_len());
if (!buf_len)
return OK;
- return stream_->WriteStreamData(request_body_stream_->buf(), buf_len,
- spdy::DATA_FLAG_FIN);
+ bool is_chunked = request_body_stream_->is_chunked();
+ // TODO(satish): For non-chunked POST data, we set DATA_FLAG_FIN for all
+ // blocks of data written out. This is wrong if the POST data was larger than
+ // UploadDataStream::kBufSize as that is the largest buffer that
+ // UploadDataStream returns at a time and we'll be setting the FIN flag for
+ // each block of data written out.
+ bool eof = !is_chunked || request_body_stream_->IsOnLastChunk();
+ return stream_->WriteStreamData(
+ request_body_stream_->buf(), buf_len,
+ eof ? spdy::DATA_FLAG_FIN : spdy::DATA_FLAG_NONE);
}
-bool SpdyHttpStream::OnSendBodyComplete(int status) {
+int SpdyHttpStream::OnSendBodyComplete(int status, bool* eof) {
CHECK(request_body_stream_.get());
+
request_body_stream_->MarkConsumedAndFillBuffer(status);
- return request_body_stream_->eof();
+ *eof = request_body_stream_->eof();
+ if (!*eof &&
+ request_body_stream_->is_chunked() &&
+ !request_body_stream_->buf_len())
+ return ERR_IO_PENDING;
+
+ return OK;
}
int SpdyHttpStream::OnResponseReceived(const spdy::SpdyHeaderBlock& response,