diff options
author | Marcos Casagrande <marcoscvp90@gmail.com> | 2020-06-08 17:58:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-08 17:58:52 +0200 |
commit | 2c990414bf51459869090d3b802086bbd19b3f68 (patch) | |
tree | 053b45009feebf5774bae9ffabcd109bdbb1b1f2 /std/http/server_test.ts | |
parent | f247423f206ea5c3ca07254413a1ff11709a2ada (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.ts | 70 |
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(); + } + }, +}); |