Skip to content

Commit

Permalink
pv: new transformations {s.after,char} and {s.before,char}
Browse files Browse the repository at this point in the history
  • Loading branch information
miconda committed Feb 14, 2021
1 parent b4d1def commit 10cfe34
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 1 deletion.
128 changes: 128 additions & 0 deletions src/modules/pv/pv_trans.c
Original file line number Diff line number Diff line change
Expand Up @@ -1316,6 +1316,94 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int subtype,
val->rs.s = int2str(j, &val->rs.len);
break;

case TR_S_BEFORE:
if(tp==NULL)
{
LM_ERR("invalid parameters (cfg line: %d)\n",
get_cfg_crt_line());
return -1;
}
if(!(val->flags&PV_VAL_STR)) {
val->rs.s = int2str(val->ri, &val->rs.len);
}
if(val->rs.len>TR_BUFFER_SIZE-2) {
LM_ERR("value too large: %d\n", val->rs.len);
return -1;
}
if(tp->type==TR_PARAM_STRING)
{
st = tp->v.s;
} else {
if(pv_get_spec_value(msg, (pv_spec_p)tp->v.data, &v)!=0
|| (!(v.flags&PV_VAL_STR)) || v.rs.len<=0)
{
LM_ERR("cannot get parameter value (cfg line: %d)\n",
get_cfg_crt_line());
return -1;
}
st = v.rs;
}
for(i=0; i<val->rs.len; i++) {
if(val->rs.s[i]==st.s[0]) {
break;
}
}
if(i==0) {
_tr_buffer[0] = '\0';
val->rs.len = 0;
} else {
memcpy(_tr_buffer, val->rs.s, i);
val->rs.len = i;
}
val->flags = PV_VAL_STR;
val->rs.s = _tr_buffer;
val->rs.s[val->rs.len] = '\0';
break;

case TR_S_AFTER:
if(tp==NULL)
{
LM_ERR("invalid parameters (cfg line: %d)\n",
get_cfg_crt_line());
return -1;
}
if(!(val->flags&PV_VAL_STR)) {
val->rs.s = int2str(val->ri, &val->rs.len);
}
if(val->rs.len>TR_BUFFER_SIZE-2) {
LM_ERR("value too large: %d\n", val->rs.len);
return -1;
}
if(tp->type==TR_PARAM_STRING)
{
st = tp->v.s;
} else {
if(pv_get_spec_value(msg, (pv_spec_p)tp->v.data, &v)!=0
|| (!(v.flags&PV_VAL_STR)) || v.rs.len<=0)
{
LM_ERR("cannot get parameter value (cfg line: %d)\n",
get_cfg_crt_line());
return -1;
}
st = v.rs;
}
for(i=0; i<val->rs.len; i++) {
if(val->rs.s[i]==st.s[0]) {
break;
}
}
if(i>=val->rs.len-1) {
_tr_buffer[0] = '\0';
val->rs.len = 0;
} else {
memcpy(_tr_buffer, val->rs.s+i+1, val->rs.len-i-1);
val->rs.len = val->rs.len-i-1;
}
val->flags = PV_VAL_STR;
val->rs.s = _tr_buffer;
val->rs.s[val->rs.len] = '\0';
break;

default:
LM_ERR("unknown subtype %d (cfg line: %d)\n",
subtype, get_cfg_crt_line());
Expand Down Expand Up @@ -2786,6 +2874,46 @@ char* tr_parse_string(str* in, trans_t *t)
goto error;
}
goto done;
} else if(name.len==6 && strncasecmp(name.s, "before", 6)==0) {
t->subtype = TR_S_BEFORE;
if(*p!=TR_PARAM_MARKER)
{
LM_ERR("invalid before transformation: %.*s!\n",
in->len, in->s);
goto error;
}
p++;
_tr_parse_sparamx(p, p0, tp, spec, ps, in, s, 1);
t->params = tp;
tp = 0;
while(*p && (*p==' ' || *p=='\t' || *p=='\n')) p++;
if(*p!=TR_RBRACKET)
{
LM_ERR("invalid before transformation: %.*s!!\n",
in->len, in->s);
goto error;
}
goto done;
} else if(name.len==5 && strncasecmp(name.s, "after", 5)==0) {
t->subtype = TR_S_AFTER;
if(*p!=TR_PARAM_MARKER)
{
LM_ERR("invalid after transformation: %.*s!\n",
in->len, in->s);
goto error;
}
p++;
_tr_parse_sparamx(p, p0, tp, spec, ps, in, s, 1);
t->params = tp;
tp = 0;
while(*p && (*p==' ' || *p=='\t' || *p=='\n')) p++;
if(*p!=TR_RBRACKET)
{
LM_ERR("invalid after transformation: %.*s!!\n",
in->len, in->s);
goto error;
}
goto done;
}

LM_ERR("unknown transformation: %.*s/%.*s/%d!\n", in->len, in->s,
Expand Down
3 changes: 2 additions & 1 deletion src/modules/pv/pv_trans.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ enum _tr_s_subtype {
TR_S_ENCODEBASE58, TR_S_DECODEBASE58, TR_S_COREHASH, TR_S_UNQUOTE,
TR_S_UNBRACKET, TR_S_COUNT, TR_S_ENCODEBASE64T, TR_S_DECODEBASE64T,
TR_S_ENCODEBASE64URL, TR_S_DECODEBASE64URL,
TR_S_ENCODEBASE64URLT, TR_S_DECODEBASE64URLT, TR_S_RMWS
TR_S_ENCODEBASE64URLT, TR_S_DECODEBASE64URLT, TR_S_RMWS, TR_S_BEFORE,
TR_S_AFTER
};
enum _tr_uri_subtype {
TR_URI_NONE=0, TR_URI_USER, TR_URI_HOST, TR_URI_PASSWD, TR_URI_PORT,
Expand Down

0 comments on commit 10cfe34

Please sign in to comment.