diff options
Diffstat (limited to 'cli/file_fetcher.rs')
-rw-r--r-- | cli/file_fetcher.rs | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs index 23ace672c..722813457 100644 --- a/cli/file_fetcher.rs +++ b/cli/file_fetcher.rs @@ -1,9 +1,11 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use crate::auth_tokens::AuthTokens; use crate::colors; use crate::http_cache::HttpCache; use crate::http_util::create_http_client; use crate::http_util::fetch_once; +use crate::http_util::FetchOnceArgs; use crate::http_util::FetchOnceResult; use crate::media_type::MediaType; use crate::text_encoding; @@ -19,6 +21,7 @@ use deno_core::futures::future::FutureExt; use deno_core::ModuleSpecifier; use deno_runtime::deno_fetch::reqwest; use std::collections::HashMap; +use std::env; use std::fs; use std::future::Future; use std::io::Read; @@ -27,6 +30,7 @@ use std::pin::Pin; use std::sync::Arc; use std::sync::Mutex; +static DENO_AUTH_TOKENS: &str = "DENO_AUTH_TOKENS"; pub const SUPPORTED_SCHEMES: [&str; 4] = ["data", "file", "http", "https"]; /// A structure representing a source file. @@ -308,6 +312,7 @@ fn strip_shebang(mut value: String) -> String { /// A structure for resolving, fetching and caching source files. #[derive(Clone)] pub struct FileFetcher { + auth_tokens: AuthTokens, allow_remote: bool, cache: FileCache, cache_setting: CacheSetting, @@ -323,8 +328,9 @@ impl FileFetcher { ca_data: Option<Vec<u8>>, ) -> Result<Self, AnyError> { Ok(Self { + auth_tokens: AuthTokens::new(env::var(DENO_AUTH_TOKENS).ok()), allow_remote, - cache: FileCache::default(), + cache: Default::default(), cache_setting, http_cache, http_client: create_http_client(get_user_agent(), ca_data)?, @@ -488,17 +494,25 @@ impl FileFetcher { info!("{} {}", colors::green("Download"), specifier); - let file_fetcher = self.clone(); - let cached_etag = match self.http_cache.get(specifier.as_url()) { + let maybe_etag = match self.http_cache.get(specifier.as_url()) { Ok((_, headers)) => headers.get("etag").cloned(), _ => None, }; + let maybe_auth_token = self.auth_tokens.get(&specifier); let specifier = specifier.clone(); let permissions = permissions.clone(); - let http_client = self.http_client.clone(); + let client = self.http_client.clone(); + let file_fetcher = self.clone(); // A single pass of fetch either yields code or yields a redirect. async move { - match fetch_once(http_client, specifier.as_url(), cached_etag).await? { + match fetch_once(FetchOnceArgs { + client, + url: specifier.as_url().clone(), + maybe_etag, + maybe_auth_token, + }) + .await? + { FetchOnceResult::NotModified => { let file = file_fetcher.fetch_cached(&specifier, 10)?.unwrap(); Ok(file) |