apache webserver定制模块未从请求中找到任何正文

时间:2019-08-19 11:24:38

标签: c apache post apache-kafka apache-modules

通常:我在Ubuntu上使用apache2 webserver和模块“ mod_kafka”(https://github.com/kjdev/apache-mod-kafka)来拦截所有将标头和正文发送给kafka生产者的请求,而不是在文件上写入日志。不要问我为什么,这个故事很长。我正在触摸“ mod_kafka.c”中包含的代码,似乎可以正常工作,但一切都很好,但是我对使用C语言和apache的新手并不满意,有些无法找到使用系统检索POST正文的方法。 m建立起来。

我在代码的正确位置(它将日志信息发送到kafka生产者)放在了对我自定义模块的函数的调用上。此函数检索正文的内容,我可以丰富日志消息,在下面的示例中,您将看到我在日志文件中跟踪一些信息。读取POST正文的函数是“ util_read”

    if(util_read(r, &buffer, &size) == OK) {
       kafka_produce(r->pool, &config->kafka, topic, partition, buffer);
       ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "BODY: request of %" APR_OFF_T_FMT "  size and  content: %s ", size, buffer);
    }

其中util_read是主体读取器函数:

static int util_read(request_rec *r, const char **rbuf, apr_off_t *size)
{
    /*~~~~~~~~*/
    int rc = OK;
    /*~~~~~~~~*/

    if((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR))) {
        ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "Exiting with client block");
        return(rc);
    }

    ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "In the middle of the run");

    if(ap_should_client_block(r)) {

        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        char         argsbuffer[HUGE_STRING_LEN];
        apr_off_t    rsize, len_read, rpos = 0;
        apr_off_t length = r->remaining;
        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

        *rbuf = (const char *) apr_pcalloc(r->pool, (apr_size_t) (length + 1));
        *size = length;

        ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "GET_CLIENT_BLOCK %s", ap_get_client_block(r, argsbuffer, sizeof(argsbuffer)));

        while((len_read = ap_get_client_block(r, argsbuffer, sizeof(argsbuffer))) > 0) {
            if((rpos + len_read) > length) {
                rsize = length - rpos;
            }
            else {
                rsize = len_read;
            }

            memcpy((char *) *rbuf + rpos, argsbuffer, (size_t) rsize);
            rpos += rsize;
        }

    }
    return(rc);
}

如您所见,我正在跟踪错误日志中的某些值,并且当代码运行“ ap_get_client_block”时,尽管POST的大小正确,但它返回(NULL)。

正如我在其他模块中测试的那样,我可以将请求正文打印在错误日志文件中。我想我可能在钩子寄存器阶段上错了

static void
kafka_register_hooks(apr_pool_t *p)
{
  static const char *preload[] = { "mod_log_config.c", NULL };
  // Original
  ap_hook_pre_config(kafka_pre_config, preload, NULL, APR_HOOK_REALLY_LAST);
  ap_hook_child_init(kafka_child_init, NULL, NULL, APR_HOOK_MIDDLE);
    //ap_hook_post_read_request(kafka_child_init, NULL, NULL, APR_HOOK_MIDDLE);
}

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA kafka_module = {
  STANDARD20_MODULE_STUFF,
  NULL,                       /* create per-dir    config structures */
  NULL,                       /* merge  per-dir    config structures */
  kafka_create_server_config, /* create per-server config structures */
  NULL,                       /* merge  per-server config structures */
  kafka_cmds,                 /* table of config file commands       */
  kafka_register_hooks        /* register hooks                      */
};

我尝试了其他钩子,但是我没有那个乏味的主体,当函数运行时(我尝试了很多类似“ ap_hook_post_read_request”的程序),系统会引发错误->“退出信号分段错误(11), / etc / apache2中可能的coredump”

能帮我吗?

0 个答案:

没有答案