I don't think you want to replace the handler. I suggest reading how mod_auth_form uses mod_request to do similar stuff w/ the body before the handler sees it. On Mon, May 11, 2020 at 1:30 PM harshil fadia <hartz_2004@xxxxxxxxx.invalid> wrote: > > 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 > -- Eric Covener covener@xxxxxxxxx --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscribe@xxxxxxxxxxxxxxxx For additional commands, e-mail: users-help@xxxxxxxxxxxxxxxx