char * get_post_assertion_data(Session *sn, Request *rq, char *url) { int i = 0; char *body = NULL; int cl = 0; char *cl_str = NULL; /** * content length and body * * note: memory allocated in here should be released by * other function such as: "policy_unregister_post" */ request_header("content-length", &cl_str, sn, rq); if(cl_str == NULL) cl_str = pblock_findval("content-length", rq->headers); if(cl_str == NULL) return body; if(PR_sscanf(cl_str, "%ld", &cl) == 1) { body = (char *)malloc(cl + 1); if(body != NULL){ for (i = 0; i < cl; i++) { int ch = netbuf_getc(sn->inbuf); if (ch==IO_ERROR || ch == IO_EOF) { break; } body[i] = ch; } body[i] = '\0'; } } else { am_web_log_error("Error reading POST content body"); } am_web_log_max_debug("Read POST content body : %s", body); /** * need to reset content length before redirect, * otherwise, web server will wait for serveral minutes * for non existant data */ param_free(pblock_remove("content-length", rq->headers)); pblock_nvinsert("content-length", "0", rq->headers); return body; }
static int handle_notification(Session *sn, Request *rq, void* agent_config) { int result; char *content_length_header; size_t content_length; /* fixme GETPOST use new getRequestBody() routine here.... */ result = request_header(CONTENT_LENGTH_HDR, &content_length_header, sn,rq); if (REQ_PROCEED == result && NULL != content_length_header && sscanf(content_length_header, "%u", &content_length) == 1) { char ch; size_t data_length = 0; char *buf = NULL; buf = system_malloc(content_length); if (buf != NULL) { for (data_length = 0; data_length < content_length; data_length++){ ch = netbuf_getc(sn->inbuf); if (ch == IO_ERROR || ch == IO_EOF) { break; } buf[data_length] = (char) ch; } am_web_handle_notification(buf, data_length, agent_config); system_free(buf); } else { am_web_log_error("handle_notification() unable to allocate memory " "for notification data, size = %u", content_length); } result = REQ_PROCEED; } else { am_web_log_error("handle_notification() %s content-length header", (REQ_PROCEED == result && NULL != content_length_header) ? "unparsable" : "missing"); } return result; }
/* * the request handler... */ NSAPI_PUBLIC int WebObjectsRequest(pblock *pb, Session *sn, Request *rq) { HTTPRequest *req; HTTPResponse *resp = NULL; WOURLComponents wc = WOURLComponents_Initializer; const char *reqerr; const char *qs; int retval; char *uri; WOURLError urlerr; if (!adaptorEnabled) return REQ_NOACTION; /* spew debug info */ dump_pb(sn->client,"service.sn->client"); dump_pb(pb,"service.pb"); dump_pb(rq->vars,"service.rq->vars"); dump_pb(rq->reqpb,"service.rq->reqpb"); dump_pb(rq->headers,"service.rq->headers"); dump_pb(rq->srvhdrs,"service.rq->srvhdrs"); uri = pblock_findval("uri", rq->reqpb); WOLog(WO_INFO,"<WebObjects NSAPI> new request: %s", uri); urlerr = WOParseApplicationName(&wc, uri); if (urlerr != WOURLOK) { const char *_urlerr; _urlerr = WOURLstrerror(urlerr); WOLog(WO_INFO,"URL Parsing Error: %s", _urlerr); if (urlerr == WOURLInvalidApplicationName) { if (ac_authorizeAppListing(&wc)) { resp = WOAdaptorInfo(NULL, &wc); die_resp(sn, rq, resp); } else { die(sn, rq, _urlerr, HTTP_NOT_FOUND); } } die(sn, rq, _urlerr, HTTP_BAD_REQUEST); } /* * build the request .... */ req = req_new( pblock_findval("method", rq->reqpb), NULL); /* * validate the method */ reqerr = req_validateMethod(req); if (reqerr) { req_free(req); return die(sn,rq,reqerr, HTTP_BAD_REQUEST); } /* * copy the headers.. */ copyHeaders(pb, sn, rq, req); /* * get form data if any * assume that POSTs with content length will be reformatted to GETs later */ if (req->content_length > 0) { int len_remaining = req->content_length; char *buffer = WOMALLOC(req->content_length); char *data = buffer; int c; while (len_remaining-- > 0) { if ((c = netbuf_getc(sn->inbuf)) == IO_ERROR) { log_error(0,"WebObjects",sn,rq,"Error reading form data"); WOFREE(buffer); req_free(req); return die(sn,rq,INV_FORM_DATA, HTTP_BAD_REQUEST); } *data++ = c; } req->content = buffer; } /* Always get the query string */ qs = pblock_findval("query", rq->reqpb); wc.queryString.start = qs; wc.queryString.length = qs ? strlen(qs) : 0; /* * message the application & collect the response * * note that handleRequest free()'s the 'req' for us */ if (resp == NULL) { /* if no error so far... */ req->api_handle = rq; /* stash this in case it's needed */ resp = tr_handleRequest(req, uri, &wc, pblock_findval("protocol",rq->reqpb), NULL); } if (resp != NULL) { retval = sendResponse(sn, rq, resp); resp_free(resp); } else { retval = REQ_EXIT; /* no response from app - bail */ } req_free(req); #if defined(FINDLEAKS) showleaks(); #endif return retval; }