int gzc_msg_received(sr_event_param_t *evp) { sip_msg_t msg; str *obuf; char *nbuf = NULL; str obody; str nbody; unsigned long olen; unsigned long nlen; int ret; obuf = (str*)evp->data; memset(&msg, 0, sizeof(sip_msg_t)); msg.buf = obuf->s; msg.len = obuf->len; if(gzc_prepare_msg(&msg)!=0) { goto done; } if(gzc_skip_msg(&msg)) { goto done; } if(msg.first_line.type==SIP_REQUEST) { if(_gzc_sanity_checks!=0) { if(scb.check_defaults(&msg)<1) { LM_ERR("sanity checks failed\n"); goto done; } } } obody.s = get_body(&msg); if (obody.s==NULL) { LM_DBG("no body for this SIP message\n"); goto done; } obody.len = msg.buf + msg.len - obody.s; /* decompress the body */ nbody.s = _gzc_local_buffer; nlen = BUF_SIZE; olen = obody.len; ret = uncompress((unsigned char*)nbody.s, &nlen, (unsigned char*)obody.s, olen); if(ret!=Z_OK) { LM_ERR("error decompressing body (%d)\n", ret); goto done; } nbody.len = (int)nlen; LM_DBG("body decompressed - old size: %d - new size: %d\n", obody.len, nbody.len); if(gzc_set_msg_body(&msg, &obody, &nbody)<0) { LM_ERR("error replacing body\n"); goto done; } nbuf = gzc_msg_update(&msg, (unsigned int*)&obuf->len); if(obuf->len>=BUF_SIZE) { LM_ERR("new buffer overflow (%d)\n", obuf->len); pkg_free(nbuf); return -1; } memcpy(obuf->s, nbuf, obuf->len); obuf->s[obuf->len] = '\0'; done: if(nbuf!=NULL) pkg_free(nbuf); free_sip_msg(&msg); return 0; }
int th_msg_received(sr_event_param_t *evp) { sip_msg_t msg; str *obuf; char *nbuf = NULL; int direction; int dialog; obuf = (str*)evp->data; memset(&msg, 0, sizeof(sip_msg_t)); msg.buf = obuf->s; msg.len = obuf->len; if(th_prepare_msg(&msg)!=0) { goto done; } if(th_skip_msg(&msg)) { goto done; } direction = 0; th_cookie_value.s = "xx"; th_cookie_value.len = 2; if(msg.first_line.type==SIP_REQUEST) { if(th_sanity_checks!=0) { if(scb.check_defaults(&msg)<1) { LM_ERR("sanity checks failed\n"); goto done; } } dialog = (get_to(&msg)->tag_value.len>0)?1:0; if(dialog) { direction = th_route_direction(&msg); if(direction<0) { LM_ERR("not able to detect direction\n"); goto done; } th_cookie_value.s = (direction==0)?"dc":"uc"; } else { th_cookie_value.s = "di"; } if(dialog) { /* dialog request */ th_unmask_ruri(&msg); th_unmask_route(&msg); th_unmask_refer_to(&msg); if(direction==1) { th_unmask_callid(&msg); } } } else { /* reply */ if(msg.via2==0) { /* one Via in received reply -- it is for local generated request * - nothing to unhide unless is CANCEL/ACK */ if(!((get_cseq(&msg)->method_id)&(METHOD_CANCEL))) goto done; } th_unmask_via(&msg, &th_cookie_value); th_flip_record_route(&msg, 0); if(th_cookie_value.s[0]=='u') { th_cookie_value.s = "dc"; } else { th_cookie_value.s = "uc"; th_unmask_callid(&msg); } th_cookie_value.len = 2; } LM_DBG("adding cookie: %.*s\n", th_cookie_value.len, th_cookie_value.s); th_add_cookie(&msg); nbuf = th_msg_update(&msg, (unsigned int*)&obuf->len); if(obuf->len>=BUF_SIZE) { LM_ERR("new buffer overflow (%d)\n", obuf->len); pkg_free(nbuf); return -1; } memcpy(obuf->s, nbuf, obuf->len); obuf->s[obuf->len] = '\0'; done: if(nbuf!=NULL) pkg_free(nbuf); free_sip_msg(&msg); return 0; }
int tps_msg_received(void *data) { sip_msg_t msg; str *obuf; char *nbuf = NULL; int direction; int dialog; obuf = (str*)data; memset(&msg, 0, sizeof(sip_msg_t)); msg.buf = obuf->s; msg.len = obuf->len; if(tps_prepare_msg(&msg)!=0) { goto done; } if(tps_skip_msg(&msg)) { goto done; } direction = 0; if(msg.first_line.type==SIP_REQUEST) { if(_tps_sanity_checks!=0) { if(scb.check_defaults(&msg)<1) { LM_ERR("sanity checks failed\n"); goto done; } } dialog = (get_to(&msg)->tag_value.len>0)?1:0; if(dialog) { direction = tps_route_direction(&msg); if(direction<0) { LM_ERR("not able to detect direction\n"); goto done; } } if(dialog) { /* dialog request */ tps_request_received(&msg, dialog, direction); } } else { /* reply */ if(msg.first_line.u.reply.statuscode==100) { /* nothing to do - it should be absorbed */ return 0; } tps_response_received(&msg); } nbuf = tps_msg_update(&msg, (unsigned int*)&obuf->len); if(obuf->len>=BUF_SIZE) { LM_ERR("new buffer overflow (%d)\n", obuf->len); pkg_free(nbuf); return -1; } memcpy(obuf->s, nbuf, obuf->len); obuf->s[obuf->len] = '\0'; done: if(nbuf!=NULL) pkg_free(nbuf); free_sip_msg(&msg); return 0; }