邮箱:oxwangfeng@qq.com
分类: 架构设计与优化
2016-04-08 12:30:10
Values for TSHttpHookID:
TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK:
在查询完cache以后调用;对应事件TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE;
TS_HTTP_OS_DNS_HOOK:
dns查询完毕后调用;对应事件TS_EVENT_HTTP_OS_DNS
TS_HTTP_POST_REMAP_HOOK:
在remap发生后立即调用,发生在cache查询之前;对应事件TS_EVENT_HTTP_POST_REMAP;
TS_HTTP_PRE_REMAP_HOOK:
在从源站或者代理中读取响应头以后立即调用;
TS_HTTP_READ_CACHE_HDR_HOOK:
从cache中读取object的请求头和响应头后立即调用;
TS_HTTP_READ_RESPONSE_HDR_HOOK:
从源站或者proxy读取响应头后立即调用;
TS_HTTP_RESPONSE_TRANSFORM_HOOK:
。。。
TS_HTTP_READ_REQUEST_HDR_HOOK:
从client读取请求头部后理解调用;
TS_HTTP_REQUEST_TRANSFORM_HOOK:
。。。
TS_HTTP_SELECT_ALT_HOOK:
。。。
TS_HTTP_SEND_RESPONSE_HDR_HOOK:
在proxy的响应头写入到client之前调用;这个hook主要是修改响应头;
TS_HTTP_SEND_REQUEST_HDR_HOOK:
在proxy的请求头发送到源站或者proxy之前调用;访问cache不会调用这个hook;这个hook主要是在发送到源站或者proxy之前修改proxy的请求头;
TS_HTTP_SSN_CLOSE_HOOK:
当http session结束的时候调用。当client连接关闭的时候一个会话就会结束,你仅仅能够添加这个hook作为一个全局性的hook;
TS_HTTP_SSN_START_HOOK:
当http session开始的时候调用。当一个client连接ats的时候session就会开始;这个hook仅能够作为一个全局性的hook;
TS_HTTP_TXN_CLOSE_HOOK:
当http transation结束的时候调用;
TS_HTTP_TXN_START_HOOK:
当http
transaction开始的时候调用。当client连接ats和从连接上获取数据时,transaction开始;或者一个以前的client连接为了保活有新的数据;
Transformation是vconn的一个特殊类型;transformation处于输入源和输出数据接收器之间,它能够查看以及修改所有通过这之间的数据。有些transformation简单的扫描这些数据,有些transformation采用了一些方式进行压缩处理;
Transformation可以修改发送到HTTP
client的数据流,也可以修改从HTTP client发送的数据流;
Ats transformation有两个hook:
TS_HTTP_REQUEST_TRANSFORM_HOOK和TS_HTTP_RESPONSE_TRANSFORM_HOOK;
Bnull-transform插件:
Upstream vconn的数据写入transformation,transformation读取数据,然后消费,当消费掉所有的incoming数据后,发送TS_EVENT_VCONN_WRITE_COMPLETE到upstream vconn;
在发送TS_EVNET_VCONN_WRITE_COMPLETE之前,transformation应该检查保留在upstream
vconn的write vio(input vio)的字节数(使用TSVIONTodoGet),当所有的upstream数据被消费掉的时候这个值应该为0 ( TSVIONTodoGet = nbytes - ndone).当这个值为0的时候,状态机状态切换为TS_EVENT_VCONN_WRITE_COMPLETE;
具体处理过程:
1. 从input buffer中copy数据到output buffer;
TSIOBufferCopy (TSVIOBufferGet (data->output_vio),
TSVIOReaderGet (input_vio), towrite, 0);
2. 告诉input buffer:transformation已经读取数据了:
TSIOBufferReaderConsume
(TSVIOReaderGet (input_vio), towrite);
3. 修改input vio的ndone数据(即已经读取了多少数据)
TSVIONDoneSet
(input_vio, TSVIONDoneGet (input_vio) + towrite);
4. 如果还有数据要读(ndone
[upstream vconn收到write ready信号后就会继续给transaction写数据了];
5.当没有数据可读的时候,设置output
vconn的nbytes=ndone,并且激活output conn;最后发送给input vio一个write complete event;