最小化 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 级别处理。