summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/tests/unit/http_test.ts118
1 files changed, 116 insertions, 2 deletions
diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts
index fd8d49947..e8976c06d 100644
--- a/cli/tests/unit/http_test.ts
+++ b/cli/tests/unit/http_test.ts
@@ -5,7 +5,7 @@ import {
BufWriter,
} from "../../../test_util/std/io/buffer.ts";
import { TextProtoReader } from "../../../test_util/std/textproto/mod.ts";
-import { serve } from "../../../test_util/std/http/server.ts";
+import { serve, serveTls } from "../../../test_util/std/http/server.ts";
import {
assert,
assertEquals,
@@ -1739,7 +1739,7 @@ Deno.test({
},
});
-Deno.test("upgradeHttp", async () => {
+Deno.test("upgradeHttp tcp", async () => {
async function client() {
const tcpConn = await Deno.connect({ port: 4501 });
await tcpConn.write(
@@ -1782,6 +1782,120 @@ Deno.test("upgradeHttp", async () => {
await Promise.all([server, client()]);
});
+Deno.test(
+ "upgradeHttp tls",
+ { permissions: { net: true, read: true } },
+ async () => {
+ async function client() {
+ const caCerts = [
+ await Deno.readTextFile("cli/tests/testdata/tls/RootCA.pem"),
+ ];
+ const tlsConn = await Deno.connectTls({
+ hostname: "localhost",
+ port: 4502,
+ caCerts,
+ });
+ await tlsConn.write(
+ new TextEncoder().encode(
+ "CONNECT server.example.com:80 HTTP/1.1\r\n\r\nbla bla bla\nbla bla\nbla\n",
+ ),
+ );
+ setTimeout(async () => {
+ await tlsConn.write(
+ new TextEncoder().encode(
+ "bla bla bla\nbla bla\nbla\n",
+ ),
+ );
+ tlsConn.close();
+ }, 500);
+ }
+
+ const abortController = new AbortController();
+ const signal = abortController.signal;
+ const certFile = "cli/tests/testdata/tls/localhost.crt";
+ const keyFile = "cli/tests/testdata/tls/localhost.key";
+
+ const server = serveTls((req) => {
+ const p = Deno.upgradeHttp(req);
+
+ (async () => {
+ const [conn, firstPacket] = await p;
+ const buf = new Uint8Array(1024);
+ const firstPacketText = new TextDecoder().decode(firstPacket);
+ assertEquals(firstPacketText, "bla bla bla\nbla bla\nbla\n");
+ const n = await conn.read(buf);
+ assert(n != null);
+ const secondPacketText = new TextDecoder().decode(buf.slice(0, n));
+ assertEquals(secondPacketText, "bla bla bla\nbla bla\nbla\n");
+ abortController.abort();
+ conn.close();
+ })();
+
+ return new Response(null, { status: 101 });
+ }, { hostname: "localhost", port: 4502, signal, keyFile, certFile });
+
+ await Promise.all([server, client()]);
+ },
+);
+
+Deno.test("upgradeHttp unix", {
+ permissions: { read: true, write: true },
+ ignore: Deno.build.os === "windows",
+}, async () => {
+ const filePath = Deno.makeTempFileSync();
+ const promise = deferred();
+
+ async function client() {
+ const unixConn = await Deno.connect({ path: filePath, transport: "unix" });
+ await unixConn.write(
+ new TextEncoder().encode(
+ "CONNECT server.example.com:80 HTTP/1.1\r\n\r\nbla bla bla\nbla bla\nbla\n",
+ ),
+ );
+ setTimeout(async () => {
+ await unixConn.write(
+ new TextEncoder().encode(
+ "bla bla bla\nbla bla\nbla\n",
+ ),
+ );
+ unixConn.close();
+ promise.resolve();
+ }, 500);
+ await promise;
+ }
+
+ const server = (async () => {
+ const listener = Deno.listen({ path: filePath, transport: "unix" });
+ for await (const conn of listener) {
+ const httpConn = Deno.serveHttp(conn);
+ const maybeReq = await httpConn.nextRequest();
+ assert(maybeReq);
+ const { request, respondWith } = maybeReq;
+ const p = Deno.upgradeHttp(request);
+
+ const promise = (async () => {
+ const [conn, firstPacket] = await p;
+ const buf = new Uint8Array(1024);
+ const firstPacketText = new TextDecoder().decode(firstPacket);
+ assertEquals(firstPacketText, "bla bla bla\nbla bla\nbla\n");
+ const n = await conn.read(buf);
+ assert(n != null);
+ const secondPacketText = new TextDecoder().decode(buf.slice(0, n));
+ assertEquals(secondPacketText, "bla bla bla\nbla bla\nbla\n");
+ conn.close();
+ })();
+
+ const resp = new Response(null, { status: 101 });
+ await respondWith(resp);
+ await promise;
+ httpConn.close();
+ break;
+ }
+ })();
+
+ await Promise.all([server, client()]);
+});
+
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);