-
- Notifications
You must be signed in to change notification settings - Fork 33.7k
Closed
Labels
async_local_storageAsyncLocalStorageAsyncLocalStoragehttp2Issues or PRs related to the http2 subsystem.Issues or PRs related to the http2 subsystem.
Description
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
Metadata
Metadata
Assignees
Labels
async_local_storageAsyncLocalStorageAsyncLocalStoragehttp2Issues or PRs related to the http2 subsystem.Issues or PRs related to the http2 subsystem.