diff --git a/http/server.ts b/http/server.ts index 54ec397d3e2f..2b5fffc814d1 100644 --- a/http/server.ts +++ b/http/server.ts @@ -104,6 +104,7 @@ export class ServerRequest { protoMinor!: number; protoMajor!: number; headers!: Headers; + conn!: Conn; r!: BufReader; w!: BufWriter; done: Deferred = deferred(); @@ -283,6 +284,7 @@ export function parseHTTPVersion(vers: string): [number, number] { } export async function readRequest( + conn: Conn, bufr: BufReader ): Promise { const tp = new TextProtoReader(bufr); @@ -292,6 +294,7 @@ export async function readRequest( if (headers === Deno.EOF) throw new UnexpectedEOFError(); const req = new ServerRequest(); + req.conn = conn; req.r = bufr; [req.method, req.url, req.proto] = firstLine.split(" ", 3); [req.protoMinor, req.protoMajor] = parseHTTPVersion(req.proto); @@ -321,7 +324,7 @@ export class Server implements AsyncIterable { while (!this.closing) { try { - req = await readRequest(bufr); + req = await readRequest(conn, bufr); } catch (e) { err = e; break; diff --git a/http/server_test.ts b/http/server_test.ts index 9768ccdf4b2f..f16293f77b6a 100644 --- a/http/server_test.ts +++ b/http/server_test.ts @@ -74,6 +74,21 @@ test(async function responseWrite(): Promise { const request = new ServerRequest(); request.w = bufw; + request.conn = { + localAddr: "", + remoteAddr: "", + rid: -1, + closeRead: (): void => {}, + closeWrite: (): void => {}, + read: async (): Promise => { + return 0; + }, + write: async (): Promise => { + return -1; + }, + close: (): void => {} + }; + await request.respond(testCase.response); assertEquals(buf.toString(), testCase.raw); await request.done; @@ -318,6 +333,21 @@ test(async function writeStringReaderResponse(): Promise { assertEquals(r.more, false); }); +const mockConn = { + localAddr: "", + remoteAddr: "", + rid: -1, + closeRead: (): void => {}, + closeWrite: (): void => {}, + read: async (): Promise => { + return 0; + }, + write: async (): Promise => { + return -1; + }, + close: (): void => {} +}; + test(async function readRequestError(): Promise { let input = `GET / HTTP/1.1 malformedHeader @@ -325,7 +355,7 @@ malformedHeader const reader = new BufReader(new StringReader(input)); let err; try { - await readRequest(reader); + await readRequest(mockConn, reader); } catch (e) { err = e; } @@ -404,7 +434,7 @@ test(async function testReadRequestError(): Promise { // eslint-disable-next-line @typescript-eslint/no-explicit-any let req: any; try { - req = await readRequest(reader); + req = await readRequest(mockConn, reader); } catch (e) { err = e; }