Chromium Code Reviews| 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 |
| index de6917d3c7401a6eff3871807350ef945fe933ce..8dca3c4b30a4948dfbc4f0beb2296fe043cdc25c 100644 |
| --- a/net/quic/quic_spdy_server_stream.cc |
| +++ b/net/quic/quic_spdy_server_stream.cc |
| @@ -5,14 +5,15 @@ |
| #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/spdy/spdy_framer.h" |
| -#include "net/tools/quic/spdy_utils.h" |
| +#include "net/spdy/spdy_header_block.h" |
| +#include "net/spdy/spdy_http_utils.h" |
| using base::StringPiece; |
| using std::string; |
| -using net::tools::SpdyUtils; |
| namespace net { |
| @@ -39,11 +40,10 @@ uint32 QuicSpdyServerStream::ProcessData(const char* data, uint32 data_len) { |
| } |
| memcpy(read_buf_->data(), data, data_len); |
| read_buf_->set_offset(read_buf_->offset() + data_len); |
| - ParseRequestHeaders(); |
| - } else { |
| - body_.append(data + total_bytes_processed, |
| - data_len - total_bytes_processed); |
| + total_bytes_processed = ParseRequestHeaders(); |
|
wtc
2014/06/25 22:22:24
Check for -1 return value.
dmziegler
2014/06/26 01:23:29
Now it's void.
|
| } |
| + body_.append(data + total_bytes_processed, |
| + data_len - total_bytes_processed); |
|
wtc
2014/06/25 23:17:32
IMPORTANT: I think this code is wrong if read_buf_
dmziegler
2014/06/26 01:23:29
Done.
|
| return data_len; |
| } |
| @@ -55,36 +55,34 @@ void QuicSpdyServerStream::OnFinRead() { |
| if (!request_headers_received_) { |
| SendErrorResponse(); // We're not done reading headers. |
| - } else if ((headers_.content_length_status() == |
| - BalsaHeadersEnums::VALID_CONTENT_LENGTH) && |
| - body_.size() != headers_.content_length()) { |
| - SendErrorResponse(); // Invalid content length |
| } else { |
| - SendResponse(); |
| + SpdyHeaderBlock::iterator it = headers_.find("content-length"); |
|
wtc
2014/06/25 22:22:24
Use a const_iterator.
dmziegler
2014/06/26 01:23:29
Done.
|
| + uint64 content_length; |
| + if(it != headers_.end() && |
|
wtc
2014/06/25 22:22:24
Add a space after "if".
dmziegler
2014/06/26 01:23:29
Done.
|
| + (!base::StringToUint64(it->second, &content_length) || |
|
wtc
2014/06/25 22:22:24
I wonder if it's better to use base::StringToSizeT
dmziegler
2014/06/26 01:23:29
Done.
|
| + body_.size() != content_length)) { |
| + SendErrorResponse(); // Invalid content length |
| + } else { |
| + SendResponse(); |
| + } |
| } |
|
wtc
2014/06/25 22:22:24
Nit: to avoid nesting the if statements, it may be
dmziegler
2014/06/26 01:23:29
Done.
|
| } |
| size_t QuicSpdyServerStream::ParseRequestHeaders() { |
|
wtc
2014/06/25 22:22:24
IMPORTANT: since this function may return -1, the
dmziegler
2014/06/26 01:23:29
Now I've made it void since the return value wasn'
|
| size_t read_buf_len = static_cast<size_t>(read_buf_->offset()); |
| SpdyFramer framer(SPDY3); |
| - SpdyHeaderBlock headers; |
| char* data = read_buf_->StartOfBuffer(); |
|
wtc
2014/06/25 22:22:24
Move line 72 after this line.
dmziegler
2014/06/26 01:23:29
Done.
|
| - size_t len = framer.ParseHeaderBlockInBuffer(data, read_buf_->offset(), |
| - &headers); |
| + size_t len = framer.ParseHeaderBlockInBuffer(data, read_buf_len, &headers_); |
| if (len == 0) { |
| return -1; |
| } |
| - if (!SpdyUtils::FillBalsaRequestHeaders(headers, &headers_)) { |
| + request_url_ = GetUrlFromHeaderBlock(headers_, SPDY3, false); |
|
wtc
2014/06/25 22:22:24
Is it OK to hardcode the version SPDY3?
dmziegler
2014/06/26 01:23:29
All the test code seems to standardize on SPDY3 --
|
| + if (!request_url_.is_valid()) { |
| SendErrorResponse(); |
| return -1; |
| } |
| - size_t delta = read_buf_len - len; |
| - if (delta > 0) { |
| - body_.append(data + len, delta); |
| - } |
|
wtc
2014/06/25 22:22:24
IMPORTANT: Why is this code deleted?
dmziegler
2014/06/26 01:23:29
No longer deleted.
|
| - |
| request_headers_received_ = true; |
| return len; |
| } |
| @@ -92,7 +90,7 @@ size_t QuicSpdyServerStream::ParseRequestHeaders() { |
| void QuicSpdyServerStream::SendResponse() { |
| // Find response in cache. If not found, send error response. |
| const QuicInMemoryCache::Response* response = |
| - QuicInMemoryCache::GetInstance()->GetResponse(headers_); |
| + QuicInMemoryCache::GetInstance()->GetResponse(request_url_); |
| if (response == NULL) { |
| SendErrorResponse(); |
| return; |
| @@ -115,23 +113,22 @@ void QuicSpdyServerStream::SendResponse() { |
| void QuicSpdyServerStream::SendErrorResponse() { |
| DVLOG(1) << "Sending error response for stream " << id(); |
| - BalsaHeaders headers; |
| - headers.SetResponseFirstlineFromStringPieces( |
| - "HTTP/1.1", "500", "Server Error"); |
| - headers.ReplaceOrAppendHeader("content-length", "3"); |
| + scoped_refptr<HttpResponseHeaders> headers |
| + = new HttpResponseHeaders("HTTP/1.1 500 Server Error\n" |
| + "content-length: 3\n"); |
|
wtc
2014/06/25 22:22:24
IMPORTANT: according to the comments in http_respo
dmziegler
2014/06/26 01:23:29
Done.
|
| SendHeadersAndBody(headers, "bad"); |
| } |
| void QuicSpdyServerStream::SendHeadersAndBody( |
| - const BalsaHeaders& response_headers, |
| + scoped_refptr<HttpResponseHeaders> response_headers, |
| StringPiece body) { |
| // We only support SPDY and HTTP, and neither handles bidirectional streaming. |
| if (!read_side_closed()) { |
| CloseReadSide(); |
| } |
| - SpdyHeaderBlock header_block = |
| - SpdyUtils::ResponseHeadersToSpdyHeaders(response_headers); |
| + SpdyHeaderBlock header_block; |
| + CreateSpdyHeadersFromHttpResponse(response_headers, SPDY3, &header_block); |
|
wtc
2014/06/25 22:22:24
IMPORTANT: is it OK to hardcode the version SPDY3?
dmziegler
2014/06/26 01:23:29
Seems to be, since it's used only used for testing
|
| WriteHeaders(header_block, body.empty(), NULL); |