Module: sip-router
Branch: master
Commit: 6b8b8a050e4490302d1f1f940a7fda95784cce46
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6b8b8a0…
Author: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Date: Wed Oct 23 14:53:04 2013 +0100
modules/xcap_server: fixed fetching of an element (GET with XPath)
- This is a mandatory part of XCAP and DELETE/PUT of elements (using XPath)
is supported in xcap_server.
- The code to get a node from a document was all in there but never called.
---
modules/xcap_server/xcap_misc.c | 6 +-
modules/xcap_server/xcap_server.c | 81 ++++++++++++++++++++++++++++---------
2 files changed, 64 insertions(+), 23 deletions(-)
diff --git a/modules/xcap_server/xcap_misc.c b/modules/xcap_server/xcap_misc.c
index 7ca891e..da8bb59 100644
--- a/modules/xcap_server/xcap_misc.c
+++ b/modules/xcap_server/xcap_misc.c
@@ -334,15 +334,15 @@ int xcaps_xpath_get(str *inbuf, str *xpaths, str *outbuf)
LM_ERR("unable to evaluate xpath expression [%s]\n", xpaths->s);
goto error;
}
- nodes = xpathObj->nodesetval;
- if(nodes==NULL)
+ nodes = xpathObj->nodesetval;
+ if(nodes==NULL || nodes->nodeNr==0 || nodes->nodeTab == NULL)
{
outbuf->len = 0;
outbuf->s[outbuf->len] = '\0';
goto done;
}
size = nodes->nodeNr;
- p = outbuf->s;
+ p = outbuf->s;
end = outbuf->s + outbuf->len;
for(i = 0; i < size; ++i)
{
diff --git a/modules/xcap_server/xcap_server.c b/modules/xcap_server/xcap_server.c
index 8bc14eb..372fc39 100644
--- a/modules/xcap_server/xcap_server.c
+++ b/modules/xcap_server/xcap_server.c
@@ -1070,7 +1070,8 @@ static int w_xcaps_get(sip_msg_t* msg, char* puri, char* ppath)
str uri;
str path;
str etag = {0, 0};
- str body;
+ str body = {0, 0};
+ str new_body = {0, 0};
int ret = 0;
xcap_uri_t xuri;
str *ctype;
@@ -1170,37 +1171,77 @@ static int w_xcaps_get(sip_msg_t* msg, char* puri, char* ppath)
LM_ERR("could not fetch xcap document\n");
goto error;
}
-
- if(ret==0)
+ if(ret!=0)
{
- /* doc found */
- ctype = &xcaps_str_appxml;
- if(xuri.type==RESOURCE_LIST)
- ctype = &xcaps_str_apprlxml;
- else if(xuri.type==PRES_RULES)
- ctype = &xcaps_str_appapxml;
- else if(xuri.type==RLS_SERVICE)
- ctype = &xcaps_str_apprsxml;
- else if(xuri.type==USER_PROFILE)
- ctype = &xcaps_str_appupxml;
- else if(xuri.type==PRES_CONTENT)
- ctype = &xcaps_str_apppcxml;
- else if(xuri.type==PIDF_MANIPULATION)
- ctype = &xcaps_str_apppdxml;
- xcaps_send_reply(msg, 200, &xcaps_str_ok, &etag,
- ctype, &body);
- } else {
/* doc not found */
xcaps_send_reply(msg, 404, &xcaps_str_notfound, NULL,
NULL, NULL);
+ break;
+ }
+
+ if(xuri.nss!=NULL && xuri.node.len>0)
+ {
+ if((new_body.s = pkg_malloc(body.len))==NULL)
+ {
+ LM_ERR("allocating package memory\n");
+ goto error;
+ }
+ new_body.len = body.len;
+
+ if(xcaps_xpath_hack(&body, 0)<0)
+ {
+ LM_ERR("could not hack xcap document\n");
+ goto error;
+ }
+ if(xcaps_xpath_get(&body, &xuri.node, &new_body)<0)
+ {
+ LM_ERR("could not retrieve element from xcap document\n");
+ goto error;
+ }
+ if(new_body.len<=0)
+ {
+ /* element not found */
+ xcaps_send_reply(msg, 404, &xcaps_str_notfound, NULL,
+ NULL, NULL);
+ pkg_free(new_body.s);
+ new_body.s = NULL;
+ break;
+ }
+ if(xcaps_xpath_hack(&new_body, 1)<0)
+ {
+ LM_ERR("could not hack xcap document\n");
+ goto error;
+ }
+ memcpy(body.s, new_body.s, new_body.len);
+ body.len = new_body.len;
+ pkg_free(new_body.s);
+ new_body.s = NULL;
}
+ /* doc or element found */
+ ctype = &xcaps_str_appxml;
+ if(xuri.type==RESOURCE_LIST)
+ ctype = &xcaps_str_apprlxml;
+ else if(xuri.type==PRES_RULES)
+ ctype = &xcaps_str_appapxml;
+ else if(xuri.type==RLS_SERVICE)
+ ctype = &xcaps_str_apprsxml;
+ else if(xuri.type==USER_PROFILE)
+ ctype = &xcaps_str_appupxml;
+ else if(xuri.type==PRES_CONTENT)
+ ctype = &xcaps_str_apppcxml;
+ else if(xuri.type==PIDF_MANIPULATION)
+ ctype = &xcaps_str_apppdxml;
+ xcaps_send_reply(msg, 200, &xcaps_str_ok, &etag,
+ ctype, &body);
+
break;
}
return 1;
error:
+ if (new_body.s) pkg_free(new_body.s);
xcaps_send_reply(msg, 500, &xcaps_str_srverr, NULL,
NULL, NULL);
return -1;