diff --git a/ext/http/00_serve.ts b/ext/http/00_serve.ts index b12a8739050be8..de94779dcd0434 100644 --- a/ext/http/00_serve.ts +++ b/ext/http/00_serve.ts @@ -793,9 +793,9 @@ internals.serveHttpOnConnection = serveHttpOnConnection; function registerDeclarativeServer(exports) { if (ObjectHasOwn(exports, "fetch")) { - if (typeof exports.fetch !== "function" || exports.fetch.length !== 1) { + if (typeof exports.fetch !== "function") { throw new TypeError( - "Invalid type for fetch: must be a function with a single parameter", + "Invalid type for fetch: must be a function with a single or no parameter", ); } return ({ servePort, serveHost }) => { diff --git a/tests/integration/serve_tests.rs b/tests/integration/serve_tests.rs index 92b0576ed1b333..85de068c9ca409 100644 --- a/tests/integration/serve_tests.rs +++ b/tests/integration/serve_tests.rs @@ -14,12 +14,12 @@ async fn deno_serve_port_0() { .arg("serve") .arg("--port") .arg("0") - .arg("./serve.ts") + .arg("./serve/port_0.ts") .stdout_piped() .spawn() .unwrap(); let stdout = child.stdout.as_mut().unwrap(); - let mut buffer = [0; 50]; + let mut buffer = [0; 52]; let _read = stdout.read(&mut buffer).unwrap(); let msg = std::str::from_utf8(&buffer).unwrap(); let port_regex = Regex::new(r"(\d+)").unwrap(); @@ -49,3 +49,46 @@ async fn deno_serve_port_0() { child.kill().unwrap(); child.wait().unwrap(); } + +#[tokio::test] +async fn deno_serve_no_args() { + let mut child = util::deno_cmd() + .current_dir(util::testdata_path()) + .arg("serve") + .arg("--port") + .arg("0") + .arg("./serve/no_args.ts") + .stdout_piped() + .spawn() + .unwrap(); + let stdout = child.stdout.as_mut().unwrap(); + let mut buffer = [0; 52]; + let _read = stdout.read(&mut buffer).unwrap(); + let msg = std::str::from_utf8(&buffer).unwrap(); + let port_regex = Regex::new(r"(\d+)").unwrap(); + let port = port_regex.find(msg).unwrap().as_str(); + + let cert = reqwest::Certificate::from_pem(include_bytes!( + "../testdata/tls/RootCA.crt" + )) + .unwrap(); + + let client = reqwest::Client::builder() + .add_root_certificate(cert) + .http2_prior_knowledge() + .build() + .unwrap(); + + let res = client + .get(&format!("http://127.0.0.1:{port}")) + .send() + .await + .unwrap(); + assert_eq!(200, res.status()); + + let body = res.text().await.unwrap(); + assert_eq!(body, "deno serve with no args in fetch() works!"); + + child.kill().unwrap(); + child.wait().unwrap(); +} diff --git a/tests/testdata/serve/no_args.ts b/tests/testdata/serve/no_args.ts new file mode 100644 index 00000000000000..891ddea6758634 --- /dev/null +++ b/tests/testdata/serve/no_args.ts @@ -0,0 +1,5 @@ +export default { + fetch() { + return new Response("deno serve with no args in fetch() works!"); + }, +}; diff --git a/tests/testdata/serve.ts b/tests/testdata/serve/port_0.ts similarity index 100% rename from tests/testdata/serve.ts rename to tests/testdata/serve/port_0.ts