1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 15:24:46 -05:00

fix(cache): apply redirection limit for cached files (#6308)

This commit is contained in:
Bartek Iwańczuk 2020-06-15 23:46:48 +02:00 committed by GitHub
parent c54dec8576
commit b8872cd303
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -242,7 +242,7 @@ impl SourceFileFetcher {
return self.fetch_local_file(&module_url, permissions).map(Some); return self.fetch_local_file(&module_url, permissions).map(Some);
} }
self.fetch_cached_remote_source(&module_url) self.fetch_cached_remote_source(&module_url, 10)
} }
/// This is main method that is responsible for fetching local or remote files. /// This is main method that is responsible for fetching local or remote files.
@ -347,7 +347,13 @@ impl SourceFileFetcher {
fn fetch_cached_remote_source( fn fetch_cached_remote_source(
&self, &self,
module_url: &Url, module_url: &Url,
redirect_limit: i64,
) -> Result<Option<SourceFile>, ErrBox> { ) -> Result<Option<SourceFile>, ErrBox> {
if redirect_limit < 0 {
let e = OpError::http("too many redirects".to_string());
return Err(e.into());
}
let result = self.http_cache.get(&module_url); let result = self.http_cache.get(&module_url);
let result = match result { let result = match result {
Err(e) => { Err(e) => {
@ -374,7 +380,8 @@ impl SourceFileFetcher {
return Err(e.into()); return Err(e.into());
} }
}; };
return self.fetch_cached_remote_source(&redirect_url); return self
.fetch_cached_remote_source(&redirect_url, redirect_limit - 1);
} }
let mut source_code = Vec::new(); let mut source_code = Vec::new();
@ -430,7 +437,7 @@ impl SourceFileFetcher {
check_cache_blocklist(module_url, self.cache_blocklist.as_ref()); check_cache_blocklist(module_url, self.cache_blocklist.as_ref());
// First try local cache // First try local cache
if use_disk_cache && !is_blocked { if use_disk_cache && !is_blocked {
match self.fetch_cached_remote_source(&module_url) { match self.fetch_cached_remote_source(&module_url, redirect_limit) {
Ok(Some(source_file)) => { Ok(Some(source_file)) => {
return futures::future::ok(source_file).boxed_local(); return futures::future::ok(source_file).boxed_local();
} }
@ -479,7 +486,7 @@ impl SourceFileFetcher {
{ {
FetchOnceResult::NotModified => { FetchOnceResult::NotModified => {
let source_file = let source_file =
dir.fetch_cached_remote_source(&module_url)?.unwrap(); dir.fetch_cached_remote_source(&module_url, 10)?.unwrap();
Ok(source_file) Ok(source_file)
} }
@ -1252,9 +1259,13 @@ mod tests {
) )
.await; .await;
assert!(result.is_err()); assert!(result.is_err());
// FIXME(bartlomieju):
// let err = result.err().unwrap(); // Test that redirections in cached files are limited as well
// assert_eq!(err.kind(), ErrorKind::Http); let result = fetcher.fetch_cached_remote_source(&double_redirect_url, 2);
assert!(result.is_ok());
let result = fetcher.fetch_cached_remote_source(&double_redirect_url, 1);
assert!(result.is_err());
drop(http_server_guard); drop(http_server_guard);
} }
@ -1420,7 +1431,7 @@ mod tests {
.insert("content-type".to_string(), "text/javascript".to_string()); .insert("content-type".to_string(), "text/javascript".to_string());
metadata.write(&cache_filename).unwrap(); metadata.write(&cache_filename).unwrap();
let result2 = fetcher.fetch_cached_remote_source(&module_url); let result2 = fetcher.fetch_cached_remote_source(&module_url, 1);
assert!(result2.is_ok()); assert!(result2.is_ok());
let r2 = result2.unwrap().unwrap(); let r2 = result2.unwrap().unwrap();
assert_eq!(r2.source_code, b"export const loaded = true;\n"); assert_eq!(r2.source_code, b"export const loaded = true;\n");