📄 torture_sip.c
字号:
"Extension-Header: extended, more\r\n" "Reason: SIP;cause=400;text=\"Bad Message\"\r\n" "Contact: <sip:bar@pc.foo:5060>;audio\r\n" "Date: Wed, 25 Mar 2004 14:49:29 GMT\r\n" "Max-Forwards: 80\r\n" "Min-Expires: 30\r\n" "Expires: Wed, 25 Mar 2004 15:49:29 GMT\r\n" "Retry-After: 48;duration=321\r\n" "Record-Route: <sip:record-route@proxy.bar;maddr=172.21.40.40>\r\n" "Event: presence;id=1\r\n" "Allow-Events: presence, presence.winfo\r\n" "Subscription-State: active;expires=1800\r\n" "Call-Info: <http://www.bar.com/xcap/joe/>;purpose=xcap\r\n" "Error-Info: <http://www.bar.com/xcap/joe/errors>;param=xcap\r\n" "Server: None\r\n" "Timestamp: 3289129810.798259 0.084054\r\n" "SIP-ETag: foobar\r\n" "SIP-If-Match: foobar\r\n" "Requires: vnd.nokia\r\n" "Unsupported: vnd.nokia.pic\r\n" "Accept-Disposition: filter\r\n" "Warning: 399 presence.bar:5060 \"Unimplemented filter\"\r\n" "RSeq: 421414\r\n" "Refer-To: <sip:hsdf@cdwf.xcfw.com?Subject=test&Organization=Bar>\r\n" "WWW-Authenticate: Digest realm=\"foo\"\r\n" "Proxy-Authenticate: Digest realm=\"foo\"\r\n" "Security-Server: tls;q=0.2\r\n" "Session-Expires: 1200;refresher=uac\r\n" "Content-Length: 7\r\n" "Content-Type: text/plain;charset=iso8859-1\r\n" "\r\n" "Heippa!"); sip = sip_object(msg); TEST_1(msg); TEST_1(sip); TEST_1(!sip->sip_error); for (h = (msg_header_t *)sip->sip_status; h; h = h->sh_succ) { char b[80]; int n; if (h == (sip_header_t*)sip->sip_payload) break; TEST_1(h1 = sip_header_dup(home, h)); n = sip_header_e(b, sizeof b, h1, 0); TEST(n, h->sh_len); TEST_M(b, h->sh_data, n); su_free(home, h1); } TEST_1(sip->sip_etag); TEST_S(sip->sip_etag->g_value, "foobar"); TEST_1(sip->sip_if_match); msg_destroy(msg), msg = NULL; su_home_check(home); su_home_zap(home); home = su_home_new(sizeof *home); TEST_1(home); msg = read_message(0, "SIP/2.0 200 Ok\r\n" "Via: SIP/2.0/UDP 135.180.130.133\r\n" "Via: SIP/2.0/UDP 135.180.130.130:5060\r\n" "To: Joe User <sip:foo@bar>;tag=deadbeef\r\n" "From: sip:bar@foo;tag=foobar\r\n" "Call-ID: {0h!a0i\"sndaksdj}@[kjsafi3]\r\n" "CSeq: 8912734 SUBSCRIBE\r\n" "Record-Route: <sip:135.180.130.133;lr>\r\n" "Record-Route: <sip:135.180.130.130;lr>\r\n" "Content-Length: 0\r\n" "\r\n"); sip = sip_object(msg); TEST_1(msg); TEST_1(sip); TEST_1(!sip->sip_error); sip->sip_flags |= MSG_FLG_COMPACT; TEST_1(msg_prepare(msg) != 0); TEST_1(c = sip->sip_status->st_common); TEST_M(c->h_data, "SIP/2.0 200 Ok\r\n", c->h_len); TEST_1(c = sip->sip_to->a_common); TEST_M(c->h_data, "t:Joe User<sip:foo@bar>;tag=deadbeef\r\n", c->h_len); TEST_1(c = sip->sip_from->a_common); TEST_M(c->h_data, "f:sip:bar@foo;tag=foobar\r\n", c->h_len); TEST_1(c = sip->sip_call_id->i_common); TEST_M(c->h_data, "i:{0h!a0i\"sndaksdj}@[kjsafi3]\r\n", c->h_len); TEST_1(c = sip->sip_cseq->cs_common); TEST_M(c->h_data, "CSeq:8912734 SUBSCRIBE\r\n", c->h_len); TEST_1(c = sip->sip_via->v_common); TEST_M(c->h_data, "v:SIP/2.0/UDP 135.180.130.133,SIP/2.0/UDP 135.180.130.130:5060\r\n", c->h_len); TEST_1(c = sip->sip_via->v_next->v_common); TEST(c->h_len, 0); TEST_1(c->h_data); TEST_1(c = sip->sip_record_route->r_common); TEST_M(c->h_data, "Record-Route:<sip:135.180.130.133;lr>,<sip:135.180.130.130;lr>\r\n", c->h_len); TEST_1(c = sip->sip_record_route->r_next->r_common); TEST(c->h_len, 0); TEST_1(c->h_data); TEST_1(c = sip->sip_content_length->l_common); TEST_M(c->h_data, "l:0\r\n", c->h_len); END();}#define XTRA(xtra, h) SU_ALIGN(xtra) + sip_header_size((sip_header_t*)h)/** Test header filtering and duplicating */int tag_test(void){ su_home_t *home = su_home_new(sizeof(*home)); sip_request_t *request = sip_request_make(home, "INVITE sip:joe@example.com SIP/2.0"); sip_to_t *to = sip_to_make(home, "Joe User <sip:joe.user@example.com;param=1>" ";tag=12345678"); sip_via_t *via = sip_via_make(home, "SIP/2.0/UDP sip.example.com" ";maddr=128.12.9.254" ";branch=289412978y641.321312"); url_t *url = url_hdup(home, (url_t *)"sip:test:pass@example.com;baz=1?foo&bar"); tagi_t *lst, *dup; int xtra; tag_value_t v; BEGIN(); su_home_check(home); TEST_1(home && request && to && via); lst = tl_list(SIPTAG_REQUEST(request), SIPTAG_TO(to), SIPTAG_VIA(via), URLTAG_URL(url), TAG_NULL()); xtra = 0; xtra += XTRA(xtra, request); xtra += XTRA(xtra, to); xtra += XTRA(xtra, via); xtra += SU_ALIGN(xtra) + sizeof(*url) + url_xtra(url); TEST(tl_len(lst), 5 * sizeof(tagi_t)); TEST(tl_xtra(lst, 0), xtra); dup = tl_adup(NULL, lst); TEST(dup != NULL, 1); TEST(tl_len(dup), 5 * sizeof(tagi_t)); TEST(tl_xtra(dup, 0), xtra); if (tstflags & tst_verbatim) tl_print(stdout, "dup:\n", dup); su_free(NULL, dup); tl_vfree(lst); TEST_1(t_scan(siptag_request, home, "INVITE sip:example.org SIP/2.0", &v)); TEST_1(request = (void *)v); TEST_1(request->rq_common->h_class == sip_request_class); TEST_S(request->rq_method_name, "INVITE"); TEST_S(request->rq_version, "SIP/2.0"); TEST_1(t_scan(siptag_to, home, "Example <sip:example.org>;tag=foo", &v)); TEST_1(to = (void *)v); TEST_1(to->a_common->h_class == sip_to_class); TEST_S(to->a_display, "Example"); TEST_S(to->a_tag, "foo"); su_home_check(home); su_home_zap(home); END();}/** Test advanced tag features */static int parser_tag_test(void){ tagi_t *lst, *dup, *filter1, *filter2, *filter3, *filter4; tagi_t *b1, *b2, *b3, *b4; msg_t *msg; sip_t *sip; su_home_t *home; int xtra; BEGIN(); home = su_home_create(); msg = read_message(MSG_DO_EXTRACT_COPY, "SIP/2.0 401 Unauthorized\r\n""Via: SIP/2.0/UDP srlab.sr.ntc.nokia.com:5060;maddr=192.168.102.5\r\n""Via: SIP/2.0/UDP 172.21.9.155\r\n""Record-Route: <sip:garage.sr.ntc.nokia.com:5060;maddr=srlab.sr.ntc.nokia.com>\r\n""From: sip:digest@garage.sr.ntc.nokia.com\r\n""To: sip:digest@garage.sr.ntc.nokia.com\r\n""Call-ID: 982773899-reg@172.21.9.155\r\n""CSeq: 1 REGISTER\r\n""WWW-Authenticate: Digest realm=\"garage.sr.ntc.nokia.com\",\r\n"" nonce=\"MjAwMS0wMS0yMSAxNTowODo1OA==\", algorithm=MD5, qop=\"auth\"\r\n""Proxy-Authenticate: Digest realm=\"IndigoSw\", domain=\"sip:indigosw.com\", ""nonce=\"V2VkIEF1ZyAxNSAxODoxMzozMiBCU1QgMjAwMVtCQDJkYjE5ZA==\", ""opaque=\"NzA3ZjJhYzU4MGY3MzU0MQ==\", stale=false, ""algorithm=md5, algorithm=sha1, qop=\"auth\"\r\n" /* , qop=\"auth, auth-int\"\r */"\r\n"); sip = sip_object(msg); TEST_1(home && msg && sip); TEST(sip->sip_size, sizeof *sip); TEST_1(sip_is_status((sip_header_t *)sip->sip_status)); TEST_1(sip_is_via((sip_header_t *)sip->sip_via)); TEST_1(sip_is_via((sip_header_t *)sip->sip_via->v_next)); TEST_1(sip_is_record_route((sip_header_t *)sip->sip_record_route)); TEST_1(sip_is_from((sip_header_t *)sip->sip_from)); TEST_1(sip_is_to((sip_header_t *)sip->sip_to)); TEST_1(sip_is_call_id((sip_header_t *)sip->sip_call_id)); TEST_1(sip_is_cseq((sip_header_t *)sip->sip_cseq)); TEST_1(sip_is_www_authenticate( (sip_header_t *)sip->sip_www_authenticate)); TEST_1(sip_complete_message(msg) == 0); TEST_1(sip_is_content_length((sip_header_t *)sip->sip_content_length)); TEST(sip->sip_content_length->l_common->h_succ, sip->sip_separator); lst = tl_list(SIPTAG_VIA(sip->sip_via), SIPTAG_RECORD_ROUTE(sip->sip_record_route), TAG_SKIP(2), SIPTAG_CSEQ(sip->sip_cseq), SIPTAG_PAYLOAD(sip->sip_payload), TAG_NULL()); filter1 = tl_list(SIPTAG_VIA(0), TAG_NULL()); filter2 = tl_list(SIPTAG_CALL_ID(0), SIPTAG_FROM(0), SIPTAG_ROUTE(0), SIPTAG_CSEQ(0), TAG_NULL()); filter3 = tl_list(SIPTAG_CSEQ(0), SIPTAG_CONTENT_LENGTH(0), TAG_NULL()); filter4 = tl_list(SIPTAG_STATUS(0), SIPTAG_VIA(0), SIPTAG_RECORD_ROUTE(0), SIPTAG_FROM(0), SIPTAG_TO(0), SIPTAG_CALL_ID(0), SIPTAG_CSEQ(0), SIPTAG_WWW_AUTHENTICATE(0), SIPTAG_PROXY_AUTHENTICATE(0), SIPTAG_CONTENT_LENGTH(0), TAG_NULL()); TEST_1(lst && filter1 && filter2 && filter3 && filter4); b1 = tl_afilter(home, filter1, lst); TEST(tl_len(b1), 2 * sizeof(tagi_t)); TEST_1(((sip_via_t *)b1->t_value)->v_next); xtra = sip_header_size((sip_header_t *)sip->sip_via); xtra += SU_ALIGN(xtra); xtra += sip_header_size((sip_header_t *)sip->sip_via->v_next); TEST(tl_xtra(b1, 0), xtra); dup = tl_adup(home, lst); TEST(tl_len(dup), tl_len(lst)); TEST(tl_xtra(dup, 0), tl_xtra(lst, 0)); tl_vfree(lst); lst = tl_list(SIPTAG_SIP(sip), TAG_NULL()); b2 = tl_afilter(home, filter2, lst); TEST(tl_len(b2), 4 * sizeof(tagi_t)); xtra = 0; xtra += XTRA(xtra, sip->sip_call_id); xtra += XTRA(xtra, sip->sip_from); xtra += XTRA(xtra, sip->sip_cseq); TEST(tl_xtra(b2, 0), xtra); b3 = tl_afilter(home, filter3, lst); TEST(tl_len(b3), 3 * sizeof(tagi_t)); TEST(tl_xtra(b3, 0), sizeof(sip_content_length_t) + sizeof(sip_cseq_t)); b4 = tl_afilter(home, filter4, lst); TEST(tl_len(b4), 11 * sizeof(tagi_t)); xtra = 0; xtra += XTRA(xtra, sip->sip_status); xtra += XTRA(xtra, sip->sip_via); xtra += XTRA(xtra, sip->sip_via->v_next); xtra += XTRA(xtra, sip->sip_record_route); xtra += XTRA(xtra, sip->sip_from); xtra += XTRA(xtra, sip->sip_to); xtra += XTRA(xtra, sip->sip_call_id); xtra += XTRA(xtra, sip->sip_cseq); xtra += XTRA(xtra, sip->sip_www_authenticate); xtra += XTRA(xtra, sip->sip_proxy_authenticate); xtra += XTRA(xtra, sip->sip_content_length); TEST(tl_xtra(b4, 0), xtra); tl_vfree(filter1); tl_vfree(filter2); tl_vfree(filter3); tl_vfree(filter4); tl_vfree(lst); su_home_check(home); su_free(home, b4); su_free(home, b3); su_free(home, b2); su_free(home, dup); su_free(home, b1); su_home_check(home); su_home_destroy(home), su_free(NULL, home); msg_destroy(msg); END();}/** Test error messages */static int response_phrase_test(void){ BEGIN(); { struct { int status; char const *phrase; } const errors[] = { { SIP_100_TRYING }, { SIP_180_RINGING }, { SIP_181_CALL_IS_BEING_FORWARDED }, { SIP_182_QUEUED }, { SIP_183_SESSION_PROGRESS }, { SIP_200_OK }, { SIP_202_ACCEPTED }, { SIP_300_MULTIPLE_CHOICES }, { SIP_301_MOVED_PERMANENTLY }, { SIP_302_MOVED_TEMPORARILY }, { SIP_305_USE_PROXY }, { SIP_380_ALTERNATIVE_SERVICE }, { SIP_400_BAD_REQUEST }, { SIP_401_UNAUTHORIZED }, { SIP_402_PAYMENT_REQUIRED }, { SIP_403_FORBIDDEN }, { SIP_404_NOT_FOUND }, { SIP_405_METHOD_NOT_ALLOWED }, { SIP_406_NOT_ACCEPTABLE }, { SIP_407_PROXY_AUTH_REQUIRED }, { SIP_408_REQUEST_TIMEOUT }, { SIP_409_CONFLICT }, { SIP_410_GONE }, { SIP_411_LENGTH_REQUIRED }, { SIP_413_REQUEST_TOO_LARGE }, { SIP_414_REQUEST_URI_TOO_LONG }, { SIP_415_UNSUPPORTED_MEDIA }, { SIP_416_UNSUPPORTED_URI }, { SIP_420_BAD_EXTENSION }, { SIP_421_EXTENSION_REQUIRED }, { SIP_422_SESSION_TIMER_TOO_SMALL }, { SIP_423_INTERVAL_TOO_BRIEF }, { SIP_423_REGISTRATION_TOO_BRIEF }, { SIP_480_TEMPORARILY_UNAVAILABLE }, { SIP_481_NO_TRANSACTION }, { SIP_481_NO_CALL }, { SIP_482_LOOP_DETECTED }, { SIP_483_TOO_MANY_HOPS }, { SIP_484_ADDRESS_INCOMPLETE }, { SIP_485_AMBIGUOUS }, { SIP_486_BUSY_HERE }, { SIP_487_REQUEST_TERMINATED }, { SIP_487_REQUEST_CANCELLED }, { SIP_488_NOT_ACCEPTABLE }, { SIP_489_BAD_EVENT }, { SIP_491_REQUEST_PENDING }, { SIP_493_UNDECIPHERABLE }, { SIP_500_INTERNAL_SERVER_ERROR }, { SIP_501_NOT_IMPLEMENTED }, { SIP_502_BAD_GATEWAY }, { SIP_503_SERVICE_UNAVAILABLE }, { SIP_504_GATEWAY_TIME_OUT }, { SIP_505_VERSION_NOT_SUPPORTED }, { SIP_513_MESSAGE_TOO_LARGE }, { SIP_600_BUSY_EVERYWHERE }, { SIP_603_DECLINE }, { SIP_604_DOES_NOT_EXIST_ANYWHERE }, { SIP_606_NOT_ACCEPTABLE }, { 0, NULL } }; int i; for (i = 0; errors[i].status; i++) TEST_S(errors[i].phrase, sip_status_phrase(errors[i].status)); } END();}/** Test parser and header manipulation */static int parser_test(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -