跳到主要内容

传输层与字节流

Client 默认持有 HTTPTransport。传入 transport= 可以替换传输实现, 此时默认传输配置不再生效。TLS、代理、协议和连接池限制应在注入的 HTTPTransport 上配置。

HTTPTransport​

def __init__(
out self, *,
verify: Bool = True,
ca_file: Optional[String] = None,
proxy: Optional[String] = None,
trust_env: Bool = False,
limits: Limits = Limits(),
http1: Bool = True,
http2: Bool = False,
) raises HTTPError

def handle_request(
mut self, request: Request, timeout: Timeout = Timeout()
) raises HTTPError -> Response
def close(mut self)
def is_closed(self) -> Bool

协议选择见 HTTP/2,路由配置见代理。 显式关闭传输层会取消活动流;销毁持有者时,响应独立保留的连接池仍然有效。

MockTransport​

通过处理函数生成确定的响应,无需启动服务:

import req


def handle(request: req.Request) raises req.HTTPError -> req.Response:
return req.Response(
200, request=request, content=req.encode_utf8("offline"),
)


def main() raises:
var owner = req.Client(transport=req.MockTransport(handle))
with owner.context() as client:
var response = client.get("https://example.com")
print(response.text())

处理函数接收准备好的 Request,Client 仍负责钩子、Cookie、重定向和响应缓冲。

BaseTransport 与 Transport​

自定义类型实现公开的 BaseTransport trait:

def handle_request(
mut self, request: Request, timeout: Timeout
) raises HTTPError -> Response
def close(mut self)

通过 Transport(value) 包装,也可以利用隐式构造器直接传入需要 Transport 的位置。 副本共享状态和关闭操作。包装层校验请求,并给 HTTPError 补充方法与 URL 上下文。 重复关闭安全。

SyncByteStream 与 ByteStream​

自定义响应流实现 SyncByteStream:

def read_chunk(mut self, max_bytes: Int) raises HTTPError -> Optional[Bytes]
def read_raw_chunk(mut self, max_bytes: Int) raises HTTPError -> Optional[Bytes]
def close(mut self)

EOF 时返回 None,每次返回的字节数不超过 max_bytes。 默认 read_raw_chunk 调用 read_chunk;编码前后字节不同的实现应覆盖它。 先用 ByteStream(source) 包装,再创建响应:

Response.from_byte_stream(
var source: ByteStream,
request: Request,
*,
status_code: Int = 200,
headers: Headers = Headers(),
http_version: String = "HTTP/1.1",
) raises HTTPError -> Response

ByteStream 副本共享消费与关闭状态,EOF 和错误都会关闭底层流。 自定义流自行定义解码语义。