1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-01-23 15:39:49 -05:00
denoland-deno/std/http/racing_server_test.ts
Yusuke Sakurai 22f88b9f37
fix: [http] Consume unread body and trailers before reading next request (#3990)
- Added `ServerRequest.finalize()`:  consuming all unread body stream and trailers.
  - This is cleanup method for reading next request from same keep-alive connection.
  - Needed when handler didn't consume all body and trailers even after responding.
- refactor: `ServerRequest._bodyStream()`, `ServerRequestBody` are removed.
  - Now using `bodyReader()` and `chunkedBodyReader()` instead.
- fix: Trailers should only be read `transfer-encoding` is `chunked` and `trailer` header is set and its value is valid.
- fix: use `Headers.append()` on reading trailers.
- fix: delete `trailer` field from headers after reading trailers.
- reorg: Several functions related to IO are moved into `http/io.ts`
2020-02-24 22:49:39 -05:00

77 lines
2 KiB
TypeScript

const { connect, run } = Deno;
import { assert, assertEquals } from "../testing/asserts.ts";
import { BufReader, BufWriter } from "../io/bufio.ts";
import { TextProtoReader } from "../textproto/mod.ts";
let server: Deno.Process;
async function startServer(): Promise<void> {
server = run({
args: [Deno.execPath(), "run", "-A", "http/racing_server.ts"],
stdout: "piped"
});
// Once racing server is ready it will write to its 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();
}
const input = [
"GET / HTTP/1.1\r\n\r\n",
"GET / HTTP/1.1\r\n\r\n",
"GET / HTTP/1.1\r\n\r\n",
"POST / HTTP/1.1\r\ncontent-length: 4\r\n\r\ndeno",
"POST / HTTP/1.1\r\ntransfer-encoding: chunked\r\n\r\n4\r\ndeno\r\n0\r\n\r\n",
"POST / HTTP/1.1\r\ntransfer-encoding: chunked\r\ntrailer: deno\r\n\r\n4\r\ndeno\r\n0\r\n\r\ndeno: land\r\n\r\n",
"GET / HTTP/1.1\r\n\r\n"
].join("");
const HUGE_BODY_SIZE = 1024 * 1024;
const output = `HTTP/1.1 200 OK
content-length: 6
Step1
HTTP/1.1 200 OK
content-length: ${HUGE_BODY_SIZE}
${"a".repeat(HUGE_BODY_SIZE)}HTTP/1.1 200 OK
content-length: ${HUGE_BODY_SIZE}
${"b".repeat(HUGE_BODY_SIZE)}HTTP/1.1 200 OK
content-length: 6
Step4
HTTP/1.1 200 OK
content-length: 6
Step5
HTTP/1.1 200 OK
content-length: 6
Step6
HTTP/1.1 200 OK
content-length: 6
Step7
`;
Deno.test(async function serverPipelineRace(): Promise<void> {
await startServer();
const conn = await connect({ port: 4501 });
const r = new TextProtoReader(new BufReader(conn));
const w = new BufWriter(conn);
await w.write(new TextEncoder().encode(input));
await w.flush();
const outLines = output.split("\n");
// length - 1 to disregard last empty line
for (let i = 0; i < outLines.length - 1; i++) {
const s = await r.readLine();
assertEquals(s, outLines[i]);
}
killServer();
});