node
node copied to clipboard
http2: Async resource store is not applied on 'response' event
Version
22.9.0
Platform
Linux my-server 6.10.11-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.10.11-1 (2024-09-22) x86_64 GNU/Linux
Subsystem
http2
What steps will reproduce the bug?
server.mjs:
import { createServer } from 'node:http2';
const server = createServer();
server.on('error', (err) => console.error(err));
server.on('stream', (stream, headers) => {
stream.respond({
'content-type': 'text/html; charset=utf-8',
':status': 200,
});
stream.end('<h1>Hello World</h1>');
});
server.listen(9443);
client.mjs:
import { connect } from 'node:http2';
import { AsyncLocalStorage } from 'async_hooks';
import { setTimeout as sleep } from 'timers/promises';
const asyncLocalStorage = new AsyncLocalStorage();
function log(message) {
const data = asyncLocalStorage?.getStore();
console.log(`${JSON.stringify(data)}: ${message}`);
}
const client = connect('http://localhost:9443');
async function doReq() {
await sleep(100); // <-- No sessions at all without this (??)
client.on('error', (err) => log(err.message));
log('sending request');
const req = client.request({ ':path': '/' });
req.on('response', (headers, flags) => {
log(`headers: ${JSON.stringify(headers)}`); // <--- No session here :(
});
req.setEncoding('utf8');
let data = '';
req.on('data', (chunk) => {
log(`chunk: ${chunk}`); // Works
data += chunk;
});
req.on('error', (err) => log(`Error: ${err.message}`));
req.on('end', () => {
log(data); // Works
client.close();
});
req.end();
}
asyncLocalStorage.run({ session: 1 }, doReq);
asyncLocalStorage.run({ session: 2 }, doReq);
Output:
{"session":1}: sending request
{"session":2}: sending request
undefined: headers: {":status":200,"content-type":"text/html; charset=utf-8","date":"Sun, 13 Oct 2024 15:26:19 GMT"}
undefined: headers: {":status":200,"content-type":"text/html; charset=utf-8","date":"Sun, 13 Oct 2024 15:26:19 GMT"}
{"session":1}: chunk: <h1>Hello World</h1>
{"session":1}: <h1>Hello World</h1>
{"session":2}: chunk: <h1>Hello World</h1>
{"session":2}: <h1>Hello World</h1>
How often does it reproduce? Is there a required condition?
Every time
What is the expected behavior? Why is that the expected behavior?
The async store should be applied also on response
What do you see instead?
It's not.
Additional information
No response