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_2004@xxxxxxxxx.INVALID> 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.confLoadModule 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 |