1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-24 08:09:08 -05:00

fix(http): Skip 0 chunks when writing body (denoland/deno_std#387)

Original: 79d5f556ba
This commit is contained in:
Jun Kato 2019-05-11 01:55:18 +09:00 committed by Ryan Dahl
parent 1b359f4106
commit 7cc80064f0
2 changed files with 68 additions and 3 deletions

View file

@ -1,5 +1,5 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
const { listen, toAsyncIterator, copy } = Deno;
const { listen, copy, toAsyncIterator } = Deno;
type Conn = Deno.Conn;
type Reader = Deno.Reader;
type Writer = Deno.Writer;
@ -79,6 +79,7 @@ async function writeChunkedBody(w: Writer, r: Reader): Promise<void> {
const encoder = new TextEncoder();
for await (const chunk of toAsyncIterator(r)) {
if (chunk.byteLength <= 0) continue;
const start = encoder.encode(`${chunk.byteLength.toString(16)}\r\n`);
const end = encoder.encode("\r\n");
await writer.write(start);

View file

@ -6,10 +6,11 @@
// https://github.com/golang/go/blob/master/src/net/http/responsewrite_test.go
const { Buffer } = Deno;
import { test } from "../testing/mod.ts";
import { test, runIfMain } from "../testing/mod.ts";
import { assertEquals } from "../testing/asserts.ts";
import { Response, ServerRequest } from "./server.ts";
import { Response, ServerRequest, writeResponse } from "./server.ts";
import { BufReader, BufWriter } from "../io/bufio.ts";
import { StringReader } from "../io/readers.ts";
interface ResponseTest {
response: Response;
@ -261,3 +262,66 @@ test(async function requestBodyStreamWithTransferEncoding(): Promise<void> {
}
}
});
test(async function writeUint8ArrayResponse(): Promise<void> {
const shortText = "Hello";
const body = new TextEncoder().encode(shortText);
const res: Response = { body };
const buf = new Deno.Buffer();
await writeResponse(buf, res);
const decoder = new TextDecoder("utf-8");
const reader = new BufReader(buf);
let line: Uint8Array;
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), "HTTP/1.1 200 OK");
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), `content-length: ${shortText.length}`);
line = (await reader.readLine())[0];
assertEquals(line.byteLength, 0);
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), shortText);
line = (await reader.readLine())[0];
assertEquals(line.byteLength, 0);
});
test(async function writeStringReaderResponse(): Promise<void> {
const shortText = "Hello";
const body = new StringReader(shortText);
const res: Response = { body };
const buf = new Deno.Buffer();
await writeResponse(buf, res);
const decoder = new TextDecoder("utf-8");
const reader = new BufReader(buf);
let line: Uint8Array;
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), "HTTP/1.1 200 OK");
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), "transfer-encoding: chunked");
line = (await reader.readLine())[0];
assertEquals(line.byteLength, 0);
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), shortText.length.toString());
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), shortText);
line = (await reader.readLine())[0];
assertEquals(decoder.decode(line), "0");
});
runIfMain(import.meta);