Index: net/tools/quic/quic_spdy_server_stream.cc |
diff --git a/net/tools/quic/quic_spdy_server_stream.cc b/net/tools/quic/quic_spdy_server_stream.cc |
index e325fe3818ee3f55e20f2bdb799b3175a03c5e18..ea23c5968bd9c88143d3e687f4d1acd94cbbb166 100644 |
--- a/net/tools/quic/quic_spdy_server_stream.cc |
+++ b/net/tools/quic/quic_spdy_server_stream.cc |
@@ -4,10 +4,13 @@ |
#include "net/tools/quic/quic_spdy_server_stream.h" |
+#include "base/memory/singleton.h" |
#include "net/quic/quic_session.h" |
#include "net/spdy/spdy_framer.h" |
+#include "net/tools/quic/quic_in_memory_cache.h" |
#include "net/tools/quic/spdy_utils.h" |
+using base::StringPiece; |
using std::string; |
namespace net { |
@@ -17,7 +20,7 @@ static const size_t kHeaderBufInitialSize = 4096; |
QuicSpdyServerStream::QuicSpdyServerStream(QuicStreamId id, |
QuicSession* session) |
- : QuicReliableServerStream(id, session), |
+ : ReliableQuicStream(id, session), |
read_buf_(new GrowableIOBuffer()), |
request_headers_received_(false) { |
} |
@@ -38,8 +41,7 @@ uint32 QuicSpdyServerStream::ProcessData(const char* data, uint32 length) { |
read_buf_->set_offset(read_buf_->offset() + length); |
ParseRequestHeaders(); |
} else { |
- mutable_body()->append(data + total_bytes_processed, |
- length - total_bytes_processed); |
+ body_.append(data + total_bytes_processed, length - total_bytes_processed); |
} |
return length; |
} |
@@ -54,7 +56,7 @@ void QuicSpdyServerStream::OnFinRead() { |
SendErrorResponse(); // We're not done reading headers. |
} else if ((headers().content_length_status() == |
BalsaHeadersEnums::VALID_CONTENT_LENGTH) && |
- mutable_body()->size() != headers().content_length()) { |
+ body_.size() != headers().content_length()) { |
SendErrorResponse(); // Invalid content length |
} else { |
SendResponse(); |
@@ -83,19 +85,51 @@ int QuicSpdyServerStream::ParseRequestHeaders() { |
return -1; |
} |
- if (!SpdyUtils::FillBalsaRequestHeaders(headers, mutable_headers())) { |
+ if (!SpdyUtils::FillBalsaRequestHeaders(headers, &headers_)) { |
SendErrorResponse(); |
return -1; |
} |
size_t delta = read_buf_len - len; |
if (delta > 0) { |
- mutable_body()->append(data + len, delta); |
+ body_.append(data + len, delta); |
} |
request_headers_received_ = true; |
return len; |
} |
+void QuicSpdyServerStream::SendResponse() { |
+ // Find response in cache. If not found, send error response. |
+ const QuicInMemoryCache::Response* response = |
+ QuicInMemoryCache::GetInstance()->GetResponse(headers_); |
+ if (response == NULL) { |
+ SendErrorResponse(); |
+ return; |
+ } |
+ |
+ DLOG(INFO) << "Sending response for stream " << id(); |
+ SendHeaders(response->headers()); |
+ WriteData(response->body(), true); |
+} |
+ |
+void QuicSpdyServerStream::SendErrorResponse() { |
+ DLOG(INFO) << "Sending error response for stream " << id(); |
+ BalsaHeaders headers; |
+ headers.SetResponseFirstlineFromStringPieces( |
+ "HTTP/1.1", "500", "Server Error"); |
+ headers.ReplaceOrAppendHeader("content-length", "3"); |
+ SendHeaders(headers); |
+ WriteData("bad", true); |
+} |
+ |
+QuicConsumedData QuicSpdyServerStream::WriteData(StringPiece data, bool fin) { |
+ // We only support SPDY and HTTP, and neither handles bidirectional streaming. |
+ if (!read_side_closed()) { |
+ CloseReadSide(); |
+ } |
+ return ReliableQuicStream::WriteData(data, fin); |
+} |
+ |
} // namespace tools |
} // namespace net |