summaryrefslogtreecommitdiff
path: root/std/http/server_test.ts
diff options
context:
space:
mode:
authorMarcos Casagrande <marcoscvp90@gmail.com>2020-06-08 17:58:52 +0200
committerGitHub <noreply@github.com>2020-06-08 17:58:52 +0200
commit2c990414bf51459869090d3b802086bbd19b3f68 (patch)
tree053b45009feebf5774bae9ffabcd109bdbb1b1f2 /std/http/server_test.ts
parentf247423f206ea5c3ca07254413a1ff11709a2ada (diff)
fix(std/http): Prevent crash on UnexpectedEof and InvalidData (#6155)
Diffstat (limited to 'std/http/server_test.ts')
-rw-r--r--std/http/server_test.ts70
1 files changed, 70 insertions, 0 deletions
diff --git a/std/http/server_test.ts b/std/http/server_test.ts
index 52cd8c539..93b117059 100644
--- a/std/http/server_test.ts
+++ b/std/http/server_test.ts
@@ -545,3 +545,73 @@ test({
assert((await entry).done);
},
});
+
+test({
+ name: "serveTLS Invalid Cert",
+ fn: async (): Promise<void> => {
+ // Runs a simple server as another process
+ const p = Deno.run({
+ cmd: [
+ Deno.execPath(),
+ "run",
+ "--allow-net",
+ "--allow-read",
+ "http/testdata/simple_https_server.ts",
+ ],
+ stdout: "piped",
+ });
+
+ let serverIsRunning = true;
+ const statusPromise = p
+ .status()
+ .then((): void => {
+ serverIsRunning = false;
+ })
+ .catch((_): void => {}); // Ignores the error when closing the process.
+
+ try {
+ const r = new TextProtoReader(new BufReader(p.stdout!));
+ const s = await r.readLine();
+ assert(
+ s !== null && s.includes("server listening"),
+ "server must be started"
+ );
+ // Invalid certificate, connection should throw
+ // but should not crash the server
+ assertThrowsAsync(
+ () =>
+ Deno.connectTls({
+ hostname: "localhost",
+ port: 4503,
+ // certFile
+ }),
+ Deno.errors.InvalidData
+ );
+
+ // Valid request after invalid
+ const conn = await Deno.connectTls({
+ hostname: "localhost",
+ port: 4503,
+ certFile: "http/testdata/tls/RootCA.pem",
+ });
+
+ await Deno.writeAll(
+ conn,
+ new TextEncoder().encode("GET / HTTP/1.0\r\n\r\n")
+ );
+ const res = new Uint8Array(100);
+ const nread = await conn.read(res);
+ assert(nread !== null);
+ conn.close();
+ const resStr = new TextDecoder().decode(res.subarray(0, nread));
+ assert(resStr.includes("Hello HTTPS"));
+ assert(serverIsRunning);
+ } finally {
+ // Stops the sever and allows `p.status()` promise to resolve
+ Deno.kill(p.pid, Deno.Signal.SIGKILL);
+ await statusPromise;
+ p.stdout!.close();
+ p.close();
+ }
+ },
+});