邮箱:oxwangfeng@qq.com
分类: 架构设计与优化
2016-04-08 12:35:19
具体流程:
1.在TSPluginInit函数中在TS_HTTP_READ_RESPONSE_HDR_HOOK阶段定义一个Hood,函数名字叫cont_handle_response;这个是在read response hdr阶段的钩子函数;
2. 在cont_handle_response函数中,根据event类型来处理不同的事件;我们要处理的事件集中在读响应头阶段(即TS_EVENT_HTTP_READ_RESPONSE_HDR);
3.获取从源站发过来的response ,然后获取状态码,如果状态码是206,则我们在发送响应头阶段(即TS_HTTP_SEND_RESPONSE_HDR_HOOK)创建一个钩子函数cont_check_cacheable;
4.顺便说一下,源站返回206,在本插件中有两种情况,第一种是第一次range请求的时候,第二次是回源并且源站的内容发生修改的时候(回源并且源站不修改返回状态码304);
5. 在cont_check_cacheable函数,调用BgFetchData::initialize函数和BgFetchData::acquireUrl函数;
6.在BgFetchData::initialize中,copy request的header到mbuf中,并且删除range头部;
新建立一个url,只是去掉了range头部,host头部和以前一样;
curl -i -H "host:"
7.在BgFetchData::acquireUrl中,如果url在OutstandingRequests不存在,则添加request的url到OutstandingRequests中;
8.在206状态码,若有多并发,第一次并发,才会调用schedule(第一次调用data->acquireUrl()才为true);
9.进入schedule函数,建立一个状态机,状态机函数为cont_bg_fetch;并且立即执行这个状态机函数;
10.在cont_bg_fetch,由于event为TS_EVENT_IMMEDIATE,所以立即执行了;
11.当http访问结束时,将url从OutstandingRequests中删除;