From 7416028f994009eb71e52e76275e8c7275c11f51 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Mon, 6 Jul 2020 12:27:57 -0700 Subject: [PATCH] doc: specify encoding in text/html examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: https://github.com/nodejs/node/issues/29739 PR-URL: https://github.com/nodejs/node/pull/34222 Reviewed-By: Anna Henningsen Reviewed-By: Tobias Nießen --- doc/api/http2.md | 50 ++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/doc/api/http2.md b/doc/api/http2.md index e7f6c3293423a5..48aa027992291e 100644 --- a/doc/api/http2.md +++ b/doc/api/http2.md @@ -51,7 +51,7 @@ server.on('error', (err) => console.error(err)); server.on('stream', (stream, headers) => { // stream is a Duplex stream.respond({ - 'content-type': 'text/html', + 'content-type': 'text/html; charset=utf-8', ':status': 200 }); stream.end('

Hello World

'); @@ -271,7 +271,7 @@ session.on('stream', (stream, headers, flags) => { // ... stream.respond({ ':status': 200, - 'content-type': 'text/plain' + 'content-type': 'text/plain; charset=utf-8' }); stream.write('hello '); stream.end('world'); @@ -291,7 +291,7 @@ const server = http2.createServer(); server.on('stream', (stream, headers) => { stream.respond({ - 'content-type': 'text/html', + 'content-type': 'text/html; charset=utf-8', ':status': 200 }); stream.on('error', (error) => console.error(error)); @@ -889,6 +889,18 @@ All `Http2Stream` instances are [`Duplex`][] streams. The `Writable` side of the `Duplex` is used to send data to the connected peer, while the `Readable` side is used to receive data sent by the connected peer. +The default text character encoding for all `Http2Stream`s is UTF-8. As a best +practice, it is recommended that when using an `Http2Stream` to send text, +the `'content-type'` header should be set and should identify the character +encoding used. + +```js +stream.respond({ + 'content-type': 'text/html; charset=utf-8', + ':status': 200 +}); +``` + #### `Http2Stream` Lifecycle ##### Creation @@ -1509,7 +1521,7 @@ server.on('stream', (stream) => { const headers = { 'content-length': stat.size, 'last-modified': stat.mtime.toUTCString(), - 'content-type': 'text/plain' + 'content-type': 'text/plain; charset=utf-8' }; stream.respondWithFD(fd, headers); stream.on('close', () => fs.closeSync(fd)); @@ -1554,7 +1566,7 @@ server.on('stream', (stream) => { const headers = { 'content-length': stat.size, 'last-modified': stat.mtime.toUTCString(), - 'content-type': 'text/plain' + 'content-type': 'text/plain; charset=utf-8' }; stream.respondWithFD(fd, headers, { waitForTrailers: true }); stream.on('wantTrailers', () => { @@ -1624,7 +1636,7 @@ server.on('stream', (stream) => { } stream.respondWithFile('/some/file', - { 'content-type': 'text/plain' }, + { 'content-type': 'text/plain; charset=utf-8' }, { statCheck, onError }); }); ``` @@ -1644,7 +1656,7 @@ server.on('stream', (stream) => { return false; // Cancel the send operation } stream.respondWithFile('/some/file', - { 'content-type': 'text/plain' }, + { 'content-type': 'text/plain; charset=utf-8' }, { statCheck }); }); ``` @@ -1674,7 +1686,7 @@ const http2 = require('http2'); const server = http2.createServer(); server.on('stream', (stream) => { stream.respondWithFile('/some/file', - { 'content-type': 'text/plain' }, + { 'content-type': 'text/plain; charset=utf-8' }, { waitForTrailers: true }); stream.on('wantTrailers', () => { stream.sendTrailers({ ABC: 'some value to send' }); @@ -1766,7 +1778,7 @@ server.on('stream', (stream, headers, flags) => { // ... stream.respond({ [HTTP2_HEADER_STATUS]: 200, - [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain' + [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain; charset=utf-8' }); stream.write('hello '); stream.end('world'); @@ -1929,7 +1941,7 @@ server.on('stream', (stream, headers, flags) => { // ... stream.respond({ [HTTP2_HEADER_STATUS]: 200, - [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain' + [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain; charset=utf-8' }); stream.write('hello '); stream.end('world'); @@ -2138,7 +2150,7 @@ const server = http2.createServer(); server.on('stream', (stream, headers) => { stream.respond({ - 'content-type': 'text/html', + 'content-type': 'text/html; charset=utf-8', ':status': 200 }); stream.end('

Hello World

'); @@ -2264,7 +2276,7 @@ const server = http2.createSecureServer(options); server.on('stream', (stream, headers) => { stream.respond({ - 'content-type': 'text/html', + 'content-type': 'text/html; charset=utf-8', ':status': 200 }); stream.end('

Hello World

'); @@ -2725,7 +2737,7 @@ const http2 = require('http2'); const server = http2.createServer((req, res) => { res.setHeader('Content-Type', 'text/html'); res.setHeader('X-Foo', 'bar'); - res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('ok'); }); ``` @@ -3310,7 +3322,7 @@ in the to-be-sent headers, its value will be replaced. Use an array of strings here to send multiple headers with the same name. ```js -response.setHeader('Content-Type', 'text/html'); +response.setHeader('Content-Type', 'text/html; charset=utf-8'); ``` or @@ -3329,9 +3341,9 @@ to [`response.writeHead()`][] given precedence. ```js // Returns content-type = text/plain const server = http2.createServer((req, res) => { - res.setHeader('Content-Type', 'text/html'); + res.setHeader('Content-Type', 'text/html; charset=utf-8'); res.setHeader('X-Foo', 'bar'); - res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('ok'); }); ``` @@ -3513,7 +3525,7 @@ will be emitted. const body = 'hello world'; response.writeHead(200, { 'Content-Length': Buffer.byteLength(body), - 'Content-Type': 'text/plain' }); + 'Content-Type': 'text/plain; charset=utf-8' }); ``` `Content-Length` is given in bytes not characters. The @@ -3536,9 +3548,9 @@ to [`response.writeHead()`][] given precedence. ```js // Returns content-type = text/plain const server = http2.createServer((req, res) => { - res.setHeader('Content-Type', 'text/html'); + res.setHeader('Content-Type', 'text/html; charset=utf-8'); res.setHeader('X-Foo', 'bar'); - res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('ok'); }); ```