Index: net/tools/flip_server/mem_cache.cc |
diff --git a/net/tools/flip_server/mem_cache.cc b/net/tools/flip_server/mem_cache.cc |
deleted file mode 100644 |
index dae5d4026bc8f8a9bd261fec4c37877b0f2f7e5e..0000000000000000000000000000000000000000 |
--- a/net/tools/flip_server/mem_cache.cc |
+++ /dev/null |
@@ -1,238 +0,0 @@ |
-// Copyright (c) 2009 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/tools/flip_server/mem_cache.h" |
- |
-#include <dirent.h> |
-#include <errno.h> |
-#include <fcntl.h> |
-#include <stdio.h> |
-#include <sys/stat.h> |
-#include <sys/types.h> |
-#include <unistd.h> |
- |
-#include <deque> |
-#include <map> |
-#include <string> |
- |
-#include "base/memory/ptr_util.h" |
-#include "base/strings/string_util.h" |
-#include "net/tools/balsa/balsa_frame.h" |
-#include "net/tools/balsa/balsa_headers.h" |
-#include "net/tools/flip_server/url_to_filename_encoder.h" |
-#include "net/tools/flip_server/url_utilities.h" |
- |
-namespace { |
-// The directory where cache locates); |
-const char FLAGS_cache_base_dir[] = "."; |
-} // namespace |
- |
-namespace net { |
- |
-void StoreBodyAndHeadersVisitor::ProcessBodyData(const char* input, |
- size_t size) { |
- body.append(input, size); |
-} |
- |
-void StoreBodyAndHeadersVisitor::HandleHeaderError(BalsaFrame* framer) { |
- HandleError(); |
-} |
- |
-void StoreBodyAndHeadersVisitor::HandleHeaderWarning(BalsaFrame* framer) { |
- HandleError(); |
-} |
- |
-void StoreBodyAndHeadersVisitor::HandleChunkingError(BalsaFrame* framer) { |
- HandleError(); |
-} |
- |
-void StoreBodyAndHeadersVisitor::HandleBodyError(BalsaFrame* framer) { |
- HandleError(); |
-} |
- |
-FileData::FileData(const BalsaHeaders* headers, |
- const std::string& filename, |
- const std::string& body) |
- : filename_(filename), body_(body) { |
- if (headers) { |
- headers_.reset(new BalsaHeaders); |
- headers_->CopyFrom(*headers); |
- } |
-} |
- |
-FileData::FileData() {} |
- |
-FileData::~FileData() {} |
- |
-MemoryCache::MemoryCache() : cwd_(FLAGS_cache_base_dir) {} |
-MemoryCache::~MemoryCache() {} |
- |
-void MemoryCache::AddFiles() { |
- std::deque<std::string> paths; |
- paths.push_back(cwd_ + "/GET_"); |
- DIR* current_dir = NULL; |
- while (!paths.empty()) { |
- while (current_dir == NULL && !paths.empty()) { |
- std::string current_dir_name = paths.front(); |
- VLOG(1) << "Attempting to open dir: \"" << current_dir_name << "\""; |
- current_dir = opendir(current_dir_name.c_str()); |
- paths.pop_front(); |
- |
- if (current_dir == NULL) { |
- perror("Unable to open directory. "); |
- current_dir_name.clear(); |
- continue; |
- } |
- |
- if (current_dir) { |
- VLOG(1) << "Succeeded opening"; |
- for (struct dirent* dir_data = readdir(current_dir); dir_data != NULL; |
- dir_data = readdir(current_dir)) { |
- std::string current_entry_name = |
- current_dir_name + "/" + dir_data->d_name; |
- if (dir_data->d_type == DT_REG) { |
- VLOG(1) << "Found file: " << current_entry_name; |
- ReadAndStoreFileContents(current_entry_name.c_str()); |
- } else if (dir_data->d_type == DT_DIR) { |
- VLOG(1) << "Found subdir: " << current_entry_name; |
- if (std::string(dir_data->d_name) != "." && |
- std::string(dir_data->d_name) != "..") { |
- VLOG(1) << "Adding to search path: " << current_entry_name; |
- paths.push_front(current_entry_name); |
- } |
- } |
- } |
- VLOG(1) << "Oops, no data left. Closing dir."; |
- closedir(current_dir); |
- current_dir = NULL; |
- } |
- } |
- } |
-} |
- |
-void MemoryCache::ReadToString(const char* filename, std::string* output) { |
- output->clear(); |
- int fd = open(filename, 0, "r"); |
- if (fd == -1) |
- return; |
- char buffer[4096]; |
- ssize_t read_status = read(fd, buffer, sizeof(buffer)); |
- while (read_status > 0) { |
- output->append(buffer, static_cast<size_t>(read_status)); |
- do { |
- read_status = read(fd, buffer, sizeof(buffer)); |
- } while (read_status <= 0 && errno == EINTR); |
- } |
- close(fd); |
-} |
- |
-void MemoryCache::ReadAndStoreFileContents(const char* filename) { |
- StoreBodyAndHeadersVisitor visitor; |
- BalsaFrame framer; |
- framer.set_balsa_visitor(&visitor); |
- framer.set_balsa_headers(&(visitor.headers)); |
- std::string filename_contents; |
- ReadToString(filename, &filename_contents); |
- |
- // Ugly hack to make everything look like 1.1. |
- if (filename_contents.find("HTTP/1.0") == 0) |
- filename_contents[7] = '1'; |
- |
- size_t pos = 0; |
- size_t old_pos = 0; |
- while (true) { |
- old_pos = pos; |
- pos += framer.ProcessInput(filename_contents.data() + pos, |
- filename_contents.size() - pos); |
- if (framer.Error() || pos == old_pos) { |
- LOG(ERROR) << "Unable to make forward progress, or error" |
- " framing file: " << filename; |
- if (framer.Error()) { |
- LOG(INFO) << "********************************************ERROR!"; |
- return; |
- } |
- return; |
- } |
- if (framer.MessageFullyRead()) { |
- // If no Content-Length or Transfer-Encoding was captured in the |
- // file, then the rest of the data is the body. Many of the captures |
- // from within Chrome don't have content-lengths. |
- if (!visitor.body.length()) |
- visitor.body = filename_contents.substr(pos); |
- break; |
- } |
- } |
- visitor.headers.RemoveAllOfHeader("content-length"); |
- visitor.headers.RemoveAllOfHeader("transfer-encoding"); |
- visitor.headers.RemoveAllOfHeader("connection"); |
- visitor.headers.AppendHeader("transfer-encoding", "chunked"); |
- visitor.headers.AppendHeader("connection", "keep-alive"); |
- |
-// Experiment with changing headers for forcing use of cached |
-// versions of content. |
-// TODO(mbelshe) REMOVE ME |
-#if 0 |
- // TODO(mbelshe) append current date. |
- visitor.headers.RemoveAllOfHeader("date"); |
- if (visitor.headers.HasHeader("expires")) { |
- visitor.headers.RemoveAllOfHeader("expires"); |
- visitor.headers.AppendHeader("expires", |
- "Fri, 30 Aug, 2019 12:00:00 GMT"); |
- } |
-#endif |
- DCHECK_GE(std::string(filename).size(), cwd_.size() + 1); |
- DCHECK_EQ(std::string(filename).substr(0, cwd_.size()), cwd_); |
- DCHECK_EQ(filename[cwd_.size()], '/'); |
- std::string filename_stripped = std::string(filename).substr(cwd_.size() + 1); |
- LOG(INFO) << "Adding file (" << visitor.body.length() |
- << " bytes): " << filename_stripped; |
- size_t slash_pos = filename_stripped.find('/'); |
- if (slash_pos == std::string::npos) { |
- slash_pos = filename_stripped.size(); |
- } |
- InsertFile( |
- &visitor.headers, filename_stripped.substr(0, slash_pos), visitor.body); |
-} |
- |
-FileData* MemoryCache::GetFileData(const std::string& filename) { |
- Files::iterator fi = files_.end(); |
- if (base::EndsWith(filename, ".html", base::CompareCase::SENSITIVE)) { |
- fi = files_.find(filename.substr(0, filename.size() - 5) + ".http"); |
- } |
- if (fi == files_.end()) |
- fi = files_.find(filename); |
- |
- if (fi == files_.end()) { |
- return NULL; |
- } |
- return fi->second.get(); |
-} |
- |
-bool MemoryCache::AssignFileData(const std::string& filename, |
- MemCacheIter* mci) { |
- mci->file_data = GetFileData(filename); |
- if (mci->file_data == NULL) { |
- LOG(ERROR) << "Could not find file data for " << filename; |
- return false; |
- } |
- return true; |
-} |
- |
-void MemoryCache::InsertFile(const BalsaHeaders* headers, |
- const std::string& filename, |
- const std::string& body) { |
- InsertFile(new FileData(headers, filename, body)); |
-} |
- |
-void MemoryCache::InsertFile(FileData* file_data) { |
- Files::iterator it = files_.find(file_data->filename()); |
- if (it != files_.end()) { |
- it->second.reset(file_data); |
- } else { |
- files_.insert( |
- std::make_pair(file_data->filename(), base::WrapUnique(file_data))); |
- } |
-} |
- |
-} // namespace net |