跳转到主要内容

一个最小化的底层HTTP客户端。

项目描述

HTTP Core

Test Suite Package version

做好一件事,做到最好。

HTTP Core包提供了一个最小化的底层HTTP客户端,只做一件事:发送HTTP请求。

它不提供任何高级API模型抽象,不处理重定向、多部分上传、构建身份验证头、透明HTTP缓存、URL解析、会话Cookie处理、内容或字符集解码、处理JSON、基于环境的默认配置或任何那种爵士乐。

HTTP Core能做什么

  • 发送HTTP请求。
  • 线程安全/任务安全连接池。
  • 支持HTTP(S)代理和SOCKS代理。
  • 支持HTTP/1.1和HTTP/2。
  • 提供同步和异步接口。
  • asynciotrio提供异步后端支持。

需求

Python 3.8+

安装

仅支持HTTP/1.1时,使用以下命令安装

$ pip install httpcore

还有一些可选的额外功能...

$ pip install httpcore['asyncio,trio,http2,socks']

发送请求

发送HTTP请求

import httpcore

response = httpcore.request("GET", "https://www.example.com/")

print(response)
# <Response [200]>
print(response.status)
# 200
print(response.headers)
# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...]
print(response.content)
# b'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>\n\n<meta charset="utf-8"/>\n ...'

提供的顶层httpcore.request()函数用于方便起见。在实际操作中,只要您在使用httpcore,您就会想要使用它提供的连接池功能。

import httpcore

http = httpcore.ConnectionPool()
response = http.request("GET", "https://www.example.com/")

准备好开始后,请查看文档

动机

你可能不想直接使用 HTTP Core。如果你正在编写像 Python 中的代理服务这样的东西,并且只想在最底层使用某些功能,这可能是有意义的,但更典型的情况是,你将想要使用更高级的客户端库,例如 httpx

httpcore 的动机是

  • 提供可重用的低级客户端库,其他包可以在此基础上构建。
  • 提供一个 非常清晰的接口分割,在网络代码和客户端逻辑之间,以便单独理解和推理每个部分。

依赖项

httpcore 包有以下依赖项...

  • h11
  • certifi

以及以下可选的额外内容...

  • anyio - 由 pip install httpcore['asyncio'] 需要。
  • trio - 由 pip install httpcore['trio'] 需要。
  • h2 - 由 pip install httpcore['http2'] 需要。
  • socksio - 由 pip install httpcore['socks'] 需要。

版本控制

我们使用 SEMVER 作为我们的版本控制策略

有关包版本之间的更改,请参阅我们的 项目变更日志

我们建议将要求锁定为最新的主要版本,或更具体的版本范围。

pip install 'httpcore==1.*'

变更日志

此项目中所有显著的更改都将在此文件中记录。

格式基于 Keep a Changelog

版本 1.0.6(2024 年 10 月 1 日)

  • 放宽 trio 依赖项锁定。 (#956)
  • 处理 trio 在不支持的平台抛出 NotImplementedError。 (#955)
  • 处理将 ssl.SSLError 映射到 httpcore.ConnectError。 (#918)

1.0.5(2024 年 3 月 27 日)

  • 处理 anyio 后端中的 EndOfStream 异常。 (#899)
  • 允许在包依赖中使用 trio 0.25.* 系列。 (#903)

1.0.4(2024 年 2 月 21 日)

  • 添加 target 请求扩展。 (#888)
  • 修复当流中有一些数据被读取时的连接 UpgradeCONNECT 支持问题。 (#882)

1.0.3(2024 年 2 月 13 日)

  • 修复异步取消支持。 (#880)
  • 修复与 socks 代理一起使用时的跟踪扩展。 (#849)
  • 修复使用 "wss" 方案的连接的 SSL 上下文。 (#869)

1.0.2(2023 年 11 月 10 日)

  • 修复 Event.wait 函数中的 float("inf") 超时。 (#846)

1.0.1(2023 年 11 月 3 日)

  • 修复池超时,以计算重试所花费的总时间。 (#823)
  • 当正确的异步依赖项未安装时,引发更整洁的 RuntimeError。 (#826)
  • 添加对同步 TLS-in-TLS 流的支持。 (#840)

1.0.0(2023 年 10 月 6 日)

从版本 1.0 开始,我们的异步支持现在是可选的,因为默认情况下包的依赖项最少。

对于异步支持,请使用 pip install 'httpcore[asyncio]'pip install 'httpcore[trio]'

项目版本控制策略现在由 SEMVER 明确管理。请参阅 https://semver.org/

  • 异步支持成为完全可选。 (#809)
  • 添加对 Python 3.12 的支持。 (#807)

0.18.0(2023 年 9 月 8 日)

  • 添加对 HTTPS 代理的支持。 (#745, #786)
  • 放弃对 Python 3.7 的支持。 (#727)
  • 处理 SOCKS 代理中的 sni_hostname 扩展。 (#774)
  • 优雅地处理 HTTP/1.1 半关闭连接。 (#641)
  • Extensions 的类型从 Mapping[Str, Any] 更改为 MutableMapping[Str, Any]。 (#762)

0.17.3(2023 年 7 月 5 日)

  • 支持异步取消,确保在取消发生时连接池保持干净状态。 (#726)
  • 网络后端接口已被添加到公共 API 中。一些以前是私有实现细节的类现在是顶级公共 API 的一部分。 (#699)
  • 优雅处理HTTP/2 GoAway帧,请求将在新的连接上透明地重试。(#730)
  • 当同步trace回调传递给异步请求或异步trace回调传递给同步请求时添加异常。(#717)
  • 放弃对 Python 3.7 的支持。 (#727)

0.17.2(2023年5月23日)

  • socket_options参数添加到ConnectionPoolHTTProxy类。(#668)
  • 使用每个模块的日志器名称改进日志记录。(#690)
  • 添加sni_hostname请求扩展。(#696)
  • 解决导入anyio包时的竞态条件。(#692)
  • 对所有同步套接字启用TCP_NODELAY。(#651)

0.17.1(2023年5月17日)

  • 如果设置“重试”,则在SSL握手错误发生时允许重试。(#669)
  • 通过正确链式抛出异常,提高网络异常时的回溯正确性。(#678)
  • 防止HTTP/2连接由服务器发送的'GoAway'帧关闭时的连接挂起行为。(#679)
  • 修复从连接池中删除请求时的边缘情况异常。(#680)
  • 修复池超时边缘情况。(#688)

0.17.0(2023年3月16日)

  • 添加DEBUG级别日志。(#648)
  • 当服务器通过设置更新发送时,尊重HTTP/2最大并发流。(#652)
  • 将允许的HTTP头部大小增加到100kB。(#647)
  • retries选项添加到SOCKS代理类。(#643)

0.16.3(2022年12月20日)

  • 允许wswss方案。允许我们正确支持WebSocket升级连接。(#625)
  • 转发HTTP代理使用每个远程主机的连接。某些代理实现所必需。(#637)
  • 在Windows上尝试使用UNIX域套接字时不抛出RuntimeError。删除了使用取消时的一些错误情况。(#631)
  • 延迟导入anyio,使其不再是一个硬依赖项,并且如果未使用则不会导入。(#639)

0.16.2(2022年11月25日)

  • 撤销“修复异步取消行为”,该行为引入了竞态条件。(#627)
  • 如果在Windows上尝试使用UNIX域套接字,则抛出RuntimeError。(#619)

0.16.1(2022年11月17日)

  • 修复HTTP/1.1临时信息响应,例如“100 Continue”。(#605)

0.16.0(2022年10月11日)

  • 支持HTTP/1.1信息响应。(#581)
  • 修复异步取消行为。(#580)
  • 支持h11 0.14。(#579)

0.15.0(2022年5月17日)

  • 停止支持Python 3.6。(#535)
  • 确保HTTP代理CONNECT请求包含timeout配置。(#506)
  • 将类型提示切换到显式的typing.Optional。(#513)
  • 对于trio,将OSError异常映射到ConnectError。(#543)

0.14.7(2022年2月4日)

  • 需要从池队列中删除引发PoolTimeout的请求。(#502)
  • 修复当Socks5Connection终止时发生的AttributeError。(#501)

0.14.6(2022年2月1日)

  • 修复对http:// URL的SOCKS支持。(#492)
  • 解决在流式传输响应期间异常周围的竞态条件。(#491)

0.14.5(2022年1月18日)

  • 支持SOCKS代理。(#478)
  • 将proxy_auth参数添加到HTTPProxy。(#481)
  • 在服务器在不发送响应的情况下断开连接时,改进“RemoteProtocolError”异常的错误消息。(#479)

0.14.4(2022年1月5日)

  • 在HTTPS隧道代理上支持HTTP/2。(#468)
  • 修复HTTP转发上丢失代理头的问题。(#456)
  • 如果需要,仅实例化SSL上下文。(#457)
  • 更稳健的HTTP/2处理。(#253、#439、#440、#441)

0.14.3(2021年11月17日)

  • 修复从池中删除已关闭连接时的竞态条件。(#437)

0.14.2(2021年11月16日)

  • 失败的连接不再保留在池中。(拉取请求#433)

0.14.1(2021年11月12日)

  • max_connections 现在是可选的。(拉取请求 #429)
  • certifi 现在包含在安装依赖中。(拉取请求 #428)
  • h2 现在是严格可选的。(拉取请求 #428)

0.14.0(2021年11月11日)

0.14 版本是对 httpcore 的全面重写,全面解决了连接池中的一些基本问题,并大幅重新设计 API 以提高用户友好性。

一些底层的 API 设计还使得组件可以更轻松地在隔离情况下进行测试,现在该包拥有 100% 的测试覆盖率。

有关更多背景信息,请参阅 讨论 #419

其中还有一些其他有趣的功能,例如“trace”扩展,该扩展可以提供钩子来检查请求/响应周期中发生的内部事件。此扩展对于 HTTPX 命令行界面是必需的,以便...

  • 记录连接建立的时间和建立的 IP/端口。
  • 确定出站请求是否应记录为 HTTP/1.1 或 HTTP/2,而不是在传递 --http2 标志时假设它是 HTTP/2(这实际上可能并不正确)。
  • 记录 SSL 版本信息和证书信息。

请注意,0.14.0 中目前不支持 curio。如果您使用 httpcorecurio,请与我们联系,以便我们评估是否应该将其作为功能优先考虑。

0.13.7(2021年9月13日)

  • 修复了当 URL 方案缺失或使用了非 HTTP(S) 方案时错误信息显示错误的 bug。(拉取请求 #403)

0.13.6(2021年6月15日)

已修复

  • 当发生读写超时时关闭套接字。(拉取请求 #365)

0.13.5(2021年6月14日)

已修复

  • 解决了 AnyIO EOF 行为的麻烦。(拉取请求 #358, #362)

0.13.4(2021年6月9日)

新增

  • 当 URL 方案缺失或使用了非 HTTP(S) 方案时,改进了错误信息的显示。(拉取请求 #354)

已修复

  • 在运行 asyncio 时切换到 anyio 作为默认的后端实现。解决了某些 TLS 超时问题。(拉取请求 #1511)

0.13.3(2021年5月6日)

新增

  • 支持使用 httpcore.SyncConnectionPool(http1=False) 进行 HTTP/2 先知。(拉取请求 #333)

已修复

  • 处理环境不提供 select.poll 支持的情况。(拉取请求 #331)

0.13.2(2021年4月29日)

新增

  • 改进了在服务器断开连接且未发送响应时特定情况下的 RemoteProtocolError 错误信息。(拉取请求 #313)

0.13.1(2021年4月28日)

已修复

  • 对关闭连接进行了更健壮的测试。(拉取请求 #311)
  • 在非优雅的连接关闭时不抛出异常。(拉取请求 #310)

0.13.0(2021年4月21日)

0.13 版本更新了核心 API,以匹配从 HTTPX 0.18 以后引入的 HTTPX 传输 API。

使用新接口进行请求的示例:

with httpcore.SyncConnectionPool() as http:
    status_code, headers, stream, extensions = http.handle_request(
        method=b'GET',
        url=(b'https', b'example.org', 443, b'/'),
        headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')]
        stream=httpcore.ByteStream(b''),
        extensions={}
    )
    body = stream.read()
    print(status_code, body)

变更

  • .request() 方法现在为 handle_request()。(拉取请求 #296)
  • .arequest() 方法现在为 .handle_async_request()。(拉取请求 #296)
  • headers 参数不再是可选的。(拉取请求 #296)
  • stream 参数不再是可选的。(拉取请求 #296)
  • ext 参数现在命名为 extensions,且不再是可选的。(拉取请求 #296)
  • "reason" 扩展关键字现在命名为 "reason_phrase"。(拉取请求 #296)
  • "reason_phrase""http_version" 扩展现在使用字节字符串作为它们的值。(拉取请求 #296)
  • httpcore.PlainByteStream() 类变为 httpcore.ByteStream()。(拉取请求 #296)

新增

  • 流现在支持 .read() 接口。(拉取请求 #296)

已修复

  • 任务取消不再泄漏连接池中的连接。(拉取请求 #305)

0.12.3(2020年12月7日)

已修复

  • 在使用 asyncio 时,关闭 SSL 连接而不是等待远程 EOF。(拉取请求 #167)
  • 修复了使用 anyio 后端时连接超时引发的异常。(拉取请求 #236)
  • 修复了 HTTP/2 中 :authorityHost 标头的优先级问题。(拉取请求 #241, #243)
  • 处理使用 asyncio 检测套接字可读性时的额外边缘情况。(Pull #242,#244)
  • 修复使用代理隧道时 asyncio SSL 警告。(Pull #249)

0.12.2(2020年11月20日)

已修复

  • 在 asyncio 后端中正确封装连接错误。(Pull #235)
  • 修复在多线程环境中使用 HTTP/1.1 同步客户端时在 Python 3.9 上出现的 ImportError。(Pull #237)

0.12.1(2020年11月7日)

新增

  • 添加连接重试。(Pull #221)

已修复

  • 调整对已丢失连接的检测,解决了 Linux 上打开文件限制的问题。(Pull #185)
  • 避免在建立到代理的 HTTP 隧道失败时泄漏连接。(Pull #223)
  • 使用 trio 时正确封装操作系统错误。(Pull #225)

0.12.0(2020年10月6日)

变更

  • HTTP 头部的大小写现在得到保留,而不是始终发送为小写。(#216 和 python-hyper/h11#104)

新增

  • 将 Python 3.9 添加到官方支持版本。

已修复

  • 当连接处于暂停读取状态时,优雅地处理 stdlib asyncio 的错误。(#201)

0.11.1(2020年9月28日)

已修复

  • 添加异步信号量 release() 协程的 await。(#197)
  • 删除错误的 curio 分类器。(#192)

0.11.0(2020年9月22日)

0.11.0 的 Transport API 有几个重大变化。

首先,我们改变了请求接口,以便允许扩展,这将使我们能够支持尾部头、HTTP/2 服务器推送和 CONNECT/Upgrade 连接等功能。

接口从

def request(method, url, headers, stream, timeout):
    return (http_version, status_code, reason, headers, stream)

改为在请求和响应中包含一个可选的扩展字典

def request(method, url, headers, stream, ext):
    return (status_code, headers, stream, ext)

具有开放式的扩展点,这将允许我们添加对各种可选特性的支持,这些特性在没有这些 API 变更的情况下无法得到支持。

特别是

  • 尾部头支持。
  • HTTP/2 服务器推送
  • sendfile。
  • 在 CONNECT、Upgrade、HTTP/2 双向流中暴露原始连接。
  • 在 API 中暴露调试信息,包括模板名称、模板上下文。

目前扩展仅限于

  • 请求:timeout - 可选。超时字典。
  • 响应:http_version - 可选。包含响应中使用的 HTTP 版本。
  • 响应:reason - 可选。包含响应中使用的理由短语。仅对 HTTP/1.* 有效。

有关此背后的历史,请参阅 https://github.com/encode/httpx/issues/1274#issuecomment-694884553

其次,request 的异步版本现在命名为 arequest

这允许具体传输在同一个类上支持同步和异步实现。

新增

  • 添加 curio 支持。(Pull #168)
  • 添加 anyio 支持,使用 backend="anyio"。(Pull #169)

变更

  • 更新 Transport API 以使用 'ext' 作为可选扩展。(Pull #190)
  • 更新 Transport API 以使用 .request.arequest,以便实现可以同时支持同步和异步。(Pull #189)

0.10.2(2020年8月20日)

新增

  • 添加 Unix 域套接字支持。(Pull #139)

已修复

  • 始终在代理 CONNECT 请求中包含端口号。(Pull #154)
  • 修复 max_keepalive_connections 配置。(Pull #153)
  • 修复 HTTP/1.1 中的行为,其中服务器断开连接可以用来表示响应体结束。(Pull #164)

0.10.1(2020年8月7日)

  • AsyncHTTPProxy/SyncHTTPProxy 类中包含 max_keepalive_connections

0.10.0(2020年8月7日)

0.10.0 版本中最显著的变化是 HTTP/2 支持现在是可选的。

使用 pip install httpcore 仅获取 HTTP/1.1 支持,或使用 pip install httpcore[http2] 获取 HTTP/1.1 和 HTTP/2 支持。

新增

  • HTTP/2 支持变为可选。(Pull #121,#130)
  • 添加 local_address=... 支持。(Pull #100,#134)
  • 添加 PlainByteStreamIteratorByteStreamAsyncIteratorByteStream。现在 AsyncByteSteamSyncByteStream 类是纯接口类。(#133)
  • 添加 LocalProtocolErrorRemoteProtocolError 异常。 (Pull #129)
  • 添加 UnsupportedProtocol 异常。 (Pull #128)
  • 添加 .get_connection_info() 方法。 (Pull #102, #137)
  • 添加更好的 TRACE 日志。 (Pull #101)

变更

  • max_keepalive 已弃用,由 max_keepalive_connections 替代。 (Pull #140)

已修复

  • 改进服务器断开处理。 (Pull #112)

0.9.1 (2020年5月27日)

已修复

  • 同步情况下的正确主机解析,包括 IPv6 支持。 (Pull #97)
  • 关闭连接池时关闭未完成的连接。 (Pull #98)

0.9.0 (2020年5月21日)

变更

  • URL 端口变为 Optional[int] 而不是 int。 (Pull #92)

已修复

  • 尊重 HTTP/2 最大并发流的设置。 (Pull #89, #90)
  • 删除不正确的调试日志。 (Pull #83)

0.8.4 (2020年5月11日)

新增

  • 通过 HTTPCORE_LOG_LEVEL 和 HTTPX_LOG_LEVEL 环境变量和 TRACE 级别日志进行日志记录。 (Pull #79)

已修复

  • 在关闭并发情况下重用 HTTP/2 连接。 (Pull #81)

0.8.3 (2020年5月6日)

已修复

  • 在代理 "CONNECT" 请求中包含 HostAccept 标头。
  • 删除代理_headers 中也包含的任何重复的标头。
  • HTTP/2 标志没有传递给代理连接。

0.8.2 (2020年5月3日)

已修复

  • 修复使用代理转发请求的连接未正确添加到连接池的问题。 (Pull #70)

0.8.1 (2020年4月30日)

变更

  • 允许继承 httpcore.AsyncByteStreamhttpcore.SyncByteStream 而不发生类型冲突。

0.8.0 (2020年4月30日)

已修复

  • 修复隧道代理支持。

### 新增

  • 新的 TimeoutException 基类。

0.7.0 (2020年3月5日)

  • 首次与 HTTPX 集成。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

httpcore-1.0.6.tar.gz (85.2 kB 查看哈希值)

上传时间 源代码

构建分发

httpcore-1.0.6-py3-none-any.whl (78.0 kB 查看哈希)

上传时间: Python 3