int select_msg_first_line(str* res, select_t* s, struct sip_msg* msg) { res->s=SIP_MSG_START(msg); res->len=msg->first_line.len; trim_trailing(res); return 0; }
int select_msg_header(str* res, select_t* s, struct sip_msg* msg) { /* get all headers */ char *c; res->s = SIP_MSG_START(msg) + msg->first_line.len; c = get_body(msg); res->len = c - res->s; return 0; }
static char* xhttp_to_sip(sip_msg_t* msg, int* new_msg_len) { unsigned int len, via_len; char* via, *new_msg, *p; str ip, port; struct hostport hp; struct dest_info dst; ip.s = ip_addr2a(&msg->rcv.src_ip); ip.len = strlen(ip.s); port.s = int2str(msg->rcv.src_port, &port.len); hp.host = &ip; hp.port = &port; init_dst_from_rcv(&dst, &msg->rcv); via = via_builder(&via_len, &dst, 0, 0, &hp); if (via == 0) { LM_DBG("failed to build via\n"); return 0; } len = via_len + msg->len; p = new_msg = pkg_malloc(len + 1); if (new_msg == 0) { LM_DBG("memory allocation failure (%d bytes)\n", len); pkg_free(via); return 0; } /* new message: * <orig first line> * Via: <faked via> * <orig http message w/o the first line> */ memcpy(p, msg->first_line.u.request.method.s, msg->first_line.len); p += msg->first_line.len; memcpy(p, via, via_len); p += via_len; memcpy(p, SIP_MSG_START(msg) + msg->first_line.len, msg->len - msg->first_line.len); new_msg[len] = 0; pkg_free(via); *new_msg_len = len; return new_msg; }