mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
refactor(ext/fetch): align error messages (#25374)
Aligns the error messages in the ext/fetch folder to be in-line with the Deno style guide. https://github.com/denoland/deno/issues/25269
This commit is contained in:
parent
7079acd74d
commit
ce6b675102
12 changed files with 51 additions and 41 deletions
|
@ -73,7 +73,7 @@ function fillHeaders(headers, object) {
|
||||||
const header = object[i];
|
const header = object[i];
|
||||||
if (header.length !== 2) {
|
if (header.length !== 2) {
|
||||||
throw new TypeError(
|
throw new TypeError(
|
||||||
`Invalid header. Length must be 2, but is ${header.length}`,
|
`Invalid header: length must be 2, but is ${header.length}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
appendHeader(headers, header[0], header[1]);
|
appendHeader(headers, header[0], header[1]);
|
||||||
|
@ -133,15 +133,15 @@ function appendHeader(headers, name, value) {
|
||||||
|
|
||||||
// 2.
|
// 2.
|
||||||
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
||||||
throw new TypeError("Header name is not valid.");
|
throw new TypeError(`Invalid header name: "${name}"`);
|
||||||
}
|
}
|
||||||
if (!checkForInvalidValueChars(value)) {
|
if (!checkForInvalidValueChars(value)) {
|
||||||
throw new TypeError("Header value is not valid.");
|
throw new TypeError(`Invalid header value: "${value}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3.
|
// 3.
|
||||||
if (headers[_guard] == "immutable") {
|
if (headers[_guard] == "immutable") {
|
||||||
throw new TypeError("Headers are immutable.");
|
throw new TypeError("Cannot change header: headers are immutable");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7.
|
// 7.
|
||||||
|
@ -330,10 +330,10 @@ class Headers {
|
||||||
name = webidl.converters["ByteString"](name, prefix, "Argument 1");
|
name = webidl.converters["ByteString"](name, prefix, "Argument 1");
|
||||||
|
|
||||||
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
||||||
throw new TypeError("Header name is not valid.");
|
throw new TypeError(`Invalid header name: "${name}"`);
|
||||||
}
|
}
|
||||||
if (this[_guard] == "immutable") {
|
if (this[_guard] == "immutable") {
|
||||||
throw new TypeError("Headers are immutable.");
|
throw new TypeError("Cannot change headers: headers are immutable");
|
||||||
}
|
}
|
||||||
|
|
||||||
const list = this[_headerList];
|
const list = this[_headerList];
|
||||||
|
@ -356,7 +356,7 @@ class Headers {
|
||||||
name = webidl.converters["ByteString"](name, prefix, "Argument 1");
|
name = webidl.converters["ByteString"](name, prefix, "Argument 1");
|
||||||
|
|
||||||
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
||||||
throw new TypeError("Header name is not valid.");
|
throw new TypeError(`Invalid header name: "${name}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const list = this[_headerList];
|
const list = this[_headerList];
|
||||||
|
@ -387,7 +387,7 @@ class Headers {
|
||||||
name = webidl.converters["ByteString"](name, prefix, "Argument 1");
|
name = webidl.converters["ByteString"](name, prefix, "Argument 1");
|
||||||
|
|
||||||
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
||||||
throw new TypeError("Header name is not valid.");
|
throw new TypeError(`Invalid header name: "${name}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const list = this[_headerList];
|
const list = this[_headerList];
|
||||||
|
@ -415,14 +415,14 @@ class Headers {
|
||||||
|
|
||||||
// 2.
|
// 2.
|
||||||
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
if (!checkHeaderNameForHttpTokenCodePoint(name)) {
|
||||||
throw new TypeError("Header name is not valid.");
|
throw new TypeError(`Invalid header name: "${name}"`);
|
||||||
}
|
}
|
||||||
if (!checkForInvalidValueChars(value)) {
|
if (!checkForInvalidValueChars(value)) {
|
||||||
throw new TypeError("Header value is not valid.");
|
throw new TypeError(`Invalid header value: "${value}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this[_guard] == "immutable") {
|
if (this[_guard] == "immutable") {
|
||||||
throw new TypeError("Headers are immutable.");
|
throw new TypeError("Cannot change headers: headers are immutable");
|
||||||
}
|
}
|
||||||
|
|
||||||
const list = this[_headerList];
|
const list = this[_headerList];
|
||||||
|
|
|
@ -396,7 +396,9 @@ class MultipartParser {
|
||||||
*/
|
*/
|
||||||
constructor(body, boundary) {
|
constructor(body, boundary) {
|
||||||
if (!boundary) {
|
if (!boundary) {
|
||||||
throw new TypeError("multipart/form-data must provide a boundary");
|
throw new TypeError(
|
||||||
|
"Cannot construct MultipartParser: multipart/form-data must provide a boundary",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.boundary = `--${boundary}`;
|
this.boundary = `--${boundary}`;
|
||||||
|
@ -445,7 +447,7 @@ class MultipartParser {
|
||||||
) {
|
) {
|
||||||
return new FormData();
|
return new FormData();
|
||||||
}
|
}
|
||||||
throw new TypeError("Unable to parse body as form data.");
|
throw new TypeError("Unable to parse body as form data");
|
||||||
}
|
}
|
||||||
|
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
|
|
|
@ -151,7 +151,7 @@ class InnerBody {
|
||||||
* @returns {Promise<Uint8Array>}
|
* @returns {Promise<Uint8Array>}
|
||||||
*/
|
*/
|
||||||
consume() {
|
consume() {
|
||||||
if (this.unusable()) throw new TypeError("Body already consumed.");
|
if (this.unusable()) throw new TypeError("Body already consumed");
|
||||||
if (
|
if (
|
||||||
ObjectPrototypeIsPrototypeOf(
|
ObjectPrototypeIsPrototypeOf(
|
||||||
ReadableStreamPrototype,
|
ReadableStreamPrototype,
|
||||||
|
@ -372,7 +372,7 @@ function packageData(bytes, type, mimeType) {
|
||||||
const boundary = mimeType.parameters.get("boundary");
|
const boundary = mimeType.parameters.get("boundary");
|
||||||
if (boundary === null) {
|
if (boundary === null) {
|
||||||
throw new TypeError(
|
throw new TypeError(
|
||||||
"Missing boundary parameter in mime type of multipart formdata.",
|
"Cannot turn into form data: missing boundary parameter in mime type of multipart form data",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return parseFormData(chunkToU8(bytes), boundary);
|
return parseFormData(chunkToU8(bytes), boundary);
|
||||||
|
|
|
@ -172,7 +172,7 @@ function initializeAResponse(response, init, bodyWithType) {
|
||||||
// 1.
|
// 1.
|
||||||
if ((init.status < 200 || init.status > 599) && init.status != 101) {
|
if ((init.status < 200 || init.status > 599) && init.status != 101) {
|
||||||
throw new RangeError(
|
throw new RangeError(
|
||||||
`The status provided (${init.status}) is not equal to 101 and outside the range [200, 599].`,
|
`The status provided (${init.status}) is not equal to 101 and outside the range [200, 599]`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +181,9 @@ function initializeAResponse(response, init, bodyWithType) {
|
||||||
init.statusText &&
|
init.statusText &&
|
||||||
RegExpPrototypeExec(REASON_PHRASE_RE, init.statusText) === null
|
RegExpPrototypeExec(REASON_PHRASE_RE, init.statusText) === null
|
||||||
) {
|
) {
|
||||||
throw new TypeError("Status text is not valid.");
|
throw new TypeError(
|
||||||
|
`Invalid status text: "${init.statusText}"`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3.
|
// 3.
|
||||||
|
@ -263,7 +265,7 @@ class Response {
|
||||||
const baseURL = getLocationHref();
|
const baseURL = getLocationHref();
|
||||||
const parsedURL = new URL(url, baseURL);
|
const parsedURL = new URL(url, baseURL);
|
||||||
if (!redirectStatus(status)) {
|
if (!redirectStatus(status)) {
|
||||||
throw new RangeError("Invalid redirect status code.");
|
throw new RangeError(`Invalid redirect status code: ${status}`);
|
||||||
}
|
}
|
||||||
const inner = newInnerResponse(status);
|
const inner = newInnerResponse(status);
|
||||||
inner.type = "default";
|
inner.type = "default";
|
||||||
|
@ -395,7 +397,7 @@ class Response {
|
||||||
clone() {
|
clone() {
|
||||||
webidl.assertBranded(this, ResponsePrototype);
|
webidl.assertBranded(this, ResponsePrototype);
|
||||||
if (this[_body] && this[_body].unusable()) {
|
if (this[_body] && this[_body].unusable()) {
|
||||||
throw new TypeError("Body is unusable.");
|
throw new TypeError("Body is unusable");
|
||||||
}
|
}
|
||||||
const second = webidl.createBranded(Response);
|
const second = webidl.createBranded(Response);
|
||||||
const newRes = cloneInnerResponse(this[_response]);
|
const newRes = cloneInnerResponse(this[_response]);
|
||||||
|
|
|
@ -99,7 +99,7 @@ function createResponseBodyStream(responseBodyRid, terminator) {
|
||||||
async function mainFetch(req, recursive, terminator) {
|
async function mainFetch(req, recursive, terminator) {
|
||||||
if (req.blobUrlEntry !== null) {
|
if (req.blobUrlEntry !== null) {
|
||||||
if (req.method !== "GET") {
|
if (req.method !== "GET") {
|
||||||
throw new TypeError("Blob URL fetch only supports GET method.");
|
throw new TypeError("Blob URL fetch only supports GET method");
|
||||||
}
|
}
|
||||||
|
|
||||||
const body = new InnerBody(req.blobUrlEntry.stream());
|
const body = new InnerBody(req.blobUrlEntry.stream());
|
||||||
|
@ -145,7 +145,7 @@ async function mainFetch(req, recursive, terminator) {
|
||||||
reqRid = resourceForReadableStream(stream, req.body.length);
|
reqRid = resourceForReadableStream(stream, req.body.length);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new TypeError("invalid body");
|
throw new TypeError("Invalid body");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,13 +441,15 @@ function handleWasmStreaming(source, rid) {
|
||||||
typeof contentType !== "string" ||
|
typeof contentType !== "string" ||
|
||||||
StringPrototypeToLowerCase(contentType) !== "application/wasm"
|
StringPrototypeToLowerCase(contentType) !== "application/wasm"
|
||||||
) {
|
) {
|
||||||
throw new TypeError("Invalid WebAssembly content type.");
|
throw new TypeError("Invalid WebAssembly content type");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2.5.
|
// 2.5.
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
throw new TypeError(`HTTP status code ${res.status}`);
|
throw new TypeError(
|
||||||
|
`Failed to receive WebAssembly content: HTTP status code ${res.status}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass the resolved URL to v8.
|
// Pass the resolved URL to v8.
|
||||||
|
|
|
@ -43,7 +43,7 @@ impl FetchHandler for FsFetchHandler {
|
||||||
Ok::<_, ()>(response)
|
Ok::<_, ()>(response)
|
||||||
}
|
}
|
||||||
.map_err(move |_| {
|
.map_err(move |_| {
|
||||||
type_error("NetworkError when attempting to fetch resource.")
|
type_error("NetworkError when attempting to fetch resource")
|
||||||
})
|
})
|
||||||
.or_cancel(&cancel_handle)
|
.or_cancel(&cancel_handle)
|
||||||
.boxed_local();
|
.boxed_local();
|
||||||
|
|
|
@ -177,7 +177,7 @@ impl FetchHandler for DefaultFileFetchHandler {
|
||||||
) -> (CancelableResponseFuture, Option<Rc<CancelHandle>>) {
|
) -> (CancelableResponseFuture, Option<Rc<CancelHandle>>) {
|
||||||
let fut = async move {
|
let fut = async move {
|
||||||
Ok(Err(type_error(
|
Ok(Err(type_error(
|
||||||
"NetworkError when attempting to fetch resource.",
|
"NetworkError when attempting to fetch resource",
|
||||||
)))
|
)))
|
||||||
};
|
};
|
||||||
(Box::pin(fut), None)
|
(Box::pin(fut), None)
|
||||||
|
@ -361,14 +361,14 @@ where
|
||||||
let (request_rid, cancel_handle_rid) = match scheme {
|
let (request_rid, cancel_handle_rid) = match scheme {
|
||||||
"file" => {
|
"file" => {
|
||||||
let path = url.to_file_path().map_err(|_| {
|
let path = url.to_file_path().map_err(|_| {
|
||||||
type_error("NetworkError when attempting to fetch resource.")
|
type_error("NetworkError when attempting to fetch resource")
|
||||||
})?;
|
})?;
|
||||||
let permissions = state.borrow_mut::<FP>();
|
let permissions = state.borrow_mut::<FP>();
|
||||||
permissions.check_read(&path, "fetch()")?;
|
permissions.check_read(&path, "fetch()")?;
|
||||||
|
|
||||||
if method != Method::GET {
|
if method != Method::GET {
|
||||||
return Err(type_error(format!(
|
return Err(type_error(format!(
|
||||||
"Fetching files only supports the GET method. Received {method}."
|
"Fetching files only supports the GET method: received {method}"
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,7 +394,7 @@ where
|
||||||
let uri = url
|
let uri = url
|
||||||
.as_str()
|
.as_str()
|
||||||
.parse::<Uri>()
|
.parse::<Uri>()
|
||||||
.map_err(|_| type_error("Invalid URL"))?;
|
.map_err(|_| type_error(format!("Invalid URL {url}")))?;
|
||||||
|
|
||||||
let mut con_len = None;
|
let mut con_len = None;
|
||||||
let body = if has_body {
|
let body = if has_body {
|
||||||
|
@ -522,7 +522,9 @@ where
|
||||||
// because the URL isn't an object URL.
|
// because the URL isn't an object URL.
|
||||||
return Err(type_error("Blob for the given URL not found."));
|
return Err(type_error("Blob for the given URL not found."));
|
||||||
}
|
}
|
||||||
_ => return Err(type_error(format!("scheme '{scheme}' not supported"))),
|
_ => {
|
||||||
|
return Err(type_error(format!("Url scheme '{scheme}' not supported")))
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(FetchReturn {
|
Ok(FetchReturn {
|
||||||
|
@ -586,7 +588,7 @@ pub async fn op_fetch_send(
|
||||||
|
|
||||||
return Err(type_error(err.to_string()));
|
return Err(type_error(err.to_string()));
|
||||||
}
|
}
|
||||||
Err(_) => return Err(type_error("request was cancelled")),
|
Err(_) => return Err(type_error("Request was cancelled")),
|
||||||
};
|
};
|
||||||
|
|
||||||
let status = res.status();
|
let status = res.status();
|
||||||
|
@ -1016,9 +1018,11 @@ pub fn create_http_client(
|
||||||
let mut http_connector = HttpConnector::new();
|
let mut http_connector = HttpConnector::new();
|
||||||
http_connector.enforce_http(false);
|
http_connector.enforce_http(false);
|
||||||
|
|
||||||
let user_agent = user_agent
|
let user_agent = user_agent.parse::<HeaderValue>().map_err(|_| {
|
||||||
.parse::<HeaderValue>()
|
type_error(format!(
|
||||||
.map_err(|_| type_error("illegal characters in User-Agent"))?;
|
"Illegal characters in User-Agent: received {user_agent}"
|
||||||
|
))
|
||||||
|
})?;
|
||||||
|
|
||||||
let mut builder =
|
let mut builder =
|
||||||
hyper_util::client::legacy::Builder::new(TokioExecutor::new());
|
hyper_util::client::legacy::Builder::new(TokioExecutor::new());
|
||||||
|
@ -1060,7 +1064,7 @@ pub fn create_http_client(
|
||||||
}
|
}
|
||||||
(true, true) => {}
|
(true, true) => {}
|
||||||
(false, false) => {
|
(false, false) => {
|
||||||
return Err(type_error("Either `http1` or `http2` needs to be true"))
|
return Err(type_error("Cannot create Http Client: either `http1` or `http2` needs to be set to true"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
error: Uncaught (in promise) TypeError: Invalid WebAssembly content type.
|
error: Uncaught (in promise) TypeError: Invalid WebAssembly content type
|
||||||
at handleWasmStreaming (ext:deno_fetch/26_fetch.js:[WILDCARD])
|
at handleWasmStreaming (ext:deno_fetch/26_fetch.js:[WILDCARD])
|
||||||
|
|
|
@ -118,7 +118,7 @@ Deno.test(async function cachePutReaderLock() {
|
||||||
await response.arrayBuffer();
|
await response.arrayBuffer();
|
||||||
},
|
},
|
||||||
TypeError,
|
TypeError,
|
||||||
"Body already consumed.",
|
"Body already consumed",
|
||||||
);
|
);
|
||||||
|
|
||||||
await promise;
|
await promise;
|
||||||
|
|
|
@ -1131,7 +1131,7 @@ Deno.test(function fetchResponseConstructorInvalidStatus() {
|
||||||
assert(e instanceof RangeError);
|
assert(e instanceof RangeError);
|
||||||
assert(
|
assert(
|
||||||
e.message.endsWith(
|
e.message.endsWith(
|
||||||
"is not equal to 101 and outside the range [200, 599].",
|
"is not equal to 101 and outside the range [200, 599]",
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1662,7 +1662,7 @@ Deno.test(
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
TypeError,
|
TypeError,
|
||||||
"Fetching files only supports the GET method. Received POST.",
|
"Fetching files only supports the GET method: received POST",
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -406,11 +406,11 @@ Deno.test(function invalidHeadersFlaky() {
|
||||||
assertThrows(
|
assertThrows(
|
||||||
() => new Headers([["x", "\u0000x"]]),
|
() => new Headers([["x", "\u0000x"]]),
|
||||||
TypeError,
|
TypeError,
|
||||||
"Header value is not valid.",
|
'Invalid header value: "\u0000x"',
|
||||||
);
|
);
|
||||||
assertThrows(
|
assertThrows(
|
||||||
() => new Headers([["x", "\u0000x"]]),
|
() => new Headers([["x", "\u0000x"]]),
|
||||||
TypeError,
|
TypeError,
|
||||||
"Header value is not valid.",
|
'Invalid header value: "\u0000x"',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
|
@ -53,7 +53,7 @@ Deno.test(
|
||||||
await assertRejects(
|
await assertRejects(
|
||||||
() => wasmPromise,
|
() => wasmPromise,
|
||||||
TypeError,
|
TypeError,
|
||||||
"Invalid WebAssembly content type.",
|
"Invalid WebAssembly content type",
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue