学习《apache源代码全景分析》之常用过滤器摘录

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中提供的输出过滤器层次

    

猜你喜欢

转载自blog.csdn.net/zhangge3663/article/details/83344147