diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2019-09-11 23:34:22 +0200 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-09-11 17:34:22 -0400 |
commit | 945dc7b84bc1a05f80b3b4e0b152be38d9f8a9bf (patch) | |
tree | 7c0fe4d779e5ee5f3e5de63a72b4369268165667 | |
parent | 82dc1b8e59891a7ca0f1a5e67a3db952b918561c (diff) |
fix: panic during fetch (#2925)
-rw-r--r-- | cli/deno_error.rs | 22 | ||||
-rw-r--r-- | core/any_error.rs | 2 | ||||
-rw-r--r-- | js/fetch_test.ts | 13 |
3 files changed, 36 insertions, 1 deletions
diff --git a/cli/deno_error.rs b/cli/deno_error.rs index 36d8b724a..71e5ac806 100644 --- a/cli/deno_error.rs +++ b/cli/deno_error.rs @@ -8,6 +8,7 @@ use deno::ErrBox; use deno::ModuleResolutionError; use http::uri; use hyper; +use reqwest; use rustyline::error::ReadlineError; use std; use std::error::Error; @@ -190,6 +191,26 @@ impl GetErrorKind for hyper::Error { } } +impl GetErrorKind for reqwest::Error { + fn kind(&self) -> ErrorKind { + use self::GetErrorKind as Get; + + match self.get_ref() { + Some(err_ref) => None + .or_else(|| err_ref.downcast_ref::<hyper::Error>().map(Get::kind)) + .or_else(|| err_ref.downcast_ref::<url::ParseError>().map(Get::kind)) + .or_else(|| err_ref.downcast_ref::<io::Error>().map(Get::kind)) + .or_else(|| { + err_ref + .downcast_ref::<serde_json::error::Error>() + .map(Get::kind) + }) + .unwrap_or_else(|| ErrorKind::HttpOther), + _ => ErrorKind::HttpOther, + } + } +} + impl GetErrorKind for ReadlineError { fn kind(&self) -> ErrorKind { use ReadlineError::*; @@ -254,6 +275,7 @@ impl GetErrorKind for dyn AnyError { .or_else(|| self.downcast_ref::<DenoError>().map(Get::kind)) .or_else(|| self.downcast_ref::<Diagnostic>().map(Get::kind)) .or_else(|| self.downcast_ref::<hyper::Error>().map(Get::kind)) + .or_else(|| self.downcast_ref::<reqwest::Error>().map(Get::kind)) .or_else(|| self.downcast_ref::<ImportMapError>().map(Get::kind)) .or_else(|| self.downcast_ref::<io::Error>().map(Get::kind)) .or_else(|| self.downcast_ref::<JSError>().map(Get::kind)) diff --git a/core/any_error.rs b/core/any_error.rs index 9199af59e..60c508e7d 100644 --- a/core/any_error.rs +++ b/core/any_error.rs @@ -5,7 +5,7 @@ use std::fmt; use std::ops::Deref; // The Send and Sync traits are required because deno is multithreaded and we -// need to beable to handle errors across threads. +// need to be able to handle errors across threads. pub trait AnyError: Any + Error + Send + Sync + 'static {} impl<T> AnyError for T where T: Any + Error + Send + Sync + Sized + 'static {} diff --git a/js/fetch_test.ts b/js/fetch_test.ts index 77cc010a8..4fcc39f01 100644 --- a/js/fetch_test.ts +++ b/js/fetch_test.ts @@ -4,9 +4,22 @@ import { testPerm, assert, assertEquals, + assertStrContains, assertThrows } from "./test_util.ts"; +testPerm({ net: true }, async function fetchConnectionError(): Promise<void> { + let err; + try { + await fetch("http://localhost:4000"); + } catch (err_) { + err = err_; + } + assertEquals(err.kind, Deno.ErrorKind.HttpOther); + assertEquals(err.name, "HttpOther"); + assertStrContains(err.message, "error trying to connect"); +}); + testPerm({ net: true }, async function fetchJsonSuccess(): Promise<void> { const response = await fetch("http://localhost:4545/package.json"); const json = await response.json(); |