summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2020-12-10 11:12:46 +1100
committerGitHub <noreply@github.com>2020-12-10 11:12:46 +1100
commit1a72c9ba23208f7236e5784011bc15640e50fe0b (patch)
tree48e206e1e231592d1343a014a7add7157ff5cbab
parentde65312b7fca46ce5fe4d8e61eb5d17f599df4e1 (diff)
fix(lsp): only resolve sources with supported schemas (#8696)
Fixes #8695
-rw-r--r--cli/file_fetcher.rs2
-rw-r--r--cli/lsp/sources.rs17
2 files changed, 17 insertions, 2 deletions
diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs
index 5b2f6f74c..a17a8fc24 100644
--- a/cli/file_fetcher.rs
+++ b/cli/file_fetcher.rs
@@ -26,7 +26,7 @@ use std::pin::Pin;
use std::sync::Arc;
use std::sync::Mutex;
-const SUPPORTED_SCHEMES: [&str; 3] = ["http", "https", "file"];
+pub const SUPPORTED_SCHEMES: [&str; 3] = ["http", "https", "file"];
/// A structure representing a source file.
#[derive(Debug, Clone, Eq, PartialEq)]
diff --git a/cli/lsp/sources.rs b/cli/lsp/sources.rs
index c6a15461f..09b0a4cc8 100644
--- a/cli/lsp/sources.rs
+++ b/cli/lsp/sources.rs
@@ -5,6 +5,7 @@ use super::text;
use crate::file_fetcher::get_source_from_bytes;
use crate::file_fetcher::map_content_type;
+use crate::file_fetcher::SUPPORTED_SCHEMES;
use crate::http_cache;
use crate::http_cache::HttpCache;
use crate::import_map::ImportMap;
@@ -279,7 +280,12 @@ impl Sources {
&mut self,
specifier: &ModuleSpecifier,
) -> Option<ModuleSpecifier> {
- if specifier.as_url().scheme() == "file" {
+ let scheme = specifier.as_url().scheme();
+ if !SUPPORTED_SCHEMES.contains(&scheme) {
+ return None;
+ }
+
+ if scheme == "file" {
if let Ok(path) = specifier.as_url().to_file_path() {
if path.is_file() {
return Some(specifier.clone());
@@ -377,4 +383,13 @@ mod tests {
let actual = actual.unwrap();
assert_eq!(actual, 28);
}
+
+ #[test]
+ fn test_sources_resolve_specifier_non_supported_schema() {
+ let (mut sources, _) = setup();
+ let specifier = ModuleSpecifier::resolve_url("foo://a/b/c.ts")
+ .expect("could not create specifier");
+ let actual = sources.resolve_specifier(&specifier);
+ assert!(actual.is_none());
+ }
}