static ssize_t mi_xmlrpc_http_flush_data(void *cls, uint64_t pos, char *buf, size_t max) { struct mi_handler *hdl = (struct mi_handler*)cls; gen_lock_t *lock; mi_xmlrpc_http_async_resp_data_t *async_resp_data; str page = {NULL, 0}; if (hdl==NULL) { LM_ERR("Unexpected NULL mi handler!\n"); return -1; } LM_DBG("hdl=[%p], hdl->param=[%p], pos=[%d], buf=[%p], max=[%d]\n", hdl, hdl->param, (int)pos, buf, (int)max); if (pos){ LM_DBG("freeing hdl=[%p]: hdl->param=[%p], " " pos=[%d], buf=[%p], max=[%d]\n", hdl, hdl->param, (int)pos, buf, (int)max); shm_free(hdl); return -1; } async_resp_data = (mi_xmlrpc_http_async_resp_data_t*)((char*)hdl+sizeof(struct mi_handler)); lock = async_resp_data->lock; lock_get(lock); if (hdl->param) { if (*(struct mi_root**)hdl->param) { page.s = buf; LM_DBG("tree=[%p]\n", *(struct mi_root**)hdl->param); if (mi_xmlrpc_http_build_page(&page, max, *(struct mi_root**)hdl->param)!=0){ LM_ERR("Unable to build response\n"); shm_free(*(void**)hdl->param); *(void**)hdl->param = NULL; lock_release(lock); memcpy(buf, MI_HTTP_U_ERROR.s, MI_HTTP_U_ERROR.len); return MI_HTTP_U_ERROR.len; } else { shm_free(*(void**)hdl->param); *(void**)hdl->param = NULL; lock_release(lock); return page.len; } } else { LM_DBG("data not ready yet\n"); lock_release(lock); return 0; } } else { lock_release(lock); LM_ERR("Invalid async reply\n"); memcpy(buf, MI_HTTP_U_ERROR.s, MI_HTTP_U_ERROR.len); return MI_HTTP_U_ERROR.len; } lock_release(lock); LM_CRIT("done?\n"); shm_free(hdl); return -1; }
int mi_xmlrpc_http_answer_to_connection (void *cls, void *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls, str *buffer, str *page) { str arg = {NULL, 0}; struct mi_root *tree = NULL; struct mi_handler *async_hdl; int ret_code = MI_XMLRPC_OK; LM_DBG("START *** cls=%p, connection=%p, url=%s, method=%s, " "versio=%s, upload_data[%d]=%p, *con_cls=%p\n", cls, connection, url, method, version, (int)*upload_data_size, upload_data, *con_cls); if (strncmp(method, "POST", 4)==0) { httpd_api.lookup_arg(connection, "1", *con_cls, &arg); if (arg.s) { tree = mi_xmlrpc_http_run_mi_cmd(&arg, page, buffer, &async_hdl); if (tree == NULL) { LM_ERR("no reply\n"); *page = MI_XMLRPC_U_ERROR; ret_code = MI_XMLRPC_INTERNAL_ERROR; } else if (tree == MI_ROOT_ASYNC_RPL) { LM_DBG("got an async reply\n"); tree = NULL; } else { LM_DBG("building on page [%p:%d]\n", page->s, page->len); if(0!=mi_xmlrpc_http_build_page(page, buffer->len, tree)){ LM_ERR("unable to build response\n"); *page = MI_XMLRPC_U_ERROR; ret_code = MI_XMLRPC_INTERNAL_ERROR; } else { ret_code = tree->code; } } } else { page->s = buffer->s; LM_ERR("unable to build response for empty request\n"); *page = MI_XMLRPC_U_ERROR; ret_code = MI_XMLRPC_INTERNAL_ERROR; } if (tree) { free_mi_tree(tree); tree = NULL; } } else { LM_ERR("unexpected method [%s]\n", method); *page = MI_XMLRPC_U_METHOD; return MI_XMLRPC_NOT_ACCEPTABLE; } return ret_code; }