openstack swift和wsgi源码分析1 HTTP请求处理过程

分析proxy-server代理服务 的执行流程,其他的三个主要服务 account server,container server,object server执行过程通proxy server类似。

入口函数调用run_wsgi,此函数完成以下工作:

1.利用paste.deploy模块的loadapp函数加载指定服务(如proxy)的配置文件,获取用户的application,即业务程序
    2.调用wsgi.server,其中wsgi.server会绑定IP和端口,监听来自客户端的消息。并由process_request函数负责处理消息。

下面重点研究下process_request函数是如何把消息转化为HTTP的request对象这一过程。

process_request函数生成 HttpProtocol对象,并执行init操作,注意,HttpProtocol对象自身没有init函数,所以会调用父类(BaseHTTPServer.BaseHTTPRequestHandler)的父类(StreamRequestHandler)的父类(BaseRequestHandler) 的init 函数
。此函数中,执行setup,handle,finish 三个操作。下面依次进行分析。

setup函数

HttpProtocal 类重写了setup函数,根据client_socket 生成rfile和wfile。

handle函数

BaseHTTPRequestHandler 重写了handle函数,此函数主要调用 handle_one_request (HttpProtocl类重写)函数。

    handle_one_request函数调用parse_request(BaseHTTPRequestHandler类)函数,通过mimetools.Message类生成headers,以及command,path,version等参数;调用get_environ (HttpProtocol类)函数生成environ字典。赋值self.application,以及调用handle_one_response函数(重点中的重点)。

    handle_one_response函数调用self.application函数,传递environ参数和start_response函数,执行用户业务流程并返回响应数据。调用write函数,重新整理响应数据,编辑格式,调用wfile.writelines函数返回给客户端。
    在self.application(即__call__函数)执行过程中,根据envrion 会生成request对象。

finish函数

HttpProtocol类重写,核心功能由StreamRequestHandler类完成。刷新缓存,关闭wfile,rfile,释放线程和socket资源。

start_response函数解析

在多层拓扑app函数中,start_response函数会被作为参数继续传递,直到最后一层的app函数时,作为response对象的__call__函数调用参数,在__call__函数内部执行。利用app过程中执行的status和headers参数,重写handle_one_response内部的header_set变量,作为执行结果返回给客户端。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...