博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

traffic server 之 backgroud fetch插件

Posted on 2017-08-25 15:30  bw_0927  阅读(265)  评论(0)    收藏  举报

 

http://blog.chinaunix.net/uid-13776576-id-5697901.html

 

 

 

具体流程:

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:www.jd.com"  http://127.0.0.1:80/download/index.html?t=1

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中删除;