summaryrefslogtreecommitdiff
path: root/ext/http/00_serve.js
diff options
context:
space:
mode:
authorYoshiya Hinosawa <stibium121@gmail.com>2023-10-04 11:37:39 +0900
committerGitHub <noreply@github.com>2023-10-04 11:37:39 +0900
commitda0b945804f19903beac71b23ff1040ebdb9b554 (patch)
tree8ec0508fbc04839f113b2d58169090d14b474cdd /ext/http/00_serve.js
parent8c1677ecbcbb474fc6a5ac9b5f73b562677bb829 (diff)
feat(unstable): add unix domain socket support to Deno.serve (#20759)
Diffstat (limited to 'ext/http/00_serve.js')
-rw-r--r--ext/http/00_serve.js44
1 files changed, 40 insertions, 4 deletions
diff --git a/ext/http/00_serve.js b/ext/http/00_serve.js
index aeebca93d..e74e1e71f 100644
--- a/ext/http/00_serve.js
+++ b/ext/http/00_serve.js
@@ -34,11 +34,12 @@ import {
ReadableStreamPrototype,
resourceForReadableStream,
} from "ext:deno_web/06_streams.js";
-import { listen, TcpConn } from "ext:deno_net/01_net.js";
+import { listen, listenOptionApiName, TcpConn } from "ext:deno_net/01_net.js";
import { listenTls } from "ext:deno_net/02_tls.js";
const {
ArrayPrototypePush,
Error,
+ ObjectHasOwn,
ObjectPrototypeIsPrototypeOf,
PromisePrototypeCatch,
Symbol,
@@ -272,6 +273,13 @@ class InnerRequest {
}
get remoteAddr() {
+ const transport = this.#context.listener?.addr.transport;
+ if (transport === "unix" || transport === "unixpacket") {
+ return {
+ transport,
+ path: this.#context.listener.addr.path,
+ };
+ }
if (this.#methodAndUri === undefined) {
if (this.#slabId === undefined) {
throw new TypeError("request closed");
@@ -337,8 +345,9 @@ class CallbackContext {
serverRid;
closed;
closing;
+ listener;
- constructor(signal, args) {
+ constructor(signal, args, listener) {
// The abort signal triggers a non-graceful shutdown
signal?.addEventListener(
"abort",
@@ -352,6 +361,7 @@ class CallbackContext {
this.scheme = args[1];
this.fallbackHost = args[2];
this.closed = false;
+ this.listener = listener;
}
close() {
@@ -519,11 +529,29 @@ function serve(arg1, arg2) {
}
const wantsHttps = options.cert || options.key;
+ const wantsUnix = ObjectHasOwn(options, "path");
const signal = options.signal;
const onError = options.onError ?? function (error) {
console.error(error);
return internalServerError();
};
+
+ if (wantsUnix) {
+ const listener = listen({
+ transport: "unix",
+ path: options.path,
+ [listenOptionApiName]: "Deno.serve",
+ });
+ const path = listener.addr.path;
+ return serveHttpOnListener(listener, signal, handler, onError, () => {
+ if (options.onListen) {
+ options.onListen({ path });
+ } else {
+ console.log(`Listening on ${path}`);
+ }
+ });
+ }
+
const listenOpts = {
hostname: options.hostname ?? "0.0.0.0",
port: options.port ?? 8000,
@@ -581,7 +609,11 @@ function serve(arg1, arg2) {
* Serve HTTP/1.1 and/or HTTP/2 on an arbitrary listener.
*/
function serveHttpOnListener(listener, signal, handler, onError, onListen) {
- const context = new CallbackContext(signal, op_http_serve(listener.rid));
+ const context = new CallbackContext(
+ signal,
+ op_http_serve(listener.rid),
+ listener,
+ );
const callback = mapToCallback(context, handler, onError);
onListen(context.scheme);
@@ -593,7 +625,11 @@ function serveHttpOnListener(listener, signal, handler, onError, onListen) {
* Serve HTTP/1.1 and/or HTTP/2 on an arbitrary connection.
*/
function serveHttpOnConnection(connection, signal, handler, onError, onListen) {
- const context = new CallbackContext(signal, op_http_serve_on(connection.rid));
+ const context = new CallbackContext(
+ signal,
+ op_http_serve_on(connection.rid),
+ null,
+ );
const callback = mapToCallback(context, handler, onError);
onListen(context.scheme);