summaryrefslogtreecommitdiff
path: root/std/http
diff options
context:
space:
mode:
Diffstat (limited to 'std/http')
-rw-r--r--std/http/cookie.ts14
-rw-r--r--std/http/cookie_test.ts2
-rwxr-xr-xstd/http/file_server.ts6
-rw-r--r--std/http/file_server_test.ts20
-rw-r--r--std/http/racing_server_test.ts5
-rw-r--r--std/http/server.ts30
-rw-r--r--std/http/server_test.ts9
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);
}
}
}