@Eric,Let me read that what you have suggested. My problem is, the POST 
request coming is not a login form but it is un-parsable JSON string 
(application/x-ndjson). I am using some C string function to extract that part 
from request and setting it in the response header as part of my C code. But as 
is said, actual response body is lost by using SetHandler.
@Anthony,
You are right, that is just typo on my post Anthony. Actual code/config is good 
and compiled successfully. I am also able to set response header but my problem 
is that I am using SetHandler directive and that way I am getting actual 
response from server. Probably request is getting hijacked by SetHandler 
directive.

So what should be right way to trigger my C code which can set response header 
but also continue its routine flow to go to backend server and get actual 
response body, is the question.
*Thank you for responses*
RegardsHarshil

    On Monday, 11 May, 2020, 02:19:34 pm GMT-4, Antony G 
<agi...@yahoo.com.invalid> wrote:  
 
 
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