| 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
|
|
|