簡體   English   中英

Apache模塊-獲取請求正文

[英]Apache module - get request body

我正在創建一個簡單的apache模塊,以捕獲所有HTTP通信,以由安全軟件進行實時處理。 我的目標是從請求和響應中獲取標頭和正文。 到目前為止,我設法獲得了我所需要的一切,但請求正文除外。 在輸出過濾器中或在任何其他鈎子/處理程序中獲取帶有所有相關信息的請求響應“元組”的最佳方法是什么?

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);
}

任何幫助

您可以從ap_filter_t指針變量派生的request_rec指針中讀取正文。

  1. 第一步,您應通過調用ap_setup_client_block並傳遞request_rec指針和“讀取策略”作為參數來告訴apache您要從客戶端讀取數據。
  2. 其次,您調用ap_should_client_block (將request_rec指針作為參數傳遞)以檢查一切正常,尤其是在客戶端(期望結果為true )。
  3. 然后,以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

希望能幫助到你...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM