doc: warn against concurrent http2stream.respondWithFD
Upcoming changes to move away from synchronous I/O on the main thread will imply that using the same file descriptor to respond on multiple HTTP/2 streams at the same time is invalid, because at least on Windows `uv_fs_read()` is race-y. Therefore, warn against such usage. PR-URL: https://github.com/nodejs/node/pull/18762 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
parent
755d805bf4
commit
cbe6d5c519
@ -1257,10 +1257,10 @@ automatically.
|
||||
const http2 = require('http2');
|
||||
const fs = require('fs');
|
||||
|
||||
const fd = fs.openSync('/some/file', 'r');
|
||||
|
||||
const server = http2.createServer();
|
||||
server.on('stream', (stream) => {
|
||||
const fd = fs.openSync('/some/file', 'r');
|
||||
|
||||
const stat = fs.fstatSync(fd);
|
||||
const headers = {
|
||||
'content-length': stat.size,
|
||||
@ -1268,8 +1268,8 @@ server.on('stream', (stream) => {
|
||||
'content-type': 'text/plain'
|
||||
};
|
||||
stream.respondWithFD(fd, headers);
|
||||
stream.on('close', () => fs.closeSync(fd));
|
||||
});
|
||||
server.on('close', () => fs.closeSync(fd));
|
||||
```
|
||||
|
||||
The optional `options.statCheck` function may be specified to give user code
|
||||
@ -1282,6 +1282,12 @@ The `offset` and `length` options may be used to limit the response to a
|
||||
specific range subset. This can be used, for instance, to support HTTP Range
|
||||
requests.
|
||||
|
||||
The file descriptor is not closed when the stream is closed, so it will need
|
||||
to be closed manually once it is no longer needed.
|
||||
Note that using the same file descriptor concurrently for multiple streams
|
||||
is not supported and may result in data loss. Re-using a file descriptor
|
||||
after a stream has finished is supported.
|
||||
|
||||
When set, the `options.getTrailers()` function is called immediately after
|
||||
queuing the last chunk of payload data to be sent. The callback is passed a
|
||||
single object (with a `null` prototype) that the listener may use to specify
|
||||
@ -1291,10 +1297,10 @@ the trailing header fields to send to the peer.
|
||||
const http2 = require('http2');
|
||||
const fs = require('fs');
|
||||
|
||||
const fd = fs.openSync('/some/file', 'r');
|
||||
|
||||
const server = http2.createServer();
|
||||
server.on('stream', (stream) => {
|
||||
const fd = fs.openSync('/some/file', 'r');
|
||||
|
||||
const stat = fs.fstatSync(fd);
|
||||
const headers = {
|
||||
'content-length': stat.size,
|
||||
@ -1306,8 +1312,9 @@ server.on('stream', (stream) => {
|
||||
trailers.ABC = 'some value to send';
|
||||
}
|
||||
});
|
||||
|
||||
stream.on('close', () => fs.closeSync(fd));
|
||||
});
|
||||
server.on('close', () => fs.closeSync(fd));
|
||||
```
|
||||
|
||||
The HTTP/1 specification forbids trailers from containing HTTP/2 pseudo-header
|
||||
|
Loading…
x
Reference in New Issue
Block a user