你的位置:Dust Protocol中文网 > MKT中文网 > python内置HTTPServer如何实现及原理解析
python内置HTTPServer如何实现及原理解析
发布日期:2025-01-04 10:46    点击次数:75
应用案例 以上是使用内置模块 http.server 实现的一个最简单的 http 服务器,能处理 http GET 请求。 python 内置的 http server 主要集中在两个代码文件上,分别是 socketserver.py 和 http/server.py。socketserver.py 提供 socket 通信能力的 Server 封装并预留了用户自定义请求处理的接口;http/server.py 基于前者做进一步封装,用得比较多的是 HTTP 的封装。 从开头的例子出发阅读代码(python 3.10.1),大致梳理出以下代码结构,图画得很随意无规范可言,只是为了更具象化解释。 问题一:实现一个 HTTP 服务器大致需要什么要素 先看图 1,左边 BaseServer 一列是类,从上往下是父类到子类;右边 server_forever() 一列是方法,从上往下是逐步深入的调用链。 图 1 例子中使用了 HTTPServer 这个类,字面意思,这个类就是一个 HTTP 服务器,顺着继承链看到 HTTPServer 是 TCPServer 的子类,符合 HTTP 报文是基于 TCP 协议传输的认知,HTTPServer 类其实没什么内容,代码如下: TCPServer 的源码实现得益于父类的预留接口,只需要 TCP socket 走一遍 bind、listen、accept、close 流程(子类 UDPServer 同理)。 重点关注 BaseServer,这里是网络请求处理核心流程的实现,文章最开头的例子中 serve_forever() 这个入口方法就是在此类被实现,我在源码上加了些简单的注释: 从 _handle_request_noblock() 中看到,一个网络请求的处理流程无非就是 verify_request()、process_request()、shoutdown_request() 加上些许异常处理逻辑,比较简明。在 finish_request() 中出现 RequestHandlerClass 的类对象创建,这里其实就是用户自定义的 RequestHandler(在 BaseServer 的 __int__() 中被初始化)。源码如下,较好理解: 小结:要实现一个 HTTP 服务器,需要包含 TCP socket 实现,网络请求流程大致抽象为 verify_request()、process_request()、shoutdown_request() 。如果考虑支持用户自定义请求处理,还需要预留接口提供扩展性。当然如何要支持处理 HTTP 协议,还需要具备解析 HTTP 报文的能力,下文继续探讨。 问题二:python 内置的 HTTP Server 是怎么实现的 前文介绍了内置一个网络请求的处理流程(等价于 HTTP Server 的运行流程),一定程度上解释了本节的问题,但欠缺一点细节,没有体现 HTTP 报文的解析逻辑在哪里实现。其实内置的 HTTP Server 的把 HTTP 协议解析的工作解耦出去,单独做成 BaseHTTPRequestHandler 类,这样允许用户自行实现任意应用层的协议解析工作,参考下面图 2: 图 2 图 2 中,但凡带括号的都是方法,不带括号的是类,从上往下也是父类到子类。本着代码最大化复用的原则,父类 BaseRequestHandler 的 __init__() 中将工作流程确定下来,分别是 setup()、handler()、finish() 的先后调用顺序。setup() 和 finish() 在子类 StreamRequestHandler 被实现,最后在 BaseHTTPRequestHandler 类中实现 HTTP 协议解析功能,以及用 HTTP method 来决定调用哪个用户自定义的 do_XXX() 方法,如 do_GET()、do_POST() 等。代码如下: HTTP 协议解析关注 parse_request() 方法,由于代码较多不单独贴过来,思路如下: 解析 HTTP 协议版本号,确定版本解析是否支持(1.1 <= version < 2.0)获取 HTTP method解析 HTTP header 解析完 HTTP 协议后,根据所获取的 HTTP method,调用用户自定义的对应方法,至此结束。 总结 python 内置的 HTTP Server 实现比较简洁,功能相对简单。如果要自行从零实现一个 HTTP Server,设计上参考 python 的实现,应该具备以下要素: TCP socket 通信HTTP 协议的报文解析用户自定义的 RequestHandler 调用(设计上需要引入拓展)

相关资讯