一个纯Python,自带I/O实现的HTTP/1.1
项目描述
这是一个从头开始用Python编写的HTTP/1.1库,深受hyper-h2的启发。
这是一个“自带I/O”库;h11不包含任何IO代码。这意味着您可以将h11连接到您喜欢的网络API,这可以是任何您想要的内容:同步的、线程的、异步的,或者您自己的RFC 6214实现 – h11不会评判您。(与当前最先进的状态相比,每当一个新的网络API出现,就有必要重新从头开始实现整个HTTP协议。)Cory Benfield写了一篇优秀的博客文章,描述了这种方法的优点,如果您喜欢视频,这里是他在PyCon 2016上的同主题演讲。
这也意味着h11并非开箱即用即可立即使用:它是一个用于构建能够处理HTTP协议的程序的工具包,并不能直接替代requests或twisted.web等。但h11使得实现类似requests或twisted.web的程序变得更容易。
从宏观层面来看,使用h11的过程大致如下
首先,创建一个h11.Connection对象以跟踪单个HTTP/1.1连接的状态。
当从网络读取数据时,将其传递给conn.receive_data(...);你将获得表示高级HTTP“事件”的对象列表。
当你想要发送高级HTTP事件时,创建相应的“事件”对象,并将其传递给conn.send(...);这将返回一些字节,你可以将其通过网络发送。
例如,客户端可能实例化并发送一个h11.Request对象,然后发送零个或多个h11.Data对象作为请求正文(例如,如果是POST请求),最后发送一个h11.EndOfMessage以表示消息的结束。然后服务器会发送回一个h11.Response,一些h11.Data和它自己的h11.EndOfMessage。如果任一方违反了协议,你将得到一个h11.ProtocolError异常。
h11适合用于实现服务器和客户端,并且API设计得非常对称:客户端发送的事件与服务器接收的事件完全相同,反之亦然。
它还提供了一个优秀的用户手册。
常见问题解答
为什么是它?
我想在Curio和Trio中玩HTTP,那时它们还没有任何HTTP库。所以我心想,这没什么大不了的,Python有十几种HTTP实现,肯定能找到一个可重用的。我没有找到,但我找到了Cory的号召性博文。所以我想,好吧,如果不得不从头实现HTTP,至少可以确保其他人再也不用这样做了。
我应该使用它吗?
也许吧。你应该知道,它是一个非常年轻的项目。但,它已经完成了所有功能,并有一个详尽的测试套件和完整的文档,所以下一步就是让人们尝试使用它并看看效果如何 :-)。如果你使用它,请告诉我们——至少在我们做出任何不兼容的更改之前,我们还想和你交谈!
功能/限制是什么?
大致来说,它试图实现HTTP/1.1规范第一“章节”的健壮、完整和非侵入式实现:[RFC 7230: HTTP/1.1 Message Syntax and Routing](https://tools.ietf.org/html/rfc7230)。也就是说,它主要关注在传输层上对HTTP进行实现,以及与之相关的头部信息,并努力符合规范。它不了解高级问题,如URL路由、条件GET、跨源cookie策略或内容协商。但它知道如何处理帧、处理keep-alive的跨版本差异以及“废弃的行折叠”规则,这样你就可以专注于应用程序的困难/有趣部分,并尝试支持完整的规范,即任何有用的HTTP/1.1兼容应用程序都应能够使用h11。
它是纯Python编写,且没有依赖任何标准库以外的库。
它有一个测试套件,对语句和分支的覆盖率均为100.0%。
当前它支持Python 3(在3.7-3.10版本上进行了测试)和PyPy 3。最后一个与Python 2兼容的版本是h11 0.11.x。(最初它有一个用于http-parser的Cython包装器,并使用yield from实现了一个漂亮的嵌套状态机来后处理输出。但我不得不去掉这些 - 新的解析器比旧的解析器包装器少用几行代码,是用纯Python编写的,不使用任何特殊的语言语法,并且具有更多功能。这真的很遗憾;那个旧的状态机真的很漂亮。我只需要在这里写几句话来表达我的哀悼。)
我不知道它有多快。我还没有对其进行基准测试或性能分析,所以它可能有一些无意义的热点,我一直在试图在简单性和健壮性上犯错误,而不是微优化。但在架构层面,我努力避免做出基本错误的决策,例如,我相信即使在像slowloris这样的病态输入面前,所有的解析算法仍然保持线性时间,并且没有按字节逐字节循环。(我也相信它能够面对任意/病态输入时保持有限的内存使用。)
整个库大约有800行代码。你可以在不到一个小时的时间内阅读并理解它。到目前为止,大部分精力都花在通过最小化特殊情况和临时状态操作来使事物保持简单;尽管现在它相当小且简单,我仍然很烦恼没有找到让它更小更简单的方法。(不幸的是,HTTP并不适合简单化。)
API功能基本齐全,我不期望总体轮廓有太大变化,但你不能在没有实际文档化和使用API的情况下判断API的人体工程学,所以我预计细节会有一些变化。
我该如何尝试它?
$ pip install h11
$ git clone git@github.com:python-hyper/h11
$ cd h11/examples
$ python basic-client.py
然后继续。
许可证?
MIT
行为准则?
请所有贡献者遵守我们在所有项目空间中的行为准则。
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分发
构建分发
h11-0.14.0.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d |
|
MD5 | 84c33fc0aa1f868928114c4d02c43dc2 |
|
BLAKE2b-256 | f5383af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03 |