diff options
Diffstat (limited to 'std/http')
-rw-r--r-- | std/http/cookie.ts | 14 | ||||
-rw-r--r-- | std/http/cookie_test.ts | 2 | ||||
-rwxr-xr-x | std/http/file_server.ts | 6 | ||||
-rw-r--r-- | std/http/file_server_test.ts | 20 | ||||
-rw-r--r-- | std/http/racing_server_test.ts | 5 | ||||
-rw-r--r-- | std/http/server.ts | 30 | ||||
-rw-r--r-- | std/http/server_test.ts | 9 |
7 files changed, 49 insertions, 37 deletions
diff --git a/std/http/cookie.ts b/std/http/cookie.ts index b63c31216..5e4f38a29 100644 --- a/std/http/cookie.ts +++ b/std/http/cookie.ts @@ -45,8 +45,8 @@ function toString(cookie: Cookie): string { if (cookie.httpOnly) { out.push("HttpOnly"); } - if (Number.isInteger(cookie.maxAge!)) { - assert(cookie.maxAge! > 0, "Max-Age must be an integer superior to 0"); + if (Number.isInteger(cookie.maxAge)) { + assert(cookie.maxAge > 0, "Max-Age must be an integer superior to 0"); out.push(`Max-Age=${cookie.maxAge}`); } if (cookie.domain) { @@ -73,12 +73,14 @@ function toString(cookie: Cookie): string { * @param req Server Request */ export function getCookies(req: ServerRequest): Cookies { - if (req.headers.has("Cookie")) { + const cookie = req.headers.get("Cookie"); + if (cookie != null) { const out: Cookies = {}; - const c = req.headers.get("Cookie")!.split(";"); + const c = cookie.split(";"); for (const kv of c) { - const cookieVal = kv.split("="); - const key = cookieVal.shift()!.trim(); + const [cookieKey, ...cookieVal] = kv.split("="); + assert(cookieKey != null); + const key = cookieKey.trim(); out[key] = cookieVal.join("="); } return out; diff --git a/std/http/cookie_test.ts b/std/http/cookie_test.ts index 66061a5a4..5f51a6d32 100644 --- a/std/http/cookie_test.ts +++ b/std/http/cookie_test.ts @@ -38,7 +38,7 @@ test({ const res: Response = {}; delCookie(res, "deno"); assertEquals( - res.headers!.get("Set-Cookie"), + res.headers?.get("Set-Cookie"), "deno=; Expires=Thu, 01 Jan 1970 00:00:00 GMT" ); } diff --git a/std/http/file_server.ts b/std/http/file_server.ts index 6ec10cd65..acf272764 100755 --- a/std/http/file_server.ts +++ b/std/http/file_server.ts @@ -66,7 +66,7 @@ function modeToString(isDir: boolean, maybeMode: number | null): string { if (maybeMode === null) { return "(unknown mode)"; } - const mode = maybeMode!.toString(8); + const mode = maybeMode.toString(8); if (mode.length < 3) { return "(unknown mode)"; } @@ -186,8 +186,8 @@ function setCORS(res: Response): void { if (!res.headers) { res.headers = new Headers(); } - res.headers!.append("access-control-allow-origin", "*"); - res.headers!.append( + res.headers.append("access-control-allow-origin", "*"); + res.headers.append( "access-control-allow-headers", "Origin, X-Requested-With, Content-Type, Accept, Range" ); diff --git a/std/http/file_server_test.ts b/std/http/file_server_test.ts index 12a5b671f..924ee520c 100644 --- a/std/http/file_server_test.ts +++ b/std/http/file_server_test.ts @@ -20,14 +20,15 @@ async function startFileServer(): Promise<void> { stdout: "piped" }); // Once fileServer is ready it will write to its stdout. - const r = new TextProtoReader(new BufReader(fileServer.stdout!)); + assert(fileServer.stdout != null); + const r = new TextProtoReader(new BufReader(fileServer.stdout)); const s = await r.readLine(); assert(s !== Deno.EOF && s.includes("server listening")); } function killFileServer(): void { fileServer.close(); - fileServer.stdout!.close(); + fileServer.stdout?.close(); } test(async function serveFile(): Promise<void> { @@ -102,8 +103,10 @@ test(async function servePermissionDenied(): Promise<void> { stdout: "piped", stderr: "piped" }); - const reader = new TextProtoReader(new BufReader(deniedServer.stdout!)); - const errReader = new TextProtoReader(new BufReader(deniedServer.stderr!)); + assert(deniedServer.stdout != null); + const reader = new TextProtoReader(new BufReader(deniedServer.stdout)); + assert(deniedServer.stderr != null); + const errReader = new TextProtoReader(new BufReader(deniedServer.stderr)); const s = await reader.readLine(); assert(s !== Deno.EOF && s.includes("server listening")); @@ -115,8 +118,8 @@ test(async function servePermissionDenied(): Promise<void> { ); } finally { deniedServer.close(); - deniedServer.stdout!.close(); - deniedServer.stderr!.close(); + deniedServer.stdout.close(); + deniedServer.stderr.close(); } }); @@ -125,9 +128,10 @@ test(async function printHelp(): Promise<void> { args: [Deno.execPath(), "run", "http/file_server.ts", "--help"], stdout: "piped" }); - const r = new TextProtoReader(new BufReader(helpProcess.stdout!)); + assert(helpProcess.stdout != null); + const r = new TextProtoReader(new BufReader(helpProcess.stdout)); const s = await r.readLine(); assert(s !== Deno.EOF && s.includes("Deno File Server")); helpProcess.close(); - helpProcess.stdout!.close(); + helpProcess.stdout.close(); }); diff --git a/std/http/racing_server_test.ts b/std/http/racing_server_test.ts index 8b7ff9829..27be0d79c 100644 --- a/std/http/racing_server_test.ts +++ b/std/http/racing_server_test.ts @@ -12,13 +12,14 @@ async function startServer(): Promise<void> { stdout: "piped" }); // Once racing server is ready it will write to its stdout. - const r = new TextProtoReader(new BufReader(server.stdout!)); + assert(server.stdout != null); + const r = new TextProtoReader(new BufReader(server.stdout)); const s = await r.readLine(); assert(s !== Deno.EOF && s.includes("Racing server listening...")); } function killServer(): void { server.close(); - server.stdout!.close(); + server.stdout?.close(); } const input = `GET / HTTP/1.1 diff --git a/std/http/server.ts b/std/http/server.ts index 94834c41f..0bd5d06b5 100644 --- a/std/http/server.ts +++ b/std/http/server.ts @@ -73,9 +73,10 @@ export async function writeResponse(w: Writer, r: Response): Promise<void> { let out = `HTTP/${protoMajor}.${protoMinor} ${statusCode} ${statusText}\r\n`; setContentLength(r); - const headers = r.headers!; + assert(r.headers != null); + const headers = r.headers; - for (const [key, value] of headers!) { + for (const [key, value] of headers) { out += `${key}: ${value}\r\n`; } out += "\r\n"; @@ -88,7 +89,9 @@ export async function writeResponse(w: Writer, r: Response): Promise<void> { const n = await writer.write(r.body); assert(n === r.body.byteLength); } else if (headers.has("content-length")) { - const bodyLength = parseInt(headers.get("content-length")!); + const contentLength = headers.get("content-length"); + assert(contentLength != null); + const bodyLength = parseInt(contentLength); const n = await copy(writer, r.body); assert(n === bodyLength); } else { @@ -129,8 +132,9 @@ export class ServerRequest { // undefined means not cached. // null means invalid or not provided. if (this._contentLength === undefined) { - if (this.headers.has("content-length")) { - this._contentLength = +this.headers.get("content-length")!; + const cl = this.headers.get("content-length"); + if (cl) { + this._contentLength = parseInt(cl); // Convert NaN to null (as NaN harder to test) if (Number.isNaN(this._contentLength)) { this._contentLength = null; @@ -190,12 +194,12 @@ export class ServerRequest { } yield nread; } else { - if (this.headers.has("transfer-encoding")) { - const transferEncodings = this.headers - .get("transfer-encoding")! + const transferEncoding = this.headers.get("transfer-encoding"); + if (transferEncoding) { + const parts = transferEncoding .split(",") .map((e): string => e.trim().toLowerCase()); - if (transferEncodings.includes("chunked")) { + if (parts.includes("chunked")) { // Based on https://tools.ietf.org/html/rfc2616#section-19.4.6 const tp = new TextProtoReader(this.r); let line = await tp.readLine(); @@ -413,7 +417,7 @@ export class Server implements AsyncIterable<ServerRequest> { // Wait for the request to be processed before we accept a new request on // this connection. - const procError = await req!.done; + const procError = await req.done; if (procError) { // Something bad happened during response. // (likely other side closed during pipelined req) @@ -422,12 +426,12 @@ export class Server implements AsyncIterable<ServerRequest> { } } - if (req! === Deno.EOF) { + if (req === Deno.EOF) { // The connection was gracefully closed. - } else if (err) { + } else if (err && req) { // An error was thrown while parsing request headers. try { - await writeResponse(req!.w, { + await writeResponse(req.w, { status: 400, body: encoder.encode(`${err.message}\r\n\r\n`) }); diff --git a/std/http/server_test.ts b/std/http/server_test.ts index b4c850b74..31e68eb1a 100644 --- a/std/http/server_test.ts +++ b/std/http/server_test.ts @@ -506,8 +506,7 @@ test(async function testReadRequestError(): Promise<void> { for (const test of testCases) { const reader = new BufReader(new StringReader(test.in)); let err; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let req: any; + let req: ServerRequest | Deno.EOF; try { req = await readRequest(mockConn as Deno.Conn, reader); } catch (e) { @@ -520,10 +519,12 @@ test(async function testReadRequestError(): Promise<void> { } else if (test.err) { assert(err instanceof (test.err as typeof UnexpectedEOFError)); } else { + assert(req instanceof ServerRequest); + assert(test.headers != null); assertEquals(err, undefined); assertNotEquals(req, Deno.EOF); - for (const h of test.headers!) { - assertEquals((req! as ServerRequest).headers.get(h.key), h.value); + for (const h of test.headers) { + assertEquals(req.headers.get(h.key), h.value); } } } |