Make QuicMemoryCacheBackend::InitializedBackend correctly support Windows paths. This method attempts to turn file system paths into URL host/path. It does so by looking for '/' characters explicitly but that's not the path separator on windows. It's '\\'. This change replaces all '\\' characters in the path with '/' before parsing. Technically it's possible that on non-windows platforms some filename might actually contain a '\\' character, but since this is a toy tool I think we don't need to worry about that case. gfe-relnote: Not used in the GFE PiperOrigin-RevId: 285334250 Change-Id: I68925dd2272e52df023f3f98ce0878dc6021943e
diff --git a/quic/tools/quic_memory_cache_backend.cc b/quic/tools/quic_memory_cache_backend.cc index a769259..ddf94fe 100644 --- a/quic/tools/quic_memory_cache_backend.cc +++ b/quic/tools/quic_memory_cache_backend.cc
@@ -104,14 +104,15 @@ void QuicMemoryCacheBackend::ResourceFile::SetHostPathFromBase( quiche::QuicheStringPiece base) { + DCHECK(base[0] != '/') << base; size_t path_start = base.find_first_of('/'); - DCHECK_LT(0UL, path_start); - host_ = base.substr(0, path_start); + DCHECK(path_start != quiche::QuicheStringPiece::npos) << base; + host_ = std::string(base.substr(0, path_start)); size_t query_start = base.find_first_of(','); if (query_start > 0) { - path_ = base.substr(path_start, query_start - 1); + path_ = std::string(base.substr(path_start, query_start - 1)); } else { - path_ = base.substr(path_start); + path_ = std::string(base.substr(path_start)); } } @@ -127,9 +128,7 @@ void QuicMemoryCacheBackend::ResourceFile::HandleXOriginalUrl() { quiche::QuicheStringPiece url(x_original_url_); - // Remove the protocol so we can add it below. - url = RemoveScheme(url); - SetHostPathFromBase(url); + SetHostPathFromBase(RemoveScheme(url)); } const QuicBackendResponse* QuicMemoryCacheBackend::GetResponse( @@ -256,10 +255,16 @@ std::unique_ptr<ResourceFile> resource_file(new ResourceFile(filename)); // Tease apart filename into host and path. - quiche::QuicheStringPiece base(resource_file->file_name()); - base.remove_prefix(cache_directory.length()); + std::string base(resource_file->file_name()); + // Transform windows path separators to URL path separators. + for (size_t i = 0; i < base.length(); ++i) { + if (base[i] == '\\') { + base[i] = '/'; + } + } + base.erase(0, cache_directory.length()); if (base[0] == '/') { - base.remove_prefix(1); + base.erase(0, 1); } resource_file->SetHostPathFromBase(base);
diff --git a/quic/tools/quic_memory_cache_backend.h b/quic/tools/quic_memory_cache_backend.h index 54151da..38d445c 100644 --- a/quic/tools/quic_memory_cache_backend.h +++ b/quic/tools/quic_memory_cache_backend.h
@@ -66,8 +66,8 @@ spdy::SpdyHeaderBlock spdy_headers_; quiche::QuicheStringPiece x_original_url_; std::vector<quiche::QuicheStringPiece> push_urls_; - quiche::QuicheStringPiece host_; - quiche::QuicheStringPiece path_; + std::string host_; + std::string path_; }; QuicMemoryCacheBackend();