微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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变量,作为执行结果返回给客户端。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐