📄 msg_test.c
字号:
static pjsip_msg *create_msg1(pj_pool_t *pool)
{
pjsip_via_hdr *via;
pjsip_route_hdr *route;
pjsip_name_addr *name_addr;
pjsip_sip_uri *url;
pjsip_max_fwd_hdr *max_fwd;
pjsip_to_hdr *to;
pjsip_from_hdr *from;
pjsip_contact_hdr *contact;
pjsip_ctype_hdr *ctype;
pjsip_cid_hdr *cid;
pjsip_clen_hdr *clen;
pjsip_cseq_hdr *cseq;
pjsip_msg *msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG);
pjsip_msg_body *body;
//"SIP/2.0 200 OK\r\n"
msg->line.status.code = 200;
msg->line.status.reason = pj_str("OK");
//"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
via = pjsip_via_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
via->transport = pj_str("SCTP");
via->sent_by.host = pj_str("server10.biloxi.com");
via->branch_param = pj_str("z9hG4bKnashds8");
via->rport_param = 0;
via->recvd_param = pj_str("192.0.2.1");
//"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
via = pjsip_via_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
via->transport = pj_str("UDP");
via->sent_by.host = pj_str("bigbox3.site3.atlanta.com");
via->branch_param = pj_str("z9hG4bK77ef4c2312983.1");
via->recvd_param = pj_str("192.0.2.2");
//"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
via = pjsip_via_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
via->transport = pj_str("UDP");
via->sent_by.host = pj_str("pc33.atlanta.com");
via->branch_param = pj_str("z9hG4bK776asdhds");
via->recvd_param = pj_str("192.0.2.3");
//"Route: <sip:proxy.sipprovider.com>\r\n"
route = pjsip_route_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
url = pjsip_sip_uri_create(pool, PJ_FALSE);
route->name_addr.uri = (pjsip_uri*)url;
url->host = pj_str("proxy.sipprovider.com");
//"Route: <sip:proxy.supersip.com:5060>\r\n"
route = pjsip_route_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
url = pjsip_sip_uri_create(pool, PJ_FALSE);
route->name_addr.uri = (pjsip_uri*)url;
url->host = pj_str("proxy.supersip.com");
url->port = 5060;
//"Max-Forwards: 70\r\n"
max_fwd = pjsip_max_fwd_hdr_create(pool, 70);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)max_fwd);
//"To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
to = pjsip_to_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)to);
name_addr = pjsip_name_addr_create(pool);
name_addr->display = pj_str("Bob");
to->uri = (pjsip_uri*)name_addr;
url = pjsip_sip_uri_create(pool, PJ_FALSE);
name_addr->uri = (pjsip_uri*)url;
url->user = pj_str("bob");
url->host = pj_str("biloxi.com");
to->tag = pj_str("a6c85cf");
//"From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
from = pjsip_from_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)from);
name_addr = pjsip_name_addr_create(pool);
name_addr->display = pj_str("Alice");
from->uri = (pjsip_uri*)name_addr;
url = pjsip_sip_uri_create(pool, PJ_FALSE);
name_addr->uri = (pjsip_uri*)url;
url->user = pj_str("alice");
url->host = pj_str("atlanta.com");
from->tag = pj_str("1928301774");
//"Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
cid = pjsip_cid_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
cid->id = pj_str("a84b4c76e66710@pc33.atlanta.com");
//"CSeq: 314159 INVITE\r\n"
cseq = pjsip_cseq_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
cseq->cseq = 314159;
pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
//"Contact: <sips:bob@192.0.2.4>\r\n"
contact = pjsip_contact_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
name_addr = pjsip_name_addr_create(pool);
contact->uri = (pjsip_uri*)name_addr;
url = pjsip_sip_uri_create(pool, PJ_TRUE);
name_addr->uri = (pjsip_uri*)url;
url->user = pj_str("bob");
url->host = pj_str("192.0.2.4");
//"Content-Type: application/sdp\r\n"
ctype = pjsip_ctype_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
ctype->media.type = pj_str("application");
ctype->media.subtype = pj_str("sdp");
//"Content-Length: 150\r\n"
clen = pjsip_clen_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
clen->len = 150;
// Body
body = PJ_POOL_ZALLOC_T(pool, pjsip_msg_body);
msg->body = body;
body->content_type.type = pj_str("application");
body->content_type.subtype = pj_str("sdp");
body->data = (void*)
"v=0\r\n"
"o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
"s=-\r\n"
"t=0 0\r\n"
"c=IN IP4 pc33.atlanta.com\r\n"
"m=audio 3456 RTP/AVP 0 1 3 99\r\n"
"a=rtpmap:0 PCMU/8000\r\n";
body->len = pj_native_strlen((const char*) body->data);
body->print_body = &pjsip_print_text_body;
return msg;
}
/*****************************************************************************/
static pj_status_t simple_test(void)
{
unsigned i;
pj_status_t status;
PJ_LOG(3,(THIS_FILE, " simple test.."));
for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
pj_pool_t *pool;
pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
status = test_entry( pool, &test_array[i] );
pjsip_endpt_release_pool(endpt, pool);
if (status != PJ_SUCCESS)
return status;
}
return PJ_SUCCESS;
}
static int msg_benchmark(unsigned *p_detect, unsigned *p_parse,
unsigned *p_print)
{
pj_status_t status;
pj_pool_t *pool;
int i, loop;
pj_timestamp zero;
pj_time_val elapsed;
pj_highprec_t avg_detect, avg_parse, avg_print, kbytes;
pj_bzero(&var, sizeof(var));
zero.u64 = 0;
for (loop=0; loop<LOOP; ++loop) {
for (i=0; i<(int)PJ_ARRAY_SIZE(test_array); ++i) {
pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
status = test_entry( pool, &test_array[i] );
pjsip_endpt_release_pool(endpt, pool);
if (status != PJ_SUCCESS)
return status;
}
}
kbytes = var.detect_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
elapsed = pj_elapsed_time(&zero, &var.detect_time);
avg_detect = pj_elapsed_usec(&zero, &var.detect_time);
pj_highprec_mul(avg_detect, AVERAGE_MSG_LEN);
pj_highprec_div(avg_detect, var.detect_len);
avg_detect = 1000000 / avg_detect;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB detected in %d.%03ds (avg=%d msg detection/sec)",
(unsigned)(var.detect_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_detect));
*p_detect = (unsigned)avg_detect;
kbytes = var.parse_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
elapsed = pj_elapsed_time(&zero, &var.parse_time);
avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
pj_highprec_mul(avg_parse, AVERAGE_MSG_LEN);
pj_highprec_div(avg_parse, var.parse_len);
avg_parse = 1000000 / avg_parse;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB parsed in %d.%03ds (avg=%d msg parsing/sec)",
(unsigned)(var.parse_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_parse));
*p_parse = (unsigned)avg_parse;
kbytes = var.print_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
elapsed = pj_elapsed_time(&zero, &var.print_time);
avg_print = pj_elapsed_usec(&zero, &var.print_time);
pj_highprec_mul(avg_print, AVERAGE_MSG_LEN);
pj_highprec_div(avg_print, var.print_len);
avg_print = 1000000 / avg_print;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB printed in %d.%03ds (avg=%d msg print/sec)",
(unsigned)(var.print_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_print));
*p_print = (unsigned)avg_print;
return status;
}
/*****************************************************************************/
/* Test various header parsing and production */
static int hdr_test_success(pjsip_hdr *h);
static int hdr_test_accept0(pjsip_hdr *h);
static int hdr_test_accept1(pjsip_hdr *h);
static int hdr_test_accept2(pjsip_hdr *h);
static int hdr_test_allow0(pjsip_hdr *h);
static int hdr_test_authorization(pjsip_hdr *h);
static int hdr_test_cid(pjsip_hdr *h);
static int hdr_test_contact0(pjsip_hdr *h);
static int hdr_test_contact1(pjsip_hdr *h);
static int hdr_test_content_length(pjsip_hdr *h);
static int hdr_test_content_type(pjsip_hdr *h);
static int hdr_test_from(pjsip_hdr *h);
static int hdr_test_proxy_authenticate(pjsip_hdr *h);
static int hdr_test_record_route(pjsip_hdr *h);
static int hdr_test_supported(pjsip_hdr *h);
static int hdr_test_to(pjsip_hdr *h);
static int hdr_test_via(pjsip_hdr *h);
#define GENERIC_PARAM "p0=a;p1=\"ab:;cd\";p2=ab%3acd;p3"
#define GENERIC_PARAM_PARSED "p0=a;p1=\"ab:;cd\";p2=ab:cd;p3"
#define PARAM_CHAR "[]/:&+$"
#define SIMPLE_ADDR_SPEC "sip:host"
#define ADDR_SPEC SIMPLE_ADDR_SPEC ";"PARAM_CHAR"="PARAM_CHAR ";p1=\";\""
#define NAME_ADDR "<" ADDR_SPEC ">"
#define HDR_FLAG_PARSE_FAIL 1
#define HDR_FLAG_DONT_PRINT 2
struct hdr_test_t
{
char *hname;
char *hshort_name;
char *hcontent;
int (*test)(pjsip_hdr*);
unsigned flags;
} hdr_test_data[] =
{
{
/* Empty Accept */
"Accept", NULL,
"",
&hdr_test_accept0
},
{
/* Overflowing generic string header */
"Accept", NULL,
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
"a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a",
&hdr_test_success,
HDR_FLAG_PARSE_FAIL
},
{
/* Normal Accept */
"Accept", NULL,
"application/*, text/plain",
&hdr_test_accept1
},
{
/* Accept with params */
"Accept", NULL,
"application/*;p1=v1, text/plain",
&hdr_test_accept2
},
{
/* Empty Allow */
"Allow", NULL,
"",
&hdr_test_allow0,
},
{
/* Authorization, testing which params should be quoted */
"Authorization", NULL,
"Digest username=\"username\", realm=\"realm\", nonce=\"nonce\", " \
"uri=\"sip:domain\", response=\"RESPONSE\", algorithm=MD5, " \
"cnonce=\"CNONCE\", opaque=\"OPAQUE\", qop=auth, nc=00000001",
&hdr_test_authorization
},
{
/* Call ID */
"Call-ID", "i",
"-.!%*_+`'~()<>:\\\"/[]?{}",
&hdr_test_cid,
},
{
/* Parameter belong to hparam */
"Contact", "m",
SIMPLE_ADDR_SPEC ";p1=v1",
&hdr_test_contact0,
HDR_FLAG_DONT_PRINT
},
{
/* generic-param in Contact header */
"Contact", "m",
NAME_ADDR ";" GENERIC_PARAM,
&hdr_test_contact1
},
{
/* Content-Length */
"Content-Length", "l",
"10",
&hdr_test_content_length
},
{
/* Content-Type, with generic-param */
"Content-Type", "c",
"application/sdp" ";" GENERIC_PARAM,
&hdr_test_content_type,
HDR_FLAG_DONT_PRINT
},
{
/* From, testing parameters and generic-param */
"From", "f",
NAME_ADDR ";" GENERIC_PARAM,
&hdr_test_from
},
{
/* Proxy-Authenticate, testing which params should be quoted */
"Proxy-Authenticate", NULL,
"Digest realm=\"realm\",domain=\"sip:domain\",nonce=\"nonce\"," \
"opaque=\"opaque\",stale=true,algorithm=MD5,qop=\"auth\"",
&hdr_test_proxy_authenticate
},
{
/* Record-Route, param belong to header */
"Record-Route", NULL,
NAME_ADDR ";" GENERIC_PARAM,
&hdr_test_record_route
},
{
/* Empty Supported */
"Supported", "k",
"",
&hdr_test_supported,
},
{
/* To */
"To", "t",
NAME_ADDR ";" GENERIC_PARAM,
&hdr_test_to
},
{
/* Via */
"Via", "v",
"SIP/2.0/XYZ host" ";" GENERIC_PARAM,
&hdr_test_via
}
};
static int hdr_test_success(pjsip_hdr *h)
{
PJ_UNUSED_ARG(h);
return 0;
}
/* "" */
static int hdr_test_accept0(pjsip_hdr *h)
{
pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
if (h->type != PJSIP_H_ACCEPT)
return -1010;
if (hdr->count != 0)
return -1020;
return 0;
}
/* "application/ *, text/plain\r\n" */
static int hdr_test_accept1(pjsip_hdr *h)
{
pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
if (h->type != PJSIP_H_ACCEPT)
return -1110;
if (hdr->count != 2)
return -1120;
if (pj_strcmp2(&hdr->values[0], "application/*"))
return -1130;
if (pj_strcmp2(&hdr->values[1], "text/plain"))
return -1140;
return 0;
}
/* "application/ *;p1=v1, text/plain\r\n" */
static int hdr_test_accept2(pjsip_hdr *h)
{
pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
if (h->type != PJSIP_H_ACCEPT)
return -1210;
if (hdr->count != 2)
return -1220;
if (pj_strcmp2(&hdr->values[0], "application/*;p1=v1"))
return -1230;
if (pj_strcmp2(&hdr->values[1], "text/plain"))
return -1240;
return 0;
}
/* "" */
static int hdr_test_allow0(pjsip_hdr *h)
{
pjsip_allow_hdr *hdr = (pjsip_allow_hdr*)h;
if (h->type != PJSIP_H_ALLOW)
return -1310;
if (hdr->count != 0)
return -1320;
return 0;
}
/*
"Digest username=\"username\", realm=\"realm\", nonce=\"nonce\", " \
"uri=\"sip:domain\", response=\"RESPONSE\", algorithm=MD5, " \
"cnonce=\"CNONCE\", opaque=\"OPAQUE\", qop=auth, nc=00000001",
*/
static int hdr_test_authorization(pjsip_hdr *h)
{
pjsip_authorization_hdr *hdr = (pjsip_authorization_hdr*)h;
if (h->type != PJSIP_H_AUTHORIZATION)
return -1410;
if (pj_strcmp2(&hdr->scheme, "Digest"))
return -1420;
if (pj_strcmp2(&hdr->credential.digest.username, "username"))
return -1421;
if (pj_strcmp2(&hdr->credential.digest.realm, "realm"))
return -1422;
if (pj_strcmp2(&hdr->credential.digest.nonce, "nonce"))
return -1423;
if (pj_strcmp2(&hdr->credential.digest.uri, "sip:domain"))
return -1424;
if (pj_strcmp2(&hdr->credential.digest.response, "RESPONSE"))
return -1425;
if (pj_strcmp2(&hdr->credential.digest.algorithm, "MD5"))
return -1426;
if (pj_strcmp2(&hdr->credential.digest.cnonce, "CNONCE"))
return -1427;
if (pj_strcmp2(&hdr->credential.digest.opaque, "OPAQUE"))
return -1428;
if (pj_strcmp2(&hdr->credential.digest.qop, "auth"))
return -1429;
if (pj_strcmp2(&hdr->credential.digest.nc, "00000001"))
return -1430;
return 0;
}
/*
"-.!%*_+`'~()<>:\\\"/[]?{}\r\n"
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -