–本文转自:纸鸢-可道 可道技术
普及文章,高手飘过。
发现不少同学刚搞ats插件开发时候经常找不着道。
举个栗子:
通过阅读插件代码,发现对ats的处理流程、request/respone方向没弄清楚。
如果不先搞清楚简单的流程、request/respone方向问题,会陷入坑中。下面我们一起来看看在搞ats插件之前,我们需要搞清楚什么东西。
插件文档:https://docs.trafficserver.apache.org/en/latest/developer-guide/plugins/index.en.html
官方example: https://github.com/apache/trafficserver/tree/master/example
ats给插件提供了什么Hook起码要了解下,在什么Hook能干嘛要了解下。
Hook这个章节最重要的差不多是下面这章图了:
一开始最重要的几个Hook应该是4个:
这4个Hook都跟request/respone方向有关,一旦还没弄清楚这个点,去看ts.h提供的Api就乱套了,完全对应不上在哪里该使用什么。
这个不用多解释了,刚开始搞插件从处理Header开始是最常见也是最好入手的,得看看。
建议对照着example看:
https://github.com/apache/trafficserver/tree/master/example/replace-header
https://github.com/apache/trafficserver/tree/master/example/add-header
Transform是修改响应内容的地方,很关键,有点难度。需要修改数据的得看这个地方。
对照example:
https://github.com/apache/trafficserver/tree/master/example/append-transform
https://github.com/apache/trafficserver/tree/master/example/bnull-transform
https://github.com/apache/trafficserver/tree/master/example/null-transform
https://github.com/apache/trafficserver/tree/master/example/server-transform
看看文档介绍的例子跟对照example代码:
https://github.com/apache/trafficserver/tree/master/example
如果上面的内容都看完了还不过瘾,那可以看官方正式plugins代码:
https://github.com/apache/trafficserver/tree/master/plugins
https://github.com/apache/trafficserver/tree/master/plugins/experimental
https://github.com/apache/trafficserver/blob/master/proxy/api/ts/ts.h
所有提供给插件使用的Api方法都在这里面了。
这些Api方法的实现在于:
https://github.com/apache/trafficserver/blob/master/proxy/InkAPI.cc
连这些都知道了,是不是自己添加Api方法都可以了。
如果上面那些看的还不过瘾,那可以看看数据结构资料。
http://people.apache.org/~amc/ats/doc/html/classHttpRequestData.html
上面链接是Request的数据结构图,还可以自己点去看其他的,太多了。
假设现在都已经把request/respone方向都搞清楚了,我们现在回来看前言提到的同学问的问题。
主要是想获取响应的内容。
我们先来看看Hook挂载的对不,代码中挂载的Hook是TS_HTTP_SEND_RESPONSE_HDR_HOOK,发送响应的位置,都准备发响应给客户端了,那肯定是已经能获取到响应内容的了。
Hook点没有问题,我们接着看方法,代码使用的是TSHttpTxnServerReqGet,
再看问题:
都是Req相关的,Req是啥,是Request,是请求方向。很明显了。是要获取响应内容,用请求方向的方法能获取到么?
我们拿他用的这个方法去ts.h查询下(见下图),可以看到每个Req方法附近都有一个Resp的对应方法,Resp就是Response,响应方法的方法。
最后改对方向的方法解决了问题。
我们并不是为了解决这么一个问题,而是想说明我们应该先把什么内容整理清晰,尽量不要盲搞。