一、C语言里的多态C语言没有虚函数,没有接口继承,没有override关键字。但Nginx硬是用3个全局函数指针和一套精巧的init注册机制,在纯C环境下搭出了一条完整的责任链——HTTP响应从生成到发送,要经过一条header过滤链和一条body过滤链,每条链上挂着十几个过滤器模块,每个模块只管自己那一段逻辑,处理完就把数据递给下一个。和GoF设计模式书里描述的责任链一模一样,只不过实现语言是1972年诞生的C。这篇文章要拆解的就是这两条过滤链最底层的4个模块——它们是整条链的"地基",所有其他过滤器(gzip、chunked、range、charset……)最终都要把数据交给它们来完成最后一步。这4个模块分别是:模块职责ngx_http_header_filter_module过滤链的末端之一,把r-headers_out结构体序列化成HTTP/1.1 200 OK\r\nServer: nginx\r\n...这样的字节流ngx_http_copy_filter_modulebody过滤链上的一个中间站,负责把可能来自文件、内存、管道的各种缓冲区统一复制成可发送的形态,支持AIO和线程池异步