1.目前核心输入过滤器和核心输出过滤器包括以下几种:
a.CHUNK编码过滤器;
b.CORE_IN过滤器;
c.CORE_OUT过滤器;
d.Byterange过滤器;
2.输入过滤器
(1) CORE_IN
(2) LOG_INPUT_OUTPUT
(3) SSL/TLS Filter
(4) HTTP_IN
(5) DEFLATE
(6) XLATEIN_FILTER_NAME
3.HTTP连接上的过滤器(注意:请求点在A点)
4.CORE_IN过滤器的上下文是在挂钩pre_connection中实现的。
5.HTTP_INde上下文结构用http_ctx_t描述:
typedef struct http_filter_ctx
{
apr_off_t remaining;
apr_off_t limit;
apr_off_t limit_used;
enum {
BODY_NONE,//请求中不包括任何的请求体
BODY_LENGTH, //请求中包含报文体
BODY_CHUNK, //请求中包含请求体,并且报文采用Chunk编码
BODY_CHUNK_PART
} state;
int eos_sent;
char chunk_in[32];
char *pos;
apr_off_t linesize;
apr_bucket_brigade *bb; //过滤器每次读取的数据都保存在存储段组bb中
} http_ctx_t;
6.
7.BODY_LENGTH
不管对于BODY_LENGTH还是BODY_CHUNK,任何时候只要发现eos_sent被设置,则意味着已经达到了报文体的最后,此时将在存储段组中插入一个EOS存储段标记结束。
ctx->remaining中记录了剩余的要读取的报文字节数目,如果ctx->remaining为0,则意味着读取数据已经完毕,此时插入一个EOS存储段。如果ctx->remaining>0,则意味着还有数据要读取,那么读取流程将继续。
readbytes是要读取的报文体数据,如果实际剩余的数据已经不足readbytes,那么调整readbytes,并且调用ap_get_brigade从网络中读取。实际读取的数据长度保存在变量totalread中,同时剩余的可读取数据ctx->remaining递减totalread.
8.Apache中提供的输出过滤器层次