Hello Harshil Fadia,

 

Just to be sure that the below are just typing errors.

 

1) In the util_read  procedure, the statement return rc; is outside the brackets

 

And 

 

2) You have different name in the MODULE DEFINITION (regiter_hooks) and in the 
name of the procedure (register_hooks)

 

module AP_MODULE_DECLARE_DATA readbody_module = { 
    STANDARD20_MODULE_STUFF,
    NULL, /*Per-directory configuration handler */
    NULL, /*Merge handler for per-directory configurations */
    NULL, /*Per-server configuration handler */
    NULL, /*Merge handler for per-server configurations */
    NULL,
    regiter_hooks /*Our hook registering function */
};
 
static void register_hooks(apr_pool_t *pool)

 

Regards

 

From: harshil fadia <hartz_2...@yahoo.com.INVALID> 
Sent: Monday, May 11, 2020 8:30 PM
To: users@httpd.apache.org
Subject: [users@httpd] Apache HTTPD: Read POST request body and set response 
header

 

How do I implement below requirement? Please help..

 

Read POST request body >> Take out some data from request body >> Set 
particular response header attribute based on request attribute >> Send 
response back to client

 

 

What I have tried to do so far is wrote Apache module in C, read the Post body 
and set response header. I am calling my custom module using SetHandler so I am 
losing the original server response and response becomes null. Where as, what I 
want to have is the actual server response to be sent to client and 
additionally I append one more parameter in response header.

 


1. httpd.conf


LoadModule example_module    /usr/lib64/httpd/modules/mycustommodule.so

 

<VirtualHost HOSTNAME:80>

  <Location /elasticsearch/_msearch>

        SetHandler readbody-handler #calling my custom module

  </Location>

  

  #My KIBANA application is running on 5601 on same machine

  ProxyPass        / http://localhost:5601/ 

  ProxyPassReverse / http://localhost:5601/

 

</VirtualHost>

 

 


2. My custom C module 

module AP_MODULE_DECLARE_DATA readbody_module = { 
    STANDARD20_MODULE_STUFF,
    NULL, /*Per-directory configuration handler */
    NULL, /*Merge handler for per-directory configurations */
    NULL, /*Per-server configuration handler */
    NULL, /*Merge handler for per-server configurations */
    NULL,
    regiter_hooks /*Our hook registering function */
};
 
static void register_hooks(apr_pool_t *pool)
{
    ap_hook_handler(readbody_handler, NULL, NULL, -10);
}
 
static int readbody_handler(request_rec *r)
{
    const char *buffer;
 
    if (!r->handler || strcmp(r->handler, "readbody-handler")) return 
(DECLINED);
 
    if (util_read(r, &buffer) == OK) //reading the body and assigning it into 
buffer
    {
        char s[2] = ":";
        char s2[2] = "\"";
        char *indexname;
        indexname = strtok(buffer, s);
        indexname = strtok(NULL, s);
        indexname = strtok(indexname, s2);
        indexname = strtok(NULL, s2);
        apr_table_setn(r->headers_out, "IndexPattern", indexname); //setting up 
response header
    }
 
    return OK;
}
 
static int util_read(request_rec *r, const char **rbuf)
{
    int rc;
    if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)) != OK)
    {
        return rc;
    }
    if (ap_should_client_block(r))
    {
        char argsbuffer[HUGE_STRING_LEN];
        int rsize, len_read, rpos = 0;
        long length = r->remaining;
        *rbuf = apr_pcalloc(r->pool, length + 1);
        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, rsize);
            rpos += rsize;
        }
    }
}
    return rc;

 

Regards,

Harshil Fadia

 

Reply via email to