2023-12-01 21:20:06 -05:00
|
|
|
import { assert, assertEquals } from "../../../../test_util/std/assert/mod.ts";
|
2023-02-06 17:22:52 -05:00
|
|
|
import { BufReader } from "../../../../test_util/std/io/buf_reader.ts";
|
|
|
|
import { BufWriter } from "../../../../test_util/std/io/buf_writer.ts";
|
2022-10-17 18:57:31 -04:00
|
|
|
import { TextProtoReader } from "./textproto.ts";
|
2021-07-22 06:28:46 -04:00
|
|
|
|
|
|
|
const encoder = new TextEncoder();
|
|
|
|
const decoder = new TextDecoder();
|
|
|
|
|
2023-11-22 06:11:20 -05:00
|
|
|
const { promise, resolve } = Promise.withResolvers();
|
2021-07-22 06:28:46 -04:00
|
|
|
const hostname = "localhost";
|
|
|
|
const port = 3504;
|
|
|
|
|
|
|
|
const listener = Deno.listenTls({
|
|
|
|
hostname,
|
|
|
|
port,
|
2024-01-23 11:35:23 -05:00
|
|
|
cert: Deno.readTextFileSync("./tls/localhost.crt"),
|
|
|
|
key: Deno.readTextFileSync("./tls/localhost.key"),
|
2021-07-22 06:28:46 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
const response = encoder.encode(
|
|
|
|
"HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n",
|
|
|
|
);
|
|
|
|
|
|
|
|
listener.accept().then(
|
|
|
|
async (conn) => {
|
|
|
|
assert(conn.remoteAddr != null);
|
|
|
|
assert(conn.localAddr != null);
|
|
|
|
await conn.write(response);
|
|
|
|
// TODO(bartlomieju): this might be a bug
|
|
|
|
setTimeout(() => {
|
|
|
|
conn.close();
|
2023-11-22 06:11:20 -05:00
|
|
|
resolve();
|
2021-07-22 06:28:46 -04:00
|
|
|
}, 0);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
let conn = await Deno.connect({ hostname, port });
|
|
|
|
conn = await Deno.startTls(conn, { hostname });
|
|
|
|
assert(conn.rid > 0);
|
|
|
|
const w = new BufWriter(conn);
|
|
|
|
const r = new BufReader(conn);
|
|
|
|
const body = `GET / HTTP/1.1\r\nHost: ${hostname}:${port}\r\n\r\n`;
|
|
|
|
const writeResult = await w.write(encoder.encode(body));
|
|
|
|
assertEquals(body.length, writeResult);
|
|
|
|
await w.flush();
|
|
|
|
const tpr = new TextProtoReader(r);
|
|
|
|
const statusLine = await tpr.readLine();
|
|
|
|
assert(statusLine !== null, `line must be read: ${String(statusLine)}`);
|
|
|
|
const m = statusLine.match(/^(.+?) (.+?) (.+?)$/);
|
|
|
|
assert(m !== null, "must be matched");
|
|
|
|
const [_, proto, status, ok] = m;
|
|
|
|
assertEquals(proto, "HTTP/1.1");
|
|
|
|
assertEquals(status, "200");
|
|
|
|
assertEquals(ok, "OK");
|
2022-10-17 18:57:31 -04:00
|
|
|
const headers = await tpr.readMimeHeader();
|
2021-07-22 06:28:46 -04:00
|
|
|
assert(headers !== null);
|
|
|
|
const contentLength = parseInt(headers.get("content-length"));
|
|
|
|
const bodyBuf = new Uint8Array(contentLength);
|
|
|
|
await r.readFull(bodyBuf);
|
|
|
|
assertEquals(decoder.decode(bodyBuf), "Hello World\n");
|
|
|
|
conn.close();
|
|
|
|
listener.close();
|
2023-11-22 06:11:20 -05:00
|
|
|
await promise;
|
2021-07-22 06:28:46 -04:00
|
|
|
|
|
|
|
console.log("DONE");
|