Skip to content

Commit

Permalink
refactor errors
Browse files Browse the repository at this point in the history
  • Loading branch information
cirospaciari committed Oct 15, 2024
1 parent 9fdb70a commit b1582f4
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 303 deletions.
31 changes: 26 additions & 5 deletions src/bun.js/bindings/ErrorCode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@ export default [
["ABORT_ERR", Error, "AbortError"],
["ERR_CRYPTO_INVALID_DIGEST", TypeError, "TypeError"],
["ERR_ENCODING_INVALID_ENCODED_DATA", TypeError, "TypeError"],
["ERR_HTTP2_INVALID_HEADER_VALUE", TypeError, "TypeError"],
["ERR_HTTP2_INVALID_PSEUDOHEADER", TypeError, "TypeError"],
["ERR_HTTP2_PING_CANCEL", Error, "Error"],
["ERR_HTTP2_STREAM_ERROR", Error, "Error"],
["ERR_HTTP2_INVALID_SINGLE_VALUE_HEADER", TypeError, "TypeError"],
["ERR_INVALID_ARG_TYPE", TypeError, "TypeError"],
["ERR_INVALID_ARG_VALUE", TypeError, "TypeError"],
["ERR_INVALID_PROTOCOL", TypeError, "TypeError"],
Expand Down Expand Up @@ -56,4 +51,30 @@ export default [
["ERR_BODY_ALREADY_USED", Error, "Error"],
["ERR_STREAM_WRAP", Error, "Error"],
["ERR_BORINGSSL", Error, "Error"],

//HTTP2
["ERR_INVALID_HTTP_TOKEN", TypeError, "TypeError"],
["ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED", TypeError, "TypeError"],
["ERR_HTTP2_SEND_FILE", Error, "Error"],
["ERR_HTTP2_SEND_FILE_NOSEEK", Error, "Error"],
["ERR_HTTP2_HEADERS_SENT", Error, "ERR_HTTP2_HEADERS_SENT"],
["ERR_HTTP2_INFO_STATUS_NOT_ALLOWED", RangeError, "RangeError"],
["ERR_HTTP2_STATUS_INVALID", RangeError, "RangeError"],
["ERR_HTTP2_INVALID_PSEUDOHEADER", TypeError, "TypeError"],
["ERR_HTTP2_INVALID_HEADER_VALUE", TypeError, "TypeError"],
["ERR_HTTP2_PING_CANCEL", Error, "Error"],
["ERR_HTTP2_STREAM_ERROR", Error, "Error"],
["ERR_HTTP2_INVALID_SINGLE_VALUE_HEADER", TypeError, "TypeError"],
["ERR_HTTP2_SESSION_ERROR", Error, "Error"],
["ERR_HTTP2_INVALID_SESSION", Error, "Error"],
["ERR_HTTP2_INVALID_HEADERS", Error, "Error"],
["ERR_HTTP2_PING_LENGTH", RangeError, "RangeError"],
["ERR_HTTP2_INVALID_STREAM", Error, "Error"],
["ERR_HTTP2_TRAILERS_ALREADY_SENT", Error, "Error"],
["ERR_HTTP2_TRAILERS_NOT_READY", Error, "Error"],
["ERR_HTTP2_PAYLOAD_FORBIDDEN", Error, "Error"],
["ERR_HTTP2_NO_SOCKET_MANIPULATION", Error, "Error"],
["ERR_HTTP2_SOCKET_UNBOUND", Error, "Error"],
["ERR_HTTP2_ERROR", Error, "Error"],
["ERR_HTTP2_OUT_OF_STREAMS", Error, "Error"],
] as ErrorCodeMapping;
16 changes: 0 additions & 16 deletions src/js/internal/errors.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,4 @@
export default {
ERR_INVALID_HTTP_TOKEN: class ERR_INVALID_HTTP_TOKEN extends TypeError {
constructor(message, token) {
super(`${message} must be a valid HTTP token ["${token}"]`);
this.code = "ERR_INVALID_HTTP_TOKEN";
}
},
ERR_INVALID_ARG_VALUE: class ERR_INVALID_ARG_VALUE extends TypeError {
constructor(field, value) {
super(
value !== undefined
? `The arguments ${field} is invalid. Received ${value}`
: `The arguments ${field} is invalid.`,
);
this.code = "ERR_INVALID_ARG_VALUE";
}
},
ERR_INVALID_ARG_TYPE: $newCppFunction("ErrorCode.cpp", "jsFunction_ERR_INVALID_ARG_TYPE", 3),
ERR_OUT_OF_RANGE: $newCppFunction("ErrorCode.cpp", "jsFunction_ERR_OUT_OF_RANGE", 3),
ERR_IPC_DISCONNECTED: $newCppFunction("ErrorCode.cpp", "jsFunction_ERR_IPC_DISCONNECTED", 0),
Expand Down
63 changes: 63 additions & 0 deletions src/js/internal/validators.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,67 @@
const { hideFromStack } = require("internal/shared");

const RegExpPrototypeExec = RegExp.prototype.exec;

const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;
/**
* Verifies that the given val is a valid HTTP token
* per the rules defined in RFC 7230
* See https://tools.ietf.org/html/rfc7230#section-3.2.6
*/
function checkIsHttpToken(val) {
return RegExpPrototypeExec.$call(tokenRegExp, val) !== null;
}

/*
The rules for the Link header field are described here:
https://www.rfc-editor.org/rfc/rfc8288.html#section-3
This regex validates any string surrounded by angle brackets
(not necessarily a valid URI reference) followed by zero or more
link-params separated by semicolons.
*/
const linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/;
function validateLinkHeaderFormat(value, name) {
if (typeof value === "undefined" || !RegExpPrototypeExec.$call(linkValueRegExp, value)) {
throw $ERR_INVALID_ARG_VALUE(
`The arguments ${name} is invalid must be an array or string of format "</styles.css>; rel=preload; as=style"`,
);
}
}
function validateLinkHeaderValue(hints) {
if (typeof hints === "string") {
validateLinkHeaderFormat(hints, "hints");
return hints;
} else if (ArrayIsArray(hints)) {
const hintsLength = hints.length;
let result = "";

if (hintsLength === 0) {
return result;
}

for (let i = 0; i < hintsLength; i++) {
const link = hints[i];
validateLinkHeaderFormat(link, "hints");
result += link;

if (i !== hintsLength - 1) {
result += ", ";
}
}

return result;
}

throw $ERR_INVALID_ARG_VALUE(
`The arguments hints is invalid must be an array or string of format "</styles.css>; rel=preload; as=style"`,
);
}
hideFromStack(validateLinkHeaderValue);

export default {
validateLinkHeaderValue: validateLinkHeaderValue,
checkIsHttpToken: checkIsHttpToken,
/** `(value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER)` */
validateInteger: $newCppFunction("NodeValidator.cpp", "jsFunction_validateInteger", 0),
/** `(value, name, min = undefined, max)` */
Expand Down
18 changes: 3 additions & 15 deletions src/js/node/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const { ERR_INVALID_ARG_TYPE, ERR_INVALID_PROTOCOL } = require("internal/errors"
const { isPrimary } = require("internal/cluster/isPrimary");
const { kAutoDestroyed } = require("internal/shared");
const { urlToHttpOptions } = require("internal/url");
const { validateFunction } = require("internal/validators");
const { validateFunction, checkIsHttpToken } = require("internal/validators");

const {
getHeader,
Expand Down Expand Up @@ -59,8 +59,7 @@ function checkInvalidHeaderChar(val: string) {

const validateHeaderName = (name, label) => {
if (typeof name !== "string" || !name || !checkIsHttpToken(name)) {
// throw new ERR_INVALID_HTTP_TOKEN(label || "Header name", name);
throw new Error("ERR_INVALID_HTTP_TOKEN");
throw $ERR_INVALID_HTTP_TOKEN(`The arguments Header name is invalid. Received ${name}`);
}
};

Expand Down Expand Up @@ -1767,8 +1766,7 @@ class ClientRequest extends OutgoingMessage {

if (methodIsString && method) {
if (!checkIsHttpToken(method)) {
// throw new ERR_INVALID_HTTP_TOKEN("Method", method);
throw new Error("ERR_INVALID_HTTP_TOKEN: Method");
throw $ERR_INVALID_HTTP_TOKEN("Method");
}
method = this.#method = StringPrototypeToUpperCase.$call(method);
} else {
Expand Down Expand Up @@ -2008,16 +2006,6 @@ function validateHost(host, name) {
return host;
}

const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;
/**
* Verifies that the given val is a valid HTTP token
* per the rules defined in RFC 7230
* See https://tools.ietf.org/html/rfc7230#section-3.2.6
*/
function checkIsHttpToken(val) {
return RegExpPrototypeExec.$call(tokenRegExp, val) !== null;
}

// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
Expand Down
Loading

0 comments on commit b1582f4

Please sign in to comment.