diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/bench/http/deno_http_flash_post_bin.js | 16 | ||||
-rw-r--r-- | cli/bench/http/deno_http_flash_post_bin.lua | 5 | ||||
-rw-r--r-- | cli/bench/http/deno_post_bin.js | 19 | ||||
-rw-r--r-- | cli/bench/http/deno_post_bin.lua | 5 | ||||
-rw-r--r-- | cli/bench/http/node_post_bin.js | 18 | ||||
-rw-r--r-- | cli/bench/http/node_post_bin.lua | 5 | ||||
-rw-r--r-- | cli/tests/unit/fetch_test.ts | 16 | ||||
-rw-r--r-- | cli/tests/unit/http_test.ts | 81 |
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); |