Index: net/quic/quic_spdy_server_stream.cc |
diff --git a/net/quic/quic_spdy_server_stream.cc b/net/quic/quic_spdy_server_stream.cc |
deleted file mode 100644 |
index b0f8abb2ce939a2760edcf9b8c8cffe27982e514..0000000000000000000000000000000000000000 |
--- a/net/quic/quic_spdy_server_stream.cc |
+++ /dev/null |
@@ -1,163 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/quic/quic_spdy_server_stream.h" |
- |
-#include "base/memory/singleton.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "net/quic/quic_in_memory_cache.h" |
-#include "net/quic/quic_session.h" |
-#include "net/quic/spdy_utils.h" |
-#include "net/spdy/spdy_framer.h" |
-#include "net/spdy/spdy_header_block.h" |
-#include "net/spdy/spdy_http_utils.h" |
- |
-using base::StringPiece; |
-using std::string; |
- |
-namespace net { |
- |
-static const size_t kHeaderBufInitialSize = 4096; |
- |
-QuicSpdyServerStream::QuicSpdyServerStream(QuicStreamId id, |
- QuicSession* session) |
- : QuicDataStream(id, session), |
- read_buf_(new GrowableIOBuffer()), |
- request_headers_received_(false) { |
- read_buf_->SetCapacity(kHeaderBufInitialSize); |
-} |
- |
-QuicSpdyServerStream::~QuicSpdyServerStream() { |
-} |
- |
-uint32 QuicSpdyServerStream::ProcessData(const char* data, uint32 data_len) { |
- if (data_len > INT_MAX) { |
- LOG(DFATAL) << "Data length too long: " << data_len; |
- return 0; |
- } |
- // Are we still reading the request headers. |
- if (!request_headers_received_) { |
- // Grow the read buffer if necessary. |
- while (read_buf_->RemainingCapacity() < static_cast<int>(data_len)) { |
- read_buf_->SetCapacity(read_buf_->capacity() * 2); |
- } |
- memcpy(read_buf_->data(), data, data_len); |
- read_buf_->set_offset(read_buf_->offset() + data_len); |
- // Try parsing the request headers. This will set request_headers_received_ |
- // if successful; if not, it will be tried again with more data. |
- ParseRequestHeaders(); |
- } else { |
- body_.append(data, data_len); |
- } |
- return data_len; |
-} |
- |
-void QuicSpdyServerStream::OnFinRead() { |
- ReliableQuicStream::OnFinRead(); |
- if (write_side_closed() || fin_buffered()) { |
- return; |
- } |
- |
- if (!request_headers_received_) { |
- SendErrorResponse(); // We're not done reading headers. |
- return; |
- } |
- |
- SpdyHeaderBlock::const_iterator it = headers_.find("content-length"); |
- size_t content_length; |
- if (it != headers_.end() && |
- (!base::StringToSizeT(it->second, &content_length) || |
- body_.size() != content_length)) { |
- SendErrorResponse(); // Invalid content length |
- return; |
- } |
- |
- SendResponse(); |
-} |
- |
-// Try parsing the request headers. If successful, sets |
-// request_headers_received_. If not successful, it can just be tried again once |
-// there's more data. |
-void QuicSpdyServerStream::ParseRequestHeaders() { |
- SpdyFramer framer((kDefaultSpdyMajorVersion)); |
- const char* data = read_buf_->StartOfBuffer(); |
- size_t read_buf_len = static_cast<size_t>(read_buf_->offset()); |
- size_t len = framer.ParseHeaderBlockInBuffer(data, read_buf_len, &headers_); |
- if (len == 0) { |
- // Not enough data yet, presumably. (If we still don't succeed by the end of |
- // the stream, then we'll error in OnFinRead().) |
- return; |
- } |
- |
- // Headers received and parsed: extract the request URL. |
- request_url_ = GetUrlFromHeaderBlock(headers_, |
- kDefaultSpdyMajorVersion, |
- false); |
- if (!request_url_.is_valid()) { |
- SendErrorResponse(); |
- return; |
- } |
- |
- // Add any data past the headers to the request body. |
- size_t delta = read_buf_len - len; |
- if (delta > 0) { |
- body_.append(data + len, delta); |
- } |
- |
- request_headers_received_ = true; |
-} |
- |
-void QuicSpdyServerStream::SendResponse() { |
- // Find response in cache. If not found, send error response. |
- const QuicInMemoryCache::Response* response = |
- QuicInMemoryCache::GetInstance()->GetResponse(request_url_); |
- if (response == nullptr) { |
- SendErrorResponse(); |
- return; |
- } |
- |
- if (response->response_type() == QuicInMemoryCache::CLOSE_CONNECTION) { |
- DVLOG(1) << "Special response: closing connection."; |
- CloseConnection(QUIC_NO_ERROR); |
- return; |
- } |
- |
- if (response->response_type() == QuicInMemoryCache::IGNORE_REQUEST) { |
- DVLOG(1) << "Special response: ignoring request."; |
- return; |
- } |
- |
- DVLOG(1) << "Sending response for stream " << id(); |
- SendHeadersAndBody(response->headers(), response->body()); |
-} |
- |
-void QuicSpdyServerStream::SendErrorResponse() { |
- DVLOG(1) << "Sending error response for stream " << id(); |
- scoped_refptr<HttpResponseHeaders> headers |
- = new HttpResponseHeaders(string("HTTP/1.1 500 Server Error") + '\0' + |
- "content-length: 3" + '\0' + '\0'); |
- SendHeadersAndBody(*headers.get(), "bad"); |
-} |
- |
-void QuicSpdyServerStream::SendHeadersAndBody( |
- const HttpResponseHeaders& response_headers, |
- StringPiece body) { |
- // We only support SPDY and HTTP, and neither handles bidirectional streaming. |
- if (!read_side_closed()) { |
- CloseReadSide(); |
- } |
- |
- SpdyHeaderBlock header_block; |
- CreateSpdyHeadersFromHttpResponse(response_headers, |
- kDefaultSpdyMajorVersion, |
- &header_block); |
- |
- WriteHeaders(header_block, body.empty(), nullptr); |
- |
- if (!body.empty()) { |
- WriteOrBufferData(body, true, nullptr); |
- } |
-} |
- |
-} // namespace net |