首页 文章

Apache模块 - 获取请求正文

提问于
浏览
2

我正在创建简单的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 回答

  • 0

    您可以从您从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"以避免尝试读取太多数据,这可能会导致崩溃...

    所以你要去做一些事情:

    char buffer[SOME_BUFER_SIZE];
    int ret_code = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR);
    if (ret_code == OK) {
        if (ap_should_client_block(r)) {
            int dataBytesRead = ap_get_client_block(r, buffer, SOME_BUFFER_SIZE);
            ...
        }
    }
    

    在撰写本文时,您可以在此处找到更多信息:https://docstore.mik.ua/orelly/apache_mod/139.htm或此处:http://byteandbits.blogspot.com/2013/09/example-apache-module-for-reading.html

    希望能帮助到你...

相关问题