Skip to content

Commit 7a879ab

Browse files
author
Dudu Ben Moshe
committed
Add sip2json pvar
1 parent d0f238c commit 7a879ab

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

pvar.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3618,6 +3618,71 @@ static int pv_get_xlog_level(struct sip_msg *msg, pv_param_t *param, pv_value_t
36183618
return 0;
36193619
}
36203620

3621+
static int pv_get_sip2json(struct sip_msg *msg, pv_param_t *param,
3622+
pv_value_t *res)
3623+
{
3624+
cJSON *ret, *aux, *aux2, *arr;
3625+
struct hdr_field* it;
3626+
char hdr_name_buf[255];
3627+
str json_ret;
3628+
3629+
if(msg==NULL)
3630+
return -1;
3631+
3632+
if(parse_headers(msg, HDR_EOH_F, 0) < 0)
3633+
return pv_get_null(msg, param, res);
3634+
3635+
ret = cJSON_CreateObject();
3636+
3637+
/* first line */
3638+
aux = cJSON_CreateStr(msg->buf,msg->first_line.len);
3639+
if (!aux) {
3640+
return pv_get_null(msg, param, res);
3641+
}
3642+
cJSON_AddItemToObject(ret,"first_line",aux);
3643+
3644+
/* headers */
3645+
aux = cJSON_CreateObject();
3646+
for (it=msg->headers;it;it=it->next) {
3647+
memcpy(hdr_name_buf,it->name.s,it->name.len);
3648+
hdr_name_buf[it->name.len] = 0;
3649+
3650+
arr = cJSON_GetObjectItem(aux, hdr_name_buf);
3651+
if (!arr) {
3652+
arr = cJSON_CreateArray();
3653+
cJSON_AddItemToObject(aux,hdr_name_buf,arr);
3654+
}
3655+
3656+
aux2 = cJSON_CreateStr(it->body.s,it->body.len);
3657+
if (!aux2) {
3658+
return pv_get_null(msg, param, res);
3659+
}
3660+
3661+
cJSON_AddItemToArray(arr,aux2);
3662+
}
3663+
cJSON_AddItemToObject(ret,"headers",aux);
3664+
3665+
/* body */
3666+
if (msg->body) {
3667+
aux = cJSON_CreateStr(msg->body->body.s,msg->body->body.len);
3668+
if (!aux) {
3669+
return pv_get_null(msg, param, res);
3670+
}
3671+
cJSON_AddItemToObject(ret,"body",aux);
3672+
}
3673+
3674+
json_ret.s = cJSON_Print(ret);
3675+
if (!json_ret.s) {
3676+
return pv_get_null(msg, param, res);
3677+
}
3678+
cJSON_Minify(json_ret.s);
3679+
json_ret.len = strlen(json_ret.s);
3680+
3681+
cJSON_Delete(ret);
3682+
return pv_get_strval(msg, param, res, &json_ret);
3683+
}
3684+
3685+
36213686
/************** Boolean consts *****************/
36223687

36233688
static const pv_value_t pv_true = {
@@ -4201,6 +4266,9 @@ const pv_export_t _pv_names_table[] = {
42014266
0, 0, 0, 0 },
42024267
{str_const_init("xlog_level"), PVT_XLOG_LEVEL, pv_get_xlog_level,
42034268
pv_set_xlog_level, 0, 0, 0, 0 },
4269+
{{"sip2json", (sizeof("sip2json")-1)}, /* */
4270+
PVT_SIP2JSON, pv_get_sip2json, 0,
4271+
0, 0, 0, 0},
42044272
{{0,0}, 0, 0, 0, 0, 0, 0, 0}
42054273
};
42064274

pvar.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ enum _pv_type {
136136
PVT_JSON,
137137
/* registered by xml module */
138138
PVT_XML,
139+
/* sip 2 json pvar */
140+
PVT_SIP2JSON,
139141

140142
PVT_EXTRA /* keep it last */
141143
};

0 commit comments

Comments
 (0)