summaryrefslogtreecommitdiff
path: root/cli/http_cache.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/http_cache.rs')
-rw-r--r--cli/http_cache.rs59
1 files changed, 49 insertions, 10 deletions
diff --git a/cli/http_cache.rs b/cli/http_cache.rs
index 4a604efd2..1f507316c 100644
--- a/cli/http_cache.rs
+++ b/cli/http_cache.rs
@@ -7,6 +7,8 @@
use crate::fs as deno_fs;
use crate::http_util::HeadersMap;
use deno_core::ErrBox;
+use serde::Serialize;
+use serde_derive::Deserialize;
use std::fs;
use std::fs::File;
use std::path::Path;
@@ -16,7 +18,8 @@ use url::Url;
/// Turn base of url (scheme, hostname, port) into a valid filename.
/// This method replaces port part with a special string token (because
/// ":" cannot be used in filename on some platforms).
-pub fn base_url_to_filename(url: &Url) -> PathBuf {
+/// Ex: $DENO_DIR/deps/https/deno.land/
+fn base_url_to_filename(url: &Url) -> PathBuf {
let mut out = PathBuf::new();
let scheme = url.scheme();
@@ -70,6 +73,33 @@ pub struct HttpCache {
pub location: PathBuf,
}
+#[derive(Serialize, Deserialize)]
+pub struct Metadata {
+ pub headers: HeadersMap,
+ pub url: String,
+}
+
+impl Metadata {
+ pub fn write(&self, cache_filename: &Path) -> Result<(), ErrBox> {
+ let metadata_filename = Self::filename(cache_filename);
+ let json = serde_json::to_string_pretty(self)?;
+ deno_fs::write_file(&metadata_filename, json, 0o666)?;
+ Ok(())
+ }
+
+ pub fn read(cache_filename: &Path) -> Result<Metadata, ErrBox> {
+ let metadata_filename = Metadata::filename(&cache_filename);
+ let metadata = fs::read_to_string(metadata_filename)?;
+ let metadata: Metadata = serde_json::from_str(&metadata)?;
+ Ok(metadata)
+ }
+
+ /// Ex: $DENO_DIR/deps/https/deno.land/c885b7dcf1d6936e33a9cc3a2d74ec79bab5d733d3701c85a029b7f7ec9fbed4.metadata.json
+ pub fn filename(cache_filename: &Path) -> PathBuf {
+ cache_filename.with_extension("metadata.json")
+ }
+}
+
impl HttpCache {
/// Returns error if unable to create directory
/// at specified location.
@@ -89,11 +119,19 @@ impl HttpCache {
// ETAG check is currently done in `cli/file_fetcher.rs`.
pub fn get(&self, url: &Url) -> Result<(File, HeadersMap), ErrBox> {
let cache_filename = self.location.join(url_to_filename(url));
- let headers_filename = cache_filename.with_extension("headers.json");
+ let metadata_filename = Metadata::filename(&cache_filename);
let file = File::open(cache_filename)?;
- let headers_json = fs::read_to_string(headers_filename)?;
- let headers_map: HeadersMap = serde_json::from_str(&headers_json)?;
- Ok((file, headers_map))
+ let metadata = fs::read_to_string(metadata_filename)?;
+ let metadata: Metadata = serde_json::from_str(&metadata)?;
+ Ok((file, metadata.headers))
+ }
+
+ pub fn get_metadata(&self, url: &Url) -> Result<Metadata, ErrBox> {
+ let cache_filename = self.location.join(url_to_filename(url));
+ let metadata_filename = Metadata::filename(&cache_filename);
+ let metadata = fs::read_to_string(metadata_filename)?;
+ let metadata: Metadata = serde_json::from_str(&metadata)?;
+ Ok(metadata)
}
pub fn set(
@@ -103,7 +141,6 @@ impl HttpCache {
content: &[u8],
) -> Result<(), ErrBox> {
let cache_filename = self.location.join(url_to_filename(url));
- let headers_filename = cache_filename.with_extension("headers.json");
// Create parent directory
let parent_filename = cache_filename
.parent()
@@ -111,10 +148,12 @@ impl HttpCache {
fs::create_dir_all(parent_filename)?;
// Cache content
deno_fs::write_file(&cache_filename, content, 0o666)?;
- let serialized_headers = serde_json::to_string(&headers_map)?;
- // Cache headers
- deno_fs::write_file(&headers_filename, serialized_headers, 0o666)?;
- Ok(())
+
+ let metadata = Metadata {
+ url: url.to_string(),
+ headers: headers_map,
+ };
+ metadata.write(&cache_filename)
}
}