| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/tools/quic/quic_simple_server_stream.h" | 5 #include "net/tools/quic/quic_simple_server_stream.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/string_piece.h" | 13 #include "base/strings/string_piece.h" |
| 14 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
| 15 #include "net/quic/core/quic_bug_tracker.h" | 15 #include "net/quic/core/quic_bug_tracker.h" |
| 16 #include "net/quic/core/quic_flags.h" | 16 #include "net/quic/core/quic_flags.h" |
| 17 #include "net/quic/core/quic_spdy_stream.h" | 17 #include "net/quic/core/quic_spdy_stream.h" |
| 18 #include "net/quic/core/spdy_utils.h" | 18 #include "net/quic/core/spdy_utils.h" |
| 19 #include "net/spdy/spdy_protocol.h" | 19 #include "net/spdy/spdy_protocol.h" |
| 20 #include "net/tools/quic/quic_in_memory_cache.h" | 20 #include "net/tools/quic/quic_in_memory_cache.h" |
| 21 #include "net/tools/quic/quic_simple_server_session.h" | 21 #include "net/tools/quic/quic_simple_server_session.h" |
| 22 | 22 |
| 23 using base::StringPiece; | 23 using base::StringPiece; |
| 24 using base::StringToInt; | 24 using base::StringToInt; |
| 25 using std::string; | 25 using std::string; |
| 26 | 26 |
| 27 namespace net { | 27 namespace net { |
| 28 | 28 |
| 29 QuicSimpleServerStream::QuicSimpleServerStream(QuicStreamId id, | 29 QuicSimpleServerStream::QuicSimpleServerStream( |
| 30 QuicSpdySession* session) | 30 QuicStreamId id, |
| 31 : QuicSpdyStream(id, session), content_length_(-1) {} | 31 QuicSpdySession* session, |
| 32 QuicInMemoryCache* in_memory_cache) |
| 33 : QuicSpdyStream(id, session), |
| 34 content_length_(-1), |
| 35 in_memory_cache_(in_memory_cache) {} |
| 32 | 36 |
| 33 QuicSimpleServerStream::~QuicSimpleServerStream() {} | 37 QuicSimpleServerStream::~QuicSimpleServerStream() {} |
| 34 | 38 |
| 35 void QuicSimpleServerStream::OnInitialHeadersComplete( | 39 void QuicSimpleServerStream::OnInitialHeadersComplete( |
| 36 bool fin, | 40 bool fin, |
| 37 size_t frame_len, | 41 size_t frame_len, |
| 38 const QuicHeaderList& header_list) { | 42 const QuicHeaderList& header_list) { |
| 39 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len, header_list); | 43 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len, header_list); |
| 40 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length_, | 44 if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length_, |
| 41 &request_headers_)) { | 45 &request_headers_)) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 DVLOG(1) << "Request headers do not contain :authority or :path."; | 127 DVLOG(1) << "Request headers do not contain :authority or :path."; |
| 124 SendErrorResponse(); | 128 SendErrorResponse(); |
| 125 return; | 129 return; |
| 126 } | 130 } |
| 127 | 131 |
| 128 // Find response in cache. If not found, send error response. | 132 // Find response in cache. If not found, send error response. |
| 129 const QuicInMemoryCache::Response* response = nullptr; | 133 const QuicInMemoryCache::Response* response = nullptr; |
| 130 auto authority = request_headers_.find(":authority"); | 134 auto authority = request_headers_.find(":authority"); |
| 131 auto path = request_headers_.find(":path"); | 135 auto path = request_headers_.find(":path"); |
| 132 if (authority != request_headers_.end() && path != request_headers_.end()) { | 136 if (authority != request_headers_.end() && path != request_headers_.end()) { |
| 133 response = QuicInMemoryCache::GetInstance()->GetResponse(authority->second, | 137 response = in_memory_cache_->GetResponse(authority->second, path->second); |
| 134 path->second); | |
| 135 } | 138 } |
| 136 if (response == nullptr) { | 139 if (response == nullptr) { |
| 137 DVLOG(1) << "Response not found in cache."; | 140 DVLOG(1) << "Response not found in cache."; |
| 138 SendNotFoundResponse(); | 141 SendNotFoundResponse(); |
| 139 return; | 142 return; |
| 140 } | 143 } |
| 141 | 144 |
| 142 if (response->response_type() == QuicInMemoryCache::CLOSE_CONNECTION) { | 145 if (response->response_type() == QuicInMemoryCache::CLOSE_CONNECTION) { |
| 143 DVLOG(1) << "Special response: closing connection."; | 146 DVLOG(1) << "Special response: closing connection."; |
| 144 CloseConnectionWithDetails(QUIC_NO_ERROR, "Toy server forcing close"); | 147 CloseConnectionWithDetails(QUIC_NO_ERROR, "Toy server forcing close"); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 175 // This behavior mirrors the HTTP/2 implementation. | 178 // This behavior mirrors the HTTP/2 implementation. |
| 176 bool is_redirection = response_code / 100 == 3; | 179 bool is_redirection = response_code / 100 == 3; |
| 177 if (response_code != 200 && !is_redirection) { | 180 if (response_code != 200 && !is_redirection) { |
| 178 LOG(WARNING) << "Response to server push request " << request_url | 181 LOG(WARNING) << "Response to server push request " << request_url |
| 179 << " result in response code " << response_code; | 182 << " result in response code " << response_code; |
| 180 Reset(QUIC_STREAM_CANCELLED); | 183 Reset(QUIC_STREAM_CANCELLED); |
| 181 return; | 184 return; |
| 182 } | 185 } |
| 183 } | 186 } |
| 184 std::list<QuicInMemoryCache::ServerPushInfo> resources = | 187 std::list<QuicInMemoryCache::ServerPushInfo> resources = |
| 185 QuicInMemoryCache::GetInstance()->GetServerPushResources(request_url); | 188 in_memory_cache_->GetServerPushResources(request_url); |
| 186 DVLOG(1) << "Found " << resources.size() << " push resources for stream " | 189 DVLOG(1) << "Found " << resources.size() << " push resources for stream " |
| 187 << id(); | 190 << id(); |
| 188 | 191 |
| 189 if (!resources.empty()) { | 192 if (!resources.empty()) { |
| 190 QuicSimpleServerSession* session = | 193 QuicSimpleServerSession* session = |
| 191 static_cast<QuicSimpleServerSession*>(spdy_session()); | 194 static_cast<QuicSimpleServerSession*>(spdy_session()); |
| 192 session->PromisePushResources(request_url, resources, id(), | 195 session->PromisePushResources(request_url, resources, id(), |
| 193 request_headers_); | 196 request_headers_); |
| 194 } | 197 } |
| 195 | 198 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 DVLOG(1) << "Writing trailers (fin = true): " | 258 DVLOG(1) << "Writing trailers (fin = true): " |
| 256 << response_trailers.DebugString(); | 259 << response_trailers.DebugString(); |
| 257 WriteTrailers(std::move(response_trailers), nullptr); | 260 WriteTrailers(std::move(response_trailers), nullptr); |
| 258 } | 261 } |
| 259 | 262 |
| 260 const char* const QuicSimpleServerStream::kErrorResponseBody = "bad"; | 263 const char* const QuicSimpleServerStream::kErrorResponseBody = "bad"; |
| 261 const char* const QuicSimpleServerStream::kNotFoundResponseBody = | 264 const char* const QuicSimpleServerStream::kNotFoundResponseBody = |
| 262 "file not found"; | 265 "file not found"; |
| 263 | 266 |
| 264 } // namespace net | 267 } // namespace net |
| OLD | NEW |