我正在创建简单的apache模块来捕获所有HTTP流量,以便安全软件进行实时处理 . 我的目标是从请求和响应中获取 Headers 和正文 . 到目前为止,除了请求正文外,我设法得到了所有我需要在输出过滤器或任何其他钩子/处理程序中获取请求主体以获取所有相关信息的请求 - 响应“元组”的最佳方法是什么?
static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb)
{
apr_status_t rv;
request_rec *r = f->r;
apr_bucket *e = APR_BRIGADE_FIRST(bb);
const char *data;
apr_size_t length;
std::ofstream outfile;
outfile.open("/var/log/apache2/test.txt", std::ios_base::app);
outfile << r->method << r->unparsed_uri << std::endl;
apr_table_do(loop_table, &outfile, r->headers_in, NULL);
//!!! READ REQUST BODY HERE !!!!
outfile << r->status << std::endl;
apr_table_do(loop_table, &outfile, r->headers_out, NULL);
outfile << std::endl;
while (e != APR_BRIGADE_SENTINEL(bb)) {
apr_bucket_read(e, &data, &length, APR_BLOCK_READ);
e = APR_BUCKET_NEXT(e);
outfile << data;
}
outfile.flush();
outfile.close();
return ap_pass_brigade(f->next, bb);
}
任何帮助appriciated
1 回答
您可以从您从ap_filter_t指针变量派生的request_rec指针中读取正文 .
作为第一步,您应该通过调用 ap_setup_client_block ,传递request_rec指针和"read policy"作为参数来告诉apache您想要从客户端读取数据 .
其次,你调用 ap_should_client_block (传递request_rec指针作为参数)来检查一切是否正常,特别是在客户端(期望结果为真) .
然后使用request_rec作为参数调用(根据需要多次) ap_get_client_block ,数据将进入的缓冲区以及缓冲区的大小 . 您应该将读取的字节数作为响应,并且数据应该在缓冲区中 . 如果您尝试读取最大X字节并返回X字节,则应再次调用以获取剩余字节 . 请注意,应使用标头"Content-length"以避免尝试读取太多数据,这可能会导致崩溃...
所以你要去做一些事情:
在撰写本文时,您可以在此处找到更多信息:https://docstore.mik.ua/orelly/apache_mod/139.htm或此处:http://byteandbits.blogspot.com/2013/09/example-apache-module-for-reading.html
希望能帮助到你...