Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1581)

Unified Diff: net/quic/quic_in_memory_cache.cc

Issue 337093003: QuicServer: Use Chrome's header parsing rather than Balsa (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@quic_server_3
Patch Set: Address review comments Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/quic/quic_in_memory_cache.cc
diff --git a/net/quic/quic_in_memory_cache.cc b/net/quic/quic_in_memory_cache.cc
index 628fe9a5fa8a9d0d8ee0d11e83ff642710317ace..a7afc20a967ea2974f2a3c89918ec057032775c3 100644
--- a/net/quic/quic_in_memory_cache.cc
+++ b/net/quic/quic_in_memory_cache.cc
@@ -7,7 +7,8 @@
#include "base/files/file_enumerator.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
-#include "net/tools/balsa/balsa_headers.h"
+#include "net/http/http_util.h"
+#include "net/quic/string_piece_utils.h"
using base::FilePath;
using base::StringPiece;
@@ -21,45 +22,11 @@ namespace net {
FilePath::StringType g_quic_in_memory_cache_dir = FILE_PATH_LITERAL("");
-namespace {
-
-// BalsaVisitor implementation (glue) which caches response bodies.
-class CachingBalsaVisitor : public NoOpBalsaVisitor {
- public:
- CachingBalsaVisitor() : done_framing_(false) {}
- virtual void ProcessBodyData(const char* input, size_t size) OVERRIDE {
- AppendToBody(input, size);
- }
- virtual void MessageDone() OVERRIDE {
- done_framing_ = true;
- }
- virtual void HandleHeaderError(BalsaFrame* framer) OVERRIDE {
- UnhandledError();
- }
- virtual void HandleHeaderWarning(BalsaFrame* framer) OVERRIDE {
- UnhandledError();
- }
- virtual void HandleChunkingError(BalsaFrame* framer) OVERRIDE {
- UnhandledError();
- }
- virtual void HandleBodyError(BalsaFrame* framer) OVERRIDE {
- UnhandledError();
- }
- void UnhandledError() {
- LOG(DFATAL) << "Unhandled error framing HTTP.";
- }
- void AppendToBody(const char* input, size_t size) {
- body_.append(input, size);
- }
- bool done_framing() const { return done_framing_; }
- const string& body() const { return body_; }
-
- private:
- bool done_framing_;
- string body_;
-};
+QuicInMemoryCache::Response::Response() : response_type_(REGULAR_RESPONSE) {
+}
-} // namespace
+QuicInMemoryCache::Response::~Response() {
+}
// static
QuicInMemoryCache* QuicInMemoryCache::GetInstance() {
@@ -67,57 +34,52 @@ QuicInMemoryCache* QuicInMemoryCache::GetInstance() {
}
const QuicInMemoryCache::Response* QuicInMemoryCache::GetResponse(
- const BalsaHeaders& request_headers) const {
- ResponseMap::const_iterator it = responses_.find(GetKey(request_headers));
+ const GURL& url) const {
+ ResponseMap::const_iterator it = responses_.find(url.spec());
if (it == responses_.end()) {
return NULL;
}
return it->second;
}
-void QuicInMemoryCache::AddSimpleResponse(StringPiece method,
- StringPiece path,
- StringPiece version,
+void QuicInMemoryCache::AddSimpleResponse(StringPiece path,
StringPiece response_code,
StringPiece response_detail,
StringPiece body) {
- BalsaHeaders request_headers, response_headers;
- request_headers.SetRequestFirstlineFromStringPieces(method,
- path,
- version);
- response_headers.SetRequestFirstlineFromStringPieces(version,
- response_code,
- response_detail);
- response_headers.AppendHeader("content-length",
- base::IntToString(body.length()));
-
- AddResponse(request_headers, response_headers, body);
+ GURL url(path.as_string());
+
+ scoped_refptr<HttpResponseHeaders> response_headers =
+ new HttpResponseHeaders("");
+ response_headers->ReplaceStatusLine(response_code.as_string() + " " +
+ response_detail.as_string() + " " +
+ body.as_string());
+ response_headers->AddHeader("content-length: " +
+ base::IntToString(body.length()));
+
+ AddResponse(url, response_headers, body);
}
-void QuicInMemoryCache::AddResponse(const BalsaHeaders& request_headers,
- const BalsaHeaders& response_headers,
- StringPiece response_body) {
- VLOG(1) << "Adding response for: " << GetKey(request_headers);
- if (ContainsKey(responses_, GetKey(request_headers))) {
+void QuicInMemoryCache::AddResponse(
+ const GURL& url,
+ scoped_refptr<HttpResponseHeaders> response_headers,
+ StringPiece response_body) {
+ VLOG(1) << "Adding response for: " << url.spec();
+ if (ContainsKey(responses_, url.spec())) {
LOG(DFATAL) << "Response for given request already exists!";
return;
}
Response* new_response = new Response();
new_response->set_headers(response_headers);
new_response->set_body(response_body);
- responses_[GetKey(request_headers)] = new_response;
+ responses_[url.spec()] = new_response;
}
-void QuicInMemoryCache::AddSpecialResponse(StringPiece method,
- StringPiece path,
- StringPiece version,
+void QuicInMemoryCache::AddSpecialResponse(StringPiece path,
SpecialResponseType response_type) {
- BalsaHeaders request_headers, response_headers;
- request_headers.SetRequestFirstlineFromStringPieces(method,
- path,
- version);
- AddResponse(request_headers, response_headers, "");
- responses_[GetKey(request_headers)]->response_type_ = response_type;
+ GURL url(path.as_string());
+
+ AddResponse(url, new HttpResponseHeaders(""), "");
+ responses_[url.spec()]->response_type_ = response_type;
}
QuicInMemoryCache::QuicInMemoryCache() {
@@ -146,74 +108,51 @@ void QuicInMemoryCache::Initialize() {
FilePath file = file_list.Next();
while (!file.empty()) {
// Need to skip files in .svn directories
- if (file.value().find(FILE_PATH_LITERAL("/.svn/")) != std::string::npos) {
+ if (file.value().find(FILE_PATH_LITERAL("/.svn/")) != string::npos) {
file = file_list.Next();
continue;
}
- BalsaHeaders request_headers, response_headers;
-
string file_contents;
base::ReadFileToString(file, &file_contents);
- // Frame HTTP.
- CachingBalsaVisitor caching_visitor;
- BalsaFrame framer;
- framer.set_balsa_headers(&response_headers);
- framer.set_balsa_visitor(&caching_visitor);
- size_t processed = 0;
- while (processed < file_contents.length() &&
- !caching_visitor.done_framing()) {
- processed += framer.ProcessInput(file_contents.c_str() + processed,
- file_contents.length() - processed);
+ int headers_end = HttpUtil::LocateEndOfHeaders(file_contents.c_str(),
+ file_contents.size());
+ if (headers_end < 1) {
+ LOG(DFATAL) << "Could not find end of headers in file: " << file.value();
}
- string response_headers_str;
- response_headers.DumpToString(&response_headers_str);
- if (!caching_visitor.done_framing()) {
- LOG(DFATAL) << "Did not frame entire message from file: " << file.value()
- << " (" << processed << " of " << file_contents.length()
- << " bytes).";
- }
- if (processed < file_contents.length()) {
- // Didn't frame whole file. Assume remainder is body.
- // This sometimes happens as a result of incompatibilities between
- // BalsaFramer and wget's serialization of HTTP sans content-length.
- caching_visitor.AppendToBody(file_contents.c_str() + processed,
- file_contents.length() - processed);
- processed += file_contents.length();
- }
+ string raw_headers =
+ HttpUtil::AssembleRawHeaders(file_contents.c_str(), headers_end);
- string utf8_file = file.AsUTF8Unsafe();
- StringPiece base = utf8_file;
- if (response_headers.HasHeader("X-Original-Url")) {
- base = response_headers.GetHeader("X-Original-Url");
- response_headers.RemoveAllOfHeader("X-Original-Url");
- // Remove the protocol so that the string is of the form host + path,
- // which is parsed properly below.
+ scoped_refptr<HttpResponseHeaders> response_headers =
+ new HttpResponseHeaders(raw_headers);
+
+ string base;
+ if (response_headers->HasHeader("X-Original-Url")) {
+ if (!response_headers->GetNormalizedHeader("X-Original-Url", &base)) {
+ LOG(DFATAL) << "Failed to read X-Original-Url in file: "
+ << file.value();
+ }
+ response_headers->RemoveHeader("X-Original-Url");
+ // Remove the protocol so we can add it below.
if (StringPieceUtils::StartsWithIgnoreCase(base, "https://")) {
- base.remove_prefix(8);
+ base = base.substr(8);
} else if (StringPieceUtils::StartsWithIgnoreCase(base, "http://")) {
- base.remove_prefix(7);
+ base = base.substr(7);
}
+ } else {
+ base = file.AsUTF8Unsafe();
}
- int path_start = base.find_first_of('/');
- DCHECK_LT(0, path_start);
- StringPiece host(base.substr(0, path_start));
- StringPiece path(base.substr(path_start));
- if (path[path.length() - 1] == ',') {
- path.remove_suffix(1);
- }
- // Set up request headers. Assume method is GET and protocol is HTTP/1.1.
- request_headers.SetRequestFirstlineFromStringPieces("GET",
- path,
- "HTTP/1.1");
- request_headers.ReplaceOrAppendHeader("host", host);
- VLOG(1) << "Inserting 'http://" << GetKey(request_headers)
- << "' into QuicInMemoryCache.";
+ GURL url("http://" + base);
- AddResponse(request_headers, response_headers, caching_visitor.body());
+ VLOG(1) << "Inserting '" << url.spec() << "' into QuicInMemoryCache.";
+
+ StringPiece body(file_contents.c_str() + headers_end,
+ file_contents.size() - headers_end);
+
+ AddResponse(url, response_headers, body);
file = file_list.Next();
}
@@ -223,20 +162,4 @@ QuicInMemoryCache::~QuicInMemoryCache() {
STLDeleteValues(&responses_);
}
-string QuicInMemoryCache::GetKey(const BalsaHeaders& request_headers) const {
- StringPiece uri = request_headers.request_uri();
- if (uri.size() == 0) {
- return "";
- }
- StringPiece host;
- if (uri[0] == '/') {
- host = request_headers.GetHeader("host");
- } else if (StringPieceUtils::StartsWithIgnoreCase(uri, "https://")) {
- uri.remove_prefix(8);
- } else if (StringPieceUtils::StartsWithIgnoreCase(uri, "http://")) {
- uri.remove_prefix(7);
- }
- return host.as_string() + uri.as_string();
-}
-
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698