summaryrefslogtreecommitdiff
path: root/ext/node/polyfills/internal_binding
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/polyfills/internal_binding')
-rw-r--r--ext/node/polyfills/internal_binding/_timingSafeEqual.ts21
-rw-r--r--ext/node/polyfills/internal_binding/http_parser.ts160
-rw-r--r--ext/node/polyfills/internal_binding/mod.ts3
-rw-r--r--ext/node/polyfills/internal_binding/tcp_wrap.ts6
-rw-r--r--ext/node/polyfills/internal_binding/uv.ts2
5 files changed, 180 insertions, 12 deletions
diff --git a/ext/node/polyfills/internal_binding/_timingSafeEqual.ts b/ext/node/polyfills/internal_binding/_timingSafeEqual.ts
index ff141fdbf..559b7685b 100644
--- a/ext/node/polyfills/internal_binding/_timingSafeEqual.ts
+++ b/ext/node/polyfills/internal_binding/_timingSafeEqual.ts
@@ -5,10 +5,11 @@
import { Buffer } from "node:buffer";
-function assert(cond) {
- if (!cond) {
- throw new Error("assertion failed");
+function toDataView(ab: ArrayBufferLike | ArrayBufferView): DataView {
+ if (ArrayBuffer.isView(ab)) {
+ return new DataView(ab.buffer, ab.byteOffset, ab.byteLength);
}
+ return new DataView(ab);
}
/** Compare to array buffers or data views in a way that timing based attacks
@@ -21,13 +22,11 @@ function stdTimingSafeEqual(
return false;
}
if (!(a instanceof DataView)) {
- a = new DataView(ArrayBuffer.isView(a) ? a.buffer : a);
+ a = toDataView(a);
}
if (!(b instanceof DataView)) {
- b = new DataView(ArrayBuffer.isView(b) ? b.buffer : b);
+ b = toDataView(b);
}
- assert(a instanceof DataView);
- assert(b instanceof DataView);
const length = a.byteLength;
let out = 0;
let i = -1;
@@ -41,7 +40,11 @@ export const timingSafeEqual = (
a: Buffer | DataView | ArrayBuffer,
b: Buffer | DataView | ArrayBuffer,
): boolean => {
- if (a instanceof Buffer) a = new DataView(a.buffer);
- if (a instanceof Buffer) b = new DataView(a.buffer);
+ if (a instanceof Buffer) {
+ a = new DataView(a.buffer, a.byteOffset, a.byteLength);
+ }
+ if (b instanceof Buffer) {
+ b = new DataView(b.buffer, b.byteOffset, b.byteLength);
+ }
return stdTimingSafeEqual(a, b);
};
diff --git a/ext/node/polyfills/internal_binding/http_parser.ts b/ext/node/polyfills/internal_binding/http_parser.ts
new file mode 100644
index 000000000..bad10d985
--- /dev/null
+++ b/ext/node/polyfills/internal_binding/http_parser.ts
@@ -0,0 +1,160 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import { primordials } from "ext:core/mod.js";
+import { AsyncWrap } from "ext:deno_node/internal_binding/async_wrap.ts";
+
+const {
+ ObjectDefineProperty,
+ ObjectEntries,
+ ObjectSetPrototypeOf,
+ SafeArrayIterator,
+} = primordials;
+
+export const methods = [
+ "DELETE",
+ "GET",
+ "HEAD",
+ "POST",
+ "PUT",
+ "CONNECT",
+ "OPTIONS",
+ "TRACE",
+ "COPY",
+ "LOCK",
+ "MKCOL",
+ "MOVE",
+ "PROPFIND",
+ "PROPPATCH",
+ "SEARCH",
+ "UNLOCK",
+ "BIND",
+ "REBIND",
+ "UNBIND",
+ "ACL",
+ "REPORT",
+ "MKACTIVITY",
+ "CHECKOUT",
+ "MERGE",
+ "M-SEARCH",
+ "NOTIFY",
+ "SUBSCRIBE",
+ "UNSUBSCRIBE",
+ "PATCH",
+ "PURGE",
+ "MKCALENDAR",
+ "LINK",
+ "UNLINK",
+ "SOURCE",
+ "QUERY",
+];
+
+export const allMethods = [
+ "DELETE",
+ "GET",
+ "HEAD",
+ "POST",
+ "PUT",
+ "CONNECT",
+ "OPTIONS",
+ "TRACE",
+ "COPY",
+ "LOCK",
+ "MKCOL",
+ "MOVE",
+ "PROPFIND",
+ "PROPPATCH",
+ "SEARCH",
+ "UNLOCK",
+ "BIND",
+ "REBIND",
+ "UNBIND",
+ "ACL",
+ "REPORT",
+ "MKACTIVITY",
+ "CHECKOUT",
+ "MERGE",
+ "M-SEARCH",
+ "NOTIFY",
+ "SUBSCRIBE",
+ "UNSUBSCRIBE",
+ "PATCH",
+ "PURGE",
+ "MKCALENDAR",
+ "LINK",
+ "UNLINK",
+ "SOURCE",
+ "PRI",
+ "DESCRIBE",
+ "ANNOUNCE",
+ "SETUP",
+ "PLAY",
+ "PAUSE",
+ "TEARDOWN",
+ "GET_PARAMETER",
+ "SET_PARAMETER",
+ "REDIRECT",
+ "RECORD",
+ "FLUSH",
+ "QUERY",
+];
+
+export function HTTPParser() {
+}
+
+ObjectSetPrototypeOf(HTTPParser.prototype, AsyncWrap.prototype);
+
+function defineProps(obj: object, props: Record<string, unknown>) {
+ for (const entry of new SafeArrayIterator(ObjectEntries(props))) {
+ ObjectDefineProperty(obj, entry[0], {
+ __proto__: null,
+ value: entry[1],
+ enumerable: true,
+ writable: true,
+ configurable: true,
+ });
+ }
+}
+
+defineProps(HTTPParser, {
+ REQUEST: 1,
+ RESPONSE: 2,
+ kOnMessageBegin: 0,
+ kOnHeaders: 1,
+ kOnHeadersComplete: 2,
+ kOnBody: 3,
+ kOnMessageComplete: 4,
+ kOnExecute: 5,
+ kOnTimeout: 6,
+ kLenientNone: 0,
+ kLenientHeaders: 1,
+ kLenientChunkedLength: 2,
+ kLenientKeepAlive: 4,
+ kLenientTransferEncoding: 8,
+ kLenientVersion: 16,
+ kLenientDataAfterClose: 32,
+ kLenientOptionalLFAfterCR: 64,
+ kLenientOptionalCRLFAfterChunk: 128,
+ kLenientOptionalCRBeforeLF: 256,
+ kLenientSpacesAfterChunkSize: 512,
+ kLenientAll: 1023,
+});
diff --git a/ext/node/polyfills/internal_binding/mod.ts b/ext/node/polyfills/internal_binding/mod.ts
index f2d7f55bc..ebbfc629f 100644
--- a/ext/node/polyfills/internal_binding/mod.ts
+++ b/ext/node/polyfills/internal_binding/mod.ts
@@ -17,6 +17,7 @@ import * as types from "ext:deno_node/internal_binding/types.ts";
import * as udpWrap from "ext:deno_node/internal_binding/udp_wrap.ts";
import * as util from "ext:deno_node/internal_binding/util.ts";
import * as uv from "ext:deno_node/internal_binding/uv.ts";
+import * as httpParser from "ext:deno_node/internal_binding/http_parser.ts";
const modules = {
"async_wrap": asyncWrap,
@@ -32,7 +33,7 @@ const modules = {
"fs_dir": {},
"fs_event_wrap": {},
"heap_utils": {},
- "http_parser": {},
+ "http_parser": httpParser,
icu: {},
inspector: {},
"js_stream": {},
diff --git a/ext/node/polyfills/internal_binding/tcp_wrap.ts b/ext/node/polyfills/internal_binding/tcp_wrap.ts
index 973a1d1c0..d9f1c5356 100644
--- a/ext/node/polyfills/internal_binding/tcp_wrap.ts
+++ b/ext/node/polyfills/internal_binding/tcp_wrap.ts
@@ -299,8 +299,10 @@ export class TCP extends ConnectionWrap {
* @param noDelay
* @return An error status code.
*/
- setNoDelay(_noDelay: boolean): number {
- // TODO(bnoordhuis) https://github.com/denoland/deno/pull/13103
+ setNoDelay(noDelay: boolean): number {
+ if (this[kStreamBaseField] && "setNoDelay" in this[kStreamBaseField]) {
+ this[kStreamBaseField].setNoDelay(noDelay);
+ }
return 0;
}
diff --git a/ext/node/polyfills/internal_binding/uv.ts b/ext/node/polyfills/internal_binding/uv.ts
index aa468a0a5..6cd70a7e8 100644
--- a/ext/node/polyfills/internal_binding/uv.ts
+++ b/ext/node/polyfills/internal_binding/uv.ts
@@ -530,10 +530,12 @@ export function mapSysErrnoToUvErrno(sysErrno: number): number {
export const UV_EAI_MEMORY = codeMap.get("EAI_MEMORY")!;
export const UV_EBADF = codeMap.get("EBADF")!;
+export const UV_ECANCELED = codeMap.get("ECANCELED")!;
export const UV_EEXIST = codeMap.get("EEXIST");
export const UV_EINVAL = codeMap.get("EINVAL")!;
export const UV_ENOENT = codeMap.get("ENOENT");
export const UV_ENOTSOCK = codeMap.get("ENOTSOCK")!;
+export const UV_ETIMEDOUT = codeMap.get("ETIMEDOUT")!;
export const UV_UNKNOWN = codeMap.get("UNKNOWN")!;
export function errname(errno: number): string {