最小化 HTTP/3 客户端
🌐 Minimal HTTP/3 client
import { connect } from 'node:quic';
import process from 'node:process';
const session = await connect('example.com:443', {
// ALPN defaults to 'h3'.
servername: 'example.com',
});
await session.opened;
const stream = await session.createBidirectionalStream({
headers: {
':method': 'GET',
':path': '/',
':scheme': 'https',
':authority': 'example.com',
},
onheaders(headers) {
console.log('status:', headers[':status']);
},
});
const decoder = new TextDecoder();
for await (const chunks of stream) {
for (const chunk of chunks) {
process.stdout.write(decoder.decode(chunk, { stream: true }));
}
}
await session.close(); 需要注意的几点:
🌐 A few things to note:
session.createBidirectionalStream({ headers })会在未提供body时自动将 HEADERS 帧标记为终止 —— 请求是HEADERS,后跟END_STREAM。onheaders回调接收响应伪头和常规头,它们都在一个具有小写字符串键的对象中。回调返回后,通过stream.headers也可以访问同一个对象。- 读取
for await (const chunks of stream)会消耗响应体。每次迭代会产生一个Uint8Array[]的块批次。 - HTTP 语义辅助工具(URL 解析、方法/状态验证、重定向、内容协商等)故意没有内置。调用者负责除传输框架之外的任何 HTTP 级别处理。