分析proxy-server代理服务 的执行流程,其他的三个主要服务 account server,container server,object server执行过程通proxy server类似。
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变量,作为执行结果返回给客户端。