1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/tools/quic/quic_reliable_server_stream.h" 6 7 #include "base/logging.h" 8 #include "base/memory/singleton.h" 9 #include "net/tools/quic/quic_in_memory_cache.h" 10 11 using base::StringPiece; 12 13 namespace net { 14 namespace tools { 15 16 QuicReliableServerStream::QuicReliableServerStream(QuicStreamId id, 17 QuicSession* session) 18 : ReliableQuicStream(id, session) { 19 } 20 21 22 void QuicReliableServerStream::SendResponse() { 23 // Find response in cache. If not found, send error response. 24 const QuicInMemoryCache::Response* response = 25 QuicInMemoryCache::GetInstance()->GetResponse(headers_); 26 if (response == NULL) { 27 SendErrorResponse(); 28 return; 29 } 30 31 DLOG(INFO) << "Sending response for stream " << id(); 32 SendHeaders(response->headers()); 33 WriteData(response->body(), true); 34 } 35 36 void QuicReliableServerStream::SendErrorResponse() { 37 DLOG(INFO) << "Sending error response for stream " << id(); 38 BalsaHeaders headers; 39 headers.SetResponseFirstlineFromStringPieces( 40 "HTTP/1.1", "500", "Server Error"); 41 headers.ReplaceOrAppendHeader("content-length", "3"); 42 SendHeaders(headers); 43 WriteData("bad", true); 44 } 45 46 QuicConsumedData QuicReliableServerStream::WriteData(StringPiece data, 47 bool fin) { 48 // We only support SPDY and HTTP, and neither handles bidirectional streaming. 49 if (!read_side_closed()) { 50 CloseReadSide(); 51 } 52 return ReliableQuicStream::WriteData(data, fin); 53 } 54 55 } // namespace tools 56 } // namespace net 57