summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/bench/http/deno_http_flash_post_bin.js16
-rw-r--r--cli/bench/http/deno_http_flash_post_bin.lua5
-rw-r--r--cli/bench/http/deno_post_bin.js19
-rw-r--r--cli/bench/http/deno_post_bin.lua5
-rw-r--r--cli/bench/http/node_post_bin.js18
-rw-r--r--cli/bench/http/node_post_bin.lua5
-rw-r--r--cli/tests/unit/fetch_test.ts16
-rw-r--r--cli/tests/unit/http_test.ts81
8 files changed, 165 insertions, 0 deletions
diff --git a/cli/bench/http/deno_http_flash_post_bin.js b/cli/bench/http/deno_http_flash_post_bin.js
new file mode 100644
index 000000000..cea530e60
--- /dev/null
+++ b/cli/bench/http/deno_http_flash_post_bin.js
@@ -0,0 +1,16 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+
+const addr = Deno.args[0] || "127.0.0.1:4500";
+const [hostname, port] = addr.split(":");
+const { serve } = Deno;
+
+async function handler(request) {
+ try {
+ const buffer = await request.arrayBuffer();
+ return new Response(buffer.byteLength);
+ } catch (e) {
+ console.log(e);
+ }
+}
+
+serve(handler, { hostname, port });
diff --git a/cli/bench/http/deno_http_flash_post_bin.lua b/cli/bench/http/deno_http_flash_post_bin.lua
new file mode 100644
index 000000000..c8f5d3e3f
--- /dev/null
+++ b/cli/bench/http/deno_http_flash_post_bin.lua
@@ -0,0 +1,5 @@
+wrk.method = "POST"
+wrk.headers["Content-Type"] = "application/octet-stream"
+
+file = io.open("./cli/bench/testdata/128k.bin", "rb")
+wrk.body = file:read("*a") \ No newline at end of file
diff --git a/cli/bench/http/deno_post_bin.js b/cli/bench/http/deno_post_bin.js
new file mode 100644
index 000000000..33ffeed1b
--- /dev/null
+++ b/cli/bench/http/deno_post_bin.js
@@ -0,0 +1,19 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+
+const addr = Deno.args[0] || "127.0.0.1:4500";
+const [hostname, port] = addr.split(":");
+const listener = Deno.listen({ hostname, port: Number(port) });
+console.log("Server listening on", addr);
+
+for await (const conn of listener) {
+ (async () => {
+ const requests = Deno.serveHttp(conn);
+ for await (const { respondWith, request } of requests) {
+ if (request.method == "POST") {
+ const buffer = await request.arrayBuffer();
+ respondWith(new Response(buffer.byteLength))
+ .catch((e) => console.log(e));
+ }
+ }
+ })();
+}
diff --git a/cli/bench/http/deno_post_bin.lua b/cli/bench/http/deno_post_bin.lua
new file mode 100644
index 000000000..c8f5d3e3f
--- /dev/null
+++ b/cli/bench/http/deno_post_bin.lua
@@ -0,0 +1,5 @@
+wrk.method = "POST"
+wrk.headers["Content-Type"] = "application/octet-stream"
+
+file = io.open("./cli/bench/testdata/128k.bin", "rb")
+wrk.body = file:read("*a") \ No newline at end of file
diff --git a/cli/bench/http/node_post_bin.js b/cli/bench/http/node_post_bin.js
new file mode 100644
index 000000000..d0f2d6667
--- /dev/null
+++ b/cli/bench/http/node_post_bin.js
@@ -0,0 +1,18 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+const http = require("http");
+const port = process.argv[2] || "4544";
+console.log("port", port);
+http
+ .Server((req, res) => {
+ if (req.method == "POST") {
+ let chunks = [];
+ req.on("data", function (data) {
+ chunks.push(data);
+ });
+ req.on("end", function () {
+ const buffer = Buffer.concat(chunks);
+ res.end(buffer.byteLength.toString());
+ });
+ }
+ })
+ .listen(port);
diff --git a/cli/bench/http/node_post_bin.lua b/cli/bench/http/node_post_bin.lua
new file mode 100644
index 000000000..c8f5d3e3f
--- /dev/null
+++ b/cli/bench/http/node_post_bin.lua
@@ -0,0 +1,5 @@
+wrk.method = "POST"
+wrk.headers["Content-Type"] = "application/octet-stream"
+
+file = io.open("./cli/bench/testdata/128k.bin", "rb")
+wrk.body = file:read("*a") \ No newline at end of file
diff --git a/cli/tests/unit/fetch_test.ts b/cli/tests/unit/fetch_test.ts
index 36c1926f2..e2ff0d5e0 100644
--- a/cli/tests/unit/fetch_test.ts
+++ b/cli/tests/unit/fetch_test.ts
@@ -1789,3 +1789,19 @@ Deno.test(
assertEquals(await res.text(), "ok");
},
);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchResponseStreamIsLockedWhileReading() {
+ const response = await fetch("http://localhost:4545/echo_server", {
+ body: new Uint8Array(5000),
+ method: "POST",
+ });
+
+ assertEquals(response.body!.locked, false);
+ const promise = response.arrayBuffer();
+ assertEquals(response.body!.locked, true);
+
+ await promise;
+ },
+);
diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts
index 3de93076e..7bb16aecc 100644
--- a/cli/tests/unit/http_test.ts
+++ b/cli/tests/unit/http_test.ts
@@ -2292,6 +2292,87 @@ Deno.test("upgradeHttp unix", {
await Promise.all([server, client()]);
});
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerReadLargeBodyWithContentLength() {
+ const TLS_PACKET_SIZE = 16 * 1024 + 256;
+ // We want the body to be read in multiple packets
+ const body = "aa\n" + "deno.land large body\n".repeat(TLS_PACKET_SIZE) +
+ "zz";
+
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: 4501 });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(await request.text(), body);
+ await respondWith(new Response(body));
+ })();
+
+ const resp = await fetch("http://127.0.0.1:4501/", {
+ method: "POST",
+ headers: { "connection": "close" },
+ body,
+ });
+ const text = await resp.text();
+ assertEquals(text, body);
+ await promise;
+
+ httpConn!.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerReadLargeBodyWithTransferChunked() {
+ const TLS_PACKET_SIZE = 16 * 1024 + 256;
+
+ // We want the body to be read in multiple packets
+ const chunks = [
+ "aa\n",
+ "deno.land large body\n".repeat(TLS_PACKET_SIZE),
+ "zz",
+ ];
+
+ const body = chunks.join("");
+
+ const stream = new TransformStream();
+ const writer = stream.writable.getWriter();
+ for (const chunk of chunks) {
+ writer.write(new TextEncoder().encode(chunk));
+ }
+ writer.close();
+
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: 4501 });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(await request.text(), body);
+ await respondWith(new Response(body));
+ })();
+
+ const resp = await fetch("http://127.0.0.1:4501/", {
+ method: "POST",
+ headers: { "connection": "close" },
+ body: stream.readable,
+ });
+ const text = await resp.text();
+ assertEquals(text, body);
+ await promise;
+
+ httpConn!.close();
+ },
+);
+
function chunkedBodyReader(h: Headers, r: BufReader): Deno.Reader {
// Based on https://tools.ietf.org/html/rfc2616#section-19.4.6
const tp = new TextProtoReader(r);