- 论坛徽章:
- 0
|
因为mod_echo是这样做的:
ap_hook_process_connection(process_echo_connection, NULL, NULL, APR_HOOK_MIDDLE);
他拦截了网络层建立连接的处理,然后
static int process_echo_connection(conn_rec *c)
{
apr_bucket_brigade *bb;
apr_bucket *b;
apr_status_t rv;
EchoConfig *pConfig = ap_get_module_config(c->base_server->module_config, &echo_module);// 获取模块配置
if (!pConfig->bEnabled)// 如果是被启用的,就是httpd.conf中的
// LoadModule echo_module modules/mod_echo.so
// ProtocolEcho On
{
return DECLINED;
}
do
{
bb = apr_brigade_create(c->pool, c->bucket_alloc);// 创建处理桥
/* Get a single line of input from the client */
if (((rv = ap_get_brigade(c->input_filters, bb, AP_MODE_GETLINE, APR_BLOCK_READ, 0)) != APR_SUCCESS)
|| APR_BRIGADE_EMPTY(bb))// 从输入过滤器获取一行输入,即监听回车,如遇回车则读取其前数据到bb中
{
apr_brigade_destroy(bb);
break;
}
/* Make sure the data is flushed to the client */
b = apr_bucket_flush_create(c->bucket_alloc);// 创建输出器
APR_BRIGADE_INSERT_TAIL(bb, b);// 将输出器追加到桥bb的后面
/* Send back the data. */
rv = ap_pass_brigade(c->output_filters, bb);// 传递桥bb给输出器,这样数据将输出到客户端
} while (rv == APR_SUCCESS);// 这里是一个循环等待,直到ap_pass_brigade返回值不成功[不为APR_SUCCESS],就退出循环。
// 因为这里循环等待,就会导致apache进程hang住,所以其他请求,比如正常的网页访问就不能得到服务了
return OK;
} |
|