一个最小化的底层HTTP客户端。
项目描述
HTTP Core
做好一件事,做到最好。
HTTP Core包提供了一个最小化的底层HTTP客户端,只做一件事:发送HTTP请求。
它不提供任何高级API模型抽象,不处理重定向、多部分上传、构建身份验证头、透明HTTP缓存、URL解析、会话Cookie处理、内容或字符集解码、处理JSON、基于环境的默认配置或任何那种爵士乐。
HTTP Core能做什么
- 发送HTTP请求。
- 线程安全/任务安全连接池。
- 支持HTTP(S)代理和SOCKS代理。
- 支持HTTP/1.1和HTTP/2。
- 提供同步和异步接口。
- 为
asyncio
和trio
提供异步后端支持。
需求
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) - 修复当流中有一些数据被读取时的连接
Upgrade
和CONNECT
支持问题。 (#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
参数添加到ConnectionPool
和HTTProxy
类。(#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日)
- 允许
ws
和wss
方案。允许我们正确支持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
。如果您使用 httpcore
与 curio
,请与我们联系,以便我们评估是否应该将其作为功能优先考虑。
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 中
:authority
的Host
标头的优先级问题。(拉取请求 #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) - 添加
PlainByteStream
、IteratorByteStream
、AsyncIteratorByteStream
。现在AsyncByteSteam
和SyncByteStream
类是纯接口类。(#133) - 添加
LocalProtocolError
、RemoteProtocolError
异常。 (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" 请求中包含
Host
和Accept
标头。 - 删除代理_headers 中也包含的任何重复的标头。
- HTTP/2 标志没有传递给代理连接。
0.8.2 (2020年5月3日)
已修复
- 修复使用代理转发请求的连接未正确添加到连接池的问题。 (Pull #70)
0.8.1 (2020年4月30日)
变更
- 允许继承
httpcore.AsyncByteStream
和httpcore.SyncByteStream
而不发生类型冲突。
0.8.0 (2020年4月30日)
已修复
- 修复隧道代理支持。
### 新增
- 新的
TimeoutException
基类。
0.7.0 (2020年3月5日)
- 首次与 HTTPX 集成。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
构建分发
httpcore-1.0.6.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f |
|
MD5 | 458f9b56367cf547425bf2347bffd784 |
|
BLAKE2b-256 | b644ed0fa6a17845fb033bd885c03e842f08c1b9406c86a2e60ac1ae1b9206a6 |
httpcore-1.0.6-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f |
|
MD5 | 40c4cd5214c1adbaa4948a49694a3dc6 |
|
BLAKE2b-256 | 0689b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106 |