菜单

HTTP 客户端和 Fetch API

相关源文件

本文档涵盖了 Bun 的 HTTP 客户端实现和 Web 标准 Fetch API。这包括核心 HTTP 客户端引擎、JavaScript Fetch API 绑定、请求/响应处理以及网络层集成。

有关 HTTP 服务器功能,请参阅 服务器 API (Bun.serve)。有关更底层的套接字 API,请参阅 套接字 API 和网络协议

架构概述

Bun 的 HTTP 客户端构建在一个多层架构上,该架构同时提供了低级 HTTP 客户端功能和高级 Web 标准 Fetch API 兼容性。

来源: src/http.zig1-60 src/bun.js/webcore/streams.zig1-50 src/deps/uws.zig1-30

核心 HTTP 客户端实现

HTTPClient 结构体是 HTTP 客户端的核心,它管理着从发起请求到完成响应的完整 HTTP 请求生命周期。

HTTPClient 结构

来源: src/http.zig115-146 src/http.zig148-219 src/http.zig221-267

请求处理管道

HTTP 客户端遵循从发起直到完成的结构化请求处理流程。

来源: src/http.zig400-500 src/http.zig1500-1600

Fetch API 实现

Bun 实现的 Web 标准 Fetch API 具有全面的现代 HTTP 客户端功能支持。

Fetch API 特性

功能实现代码参考
基本的 fetch()HTTPClient 集成src/http.zig400-450
请求对象WebCore 请求绑定src/bun.js/api/server.zig20-25
响应对象WebCore 响应绑定src/bun.js/api/server.zig20-25
Headers 操作FetchHeaders 实现src/http.zig35
AbortSignal基于信号的取消test/js/web/fetch/fetch.test.ts190-335
流式响应体ReadableStream 集成src/bun.js/webcore/streams.zig195-592
Data URLs内置数据 URL 解析器test/js/web/fetch/fetch.test.ts57-188

请求体处理

HTTP 客户端通过 HTTPRequestBody 联合体支持多种请求体类型。

来源: src/http.zig115-146 src/http.zig148-219

网络和连接管理

连接上下文

Bun 使用 µWebSockets 作为底层网络层,并为 HTTP 和 HTTPS 提供专门的上下文。

来源: src/http.zig40-55 src/deps/uws.zig1-150

SSL/TLS 支持

HTTPS 连接通过 BoringSSL 集成进行处理,并具有全面的证书验证功能。

  • 证书链验证
  • 主机名验证
  • 自定义 CA 证书支持
  • SNI (服务器名称指示)
  • 客户端证书身份验证

来源: src/bun.js/api/bun/socket.zig23-100 src/http.zig30-35

代理支持

客户端包括通过 ProxyTunnel 实现的全面代理支持。

  • HTTP 代理隧道
  • HTTPS 代理隧道
  • SOCKS 代理支持
  • 代理身份验证
  • 代理连接上的 SSL

来源: src/http.zig221-427

流式传输和压缩

响应流式传输

响应体通过 Bun 的流式传输基础设施进行处理。

来源: src/bun.js/webcore/streams.zig195-592 src/http.zig22-25

内容编码

客户端根据 Content-Encoding 头部自动处理响应解压缩,并支持:

  • gzip:通过 zlib 实现的标准 gzip 压缩
  • deflate:Deflate 压缩
  • br:Brotli 压缩
  • zstd:Zstandard 压缩(Bun 扩展)

来源: src/http.zig22-25

错误处理和超时

请求生命周期管理

HTTP 客户端提供了全面的错误处理和超时管理

  • 连接超时
  • 请求超时
  • 响应超时
  • SSL/TLS 错误
  • 网络错误
  • 重定向限制
  • AbortSignal 取消

信号集成

请求可以使用 Web 标准的 AbortSignal API 进行取消,该 API 与 Bun 的事件循环集成以实现高效取消

来源: src/http.zig71-101 test/js/web/fetch/fetch.test.ts190-335