diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-09-07 08:09:16 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-07 09:09:16 -0400 |
commit | 3fc19dab47492e06043fc7add28e64693a4eb775 (patch) | |
tree | 855e952933662aef37bd20c084901ae0e488b2db /cli/file_fetcher.rs | |
parent | 01a761f1d4f7ff4943fbf80464a276b434d8a8f7 (diff) |
feat: support import attributes (#20342)
Diffstat (limited to 'cli/file_fetcher.rs')
-rw-r--r-- | cli/file_fetcher.rs | 75 |
1 files changed, 59 insertions, 16 deletions
diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs index e486eda88..ae5cf2762 100644 --- a/cli/file_fetcher.rs +++ b/cli/file_fetcher.rs @@ -163,6 +163,13 @@ pub fn map_content_type( } } +pub struct FetchOptions<'a> { + pub specifier: &'a ModuleSpecifier, + pub permissions: PermissionsContainer, + pub maybe_accept: Option<&'a str>, + pub maybe_cache_setting: Option<&'a CacheSetting>, +} + /// A structure for resolving, fetching and caching source files. #[derive(Debug, Clone)] pub struct FileFetcher { @@ -199,6 +206,10 @@ impl FileFetcher { } } + pub fn cache_setting(&self) -> &CacheSetting { + &self.cache_setting + } + /// Sets the log level to use when outputting the download message. pub fn set_download_log_level(&mut self, level: log::Level) { self.download_log_level = level; @@ -328,6 +339,7 @@ impl FileFetcher { permissions: PermissionsContainer, redirect_limit: i64, maybe_accept: Option<String>, + cache_setting: &CacheSetting, ) -> Pin<Box<dyn Future<Output = Result<File, AnyError>> + Send>> { debug!("FileFetcher::fetch_remote() - specifier: {}", specifier); if redirect_limit < 0 { @@ -339,7 +351,7 @@ impl FileFetcher { return futures::future::err(err).boxed(); } - if self.should_use_cache(specifier) { + if self.should_use_cache(specifier, cache_setting) { match self.fetch_cached(specifier, redirect_limit) { Ok(Some(file)) => { return futures::future::ok(file).boxed(); @@ -351,7 +363,7 @@ impl FileFetcher { } } - if self.cache_setting == CacheSetting::Only { + if *cache_setting == CacheSetting::Only { return futures::future::err(custom_error( "NotCached", format!( @@ -383,6 +395,7 @@ impl FileFetcher { let specifier = specifier.clone(); let client = self.http_client.clone(); let file_fetcher = self.clone(); + let cache_setting = cache_setting.clone(); // A single pass of fetch either yields code or yields a redirect, server // error causes a single retry to avoid crashing hard on intermittent failures. @@ -432,6 +445,7 @@ impl FileFetcher { permissions, redirect_limit - 1, maybe_accept, + &cache_setting, ) .await } @@ -468,8 +482,12 @@ impl FileFetcher { } /// Returns if the cache should be used for a given specifier. - fn should_use_cache(&self, specifier: &ModuleSpecifier) -> bool { - match &self.cache_setting { + fn should_use_cache( + &self, + specifier: &ModuleSpecifier, + cache_setting: &CacheSetting, + ) -> bool { + match cache_setting { CacheSetting::ReloadAll => false, CacheSetting::Use | CacheSetting::Only => true, CacheSetting::RespectHeaders => { @@ -514,18 +532,24 @@ impl FileFetcher { specifier: &ModuleSpecifier, permissions: PermissionsContainer, ) -> Result<File, AnyError> { - debug!("FileFetcher::fetch() - specifier: {}", specifier); - self.fetch_with_accept(specifier, permissions, None).await + self + .fetch_with_options(FetchOptions { + specifier, + permissions, + maybe_accept: None, + maybe_cache_setting: None, + }) + .await } - pub async fn fetch_with_accept( + pub async fn fetch_with_options( &self, - specifier: &ModuleSpecifier, - permissions: PermissionsContainer, - maybe_accept: Option<&str>, + options: FetchOptions<'_>, ) -> Result<File, AnyError> { + let specifier = options.specifier; + debug!("FileFetcher::fetch() - specifier: {}", specifier); let scheme = get_validated_scheme(specifier)?; - permissions.check_specifier(specifier)?; + options.permissions.check_specifier(specifier)?; if let Some(file) = self.cache.get(specifier) { Ok(file) } else if scheme == "file" { @@ -545,9 +569,10 @@ impl FileFetcher { let result = self .fetch_remote( specifier, - permissions, + options.permissions, 10, - maybe_accept.map(String::from), + options.maybe_accept.map(String::from), + options.maybe_cache_setting.unwrap_or(&self.cache_setting), ) .await; if let Ok(file) = &result { @@ -764,7 +789,13 @@ mod tests { let _http_server_guard = test_util::http_server(); let (file_fetcher, _) = setup(CacheSetting::ReloadAll, None); let result: Result<File, AnyError> = file_fetcher - .fetch_remote(specifier, PermissionsContainer::allow_all(), 1, None) + .fetch_remote( + specifier, + PermissionsContainer::allow_all(), + 1, + None, + &file_fetcher.cache_setting, + ) .await; let cache_key = file_fetcher.http_cache.cache_item_key(specifier).unwrap(); ( @@ -1452,12 +1483,24 @@ mod tests { .unwrap(); let result = file_fetcher - .fetch_remote(&specifier, PermissionsContainer::allow_all(), 2, None) + .fetch_remote( + &specifier, + PermissionsContainer::allow_all(), + 2, + None, + &file_fetcher.cache_setting, + ) .await; assert!(result.is_ok()); let result = file_fetcher - .fetch_remote(&specifier, PermissionsContainer::allow_all(), 1, None) + .fetch_remote( + &specifier, + PermissionsContainer::allow_all(), + 1, + None, + &file_fetcher.cache_setting, + ) .await; assert!(result.is_err()); |