⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 torture_url.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * This file is part of the Sofia-SIP package * * Copyright (C) 2005 Nokia Corporation. * * Contact: Pekka Pessi <pekka.pessi@nokia.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * *//**@CFILE torture_url.c Test functions for url parser * * @author Pekka Pessi <Pekka.Pessi@nokia.com> * * @date Created: Tue Aug 21 15:18:26 2001 ppessi */#include "config.h"#include <stddef.h>#include <stdlib.h>#include <string.h>#include <limits.h>#include <stdio.h>#include <assert.h>#include "sofia-sip/url.h"#include "sofia-sip/url_tag.h"static int tstflags = 0;#define TSTFLAGS tstflags#include <sofia-sip/tstdef.h>char const name[] = "torture_url";unsigned char hash1[16], hash2[16];/* test unquoting and canonizing */int test_quote(void){  su_home_t home[1] = { SU_HOME_INIT(home) };  url_t *u;  char s[] = "%73ip:q%74est%01:%01%02%00@host%2enokia.com;%70aram=%01%02";  char c[] = "sip:qtest%01:%01%02%00@host.nokia.com;param=%01%02";  char *d;#define RESERVED        ";/?:@&=+$,"#define DELIMS          "<>#%\""#define UNWISE		"{}|\\^[]`"#define EXCLUDED	RESERVED DELIMS UNWISE  char escaped[1 + 3 * 23 + 1];#define UNRESERVED    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \                      "abcdefghijklmnopqrstuvwxyz" \                      "0123456789" \                      "-_.!~*'()"    char unreserved[26 + 26 + 10 + 9 + 1];    BEGIN();  d = url_as_string(home, (url_t *)"sip:joe@example.com");  TEST_S(d, "sip:joe@example.com");  TEST(strlen(EXCLUDED), 23);  TEST(strlen(UNRESERVED), 71);  TEST_1(!url_reserved_p("foo"));  TEST_1(!url_reserved_p(""));  TEST_1(url_reserved_p("foobar:bar"));  TEST_SIZE(url_esclen("a" EXCLUDED, ""), 	    1 + strlen(RESERVED) + 3 * strlen(DELIMS UNWISE));  TEST_SIZE(url_esclen("a" EXCLUDED, DELIMS UNWISE), 	    1 + strlen(RESERVED) + 3 * strlen(DELIMS UNWISE));  TEST_SIZE(url_esclen("a" EXCLUDED, EXCLUDED), 1 + 3 * strlen(EXCLUDED));  TEST_SIZE(url_esclen("a" EXCLUDED, NULL), 1 + 3 * strlen(EXCLUDED));  TEST_S(url_escape(escaped, "a" EXCLUDED, NULL),	 "a%3B%2F%3F%3A%40%26%3D%2B%24%2C"	 "%3C%3E%23%25%22"	 "%7B%7D%7C%5C%5E%5B%5D%60");  TEST_S(url_unescape(escaped, escaped), "a" EXCLUDED);  TEST_SIZE(url_esclen(UNRESERVED, NULL), strlen(UNRESERVED));  TEST_S(url_escape(unreserved, UNRESERVED, NULL), UNRESERVED);  TEST_S(url_unescape(unreserved, UNRESERVED), UNRESERVED);  d = "%53ip:%75@%48";		/* Sip:u@H */  u = url_hdup(home, (url_t *)d); TEST_1(u);  url_digest(hash1, sizeof(hash1), u, NULL);  url_digest(hash2, sizeof(hash2), (url_t const *)d, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  d = "sip:u@h";  u = url_hdup(home, (url_t *)d); TEST_1(u);  url_digest(hash1, sizeof(hash1), u, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  url_digest(hash2, sizeof(hash2), (url_t const *)d, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  u = url_hdup(home, (url_t *)s); TEST_1(u);  d = url_as_string(home, u); TEST_1(d);  TEST_S(d, c);  d = "sip:&=+$,;?/:&=+$,@[::1]:56001;param=+$,/:@&;another=@%40%2F"    "?header=" RESERVED "&%3b%2f%3f%3a%40%26%3d%2b%24%2c";  u = url_hdup(home, (url_t *)d); TEST_1(u);  TEST_S(u->url_user, "&=+$,;?/");  TEST_S(u->url_host, "[::1]");  TEST_S(u->url_params, "param=+$,/:@&;another=@%40/");  TEST_S(u->url_headers, "header=" RESERVED "&%3B%2F%3F%3A%40%26%3D%2B%24%2C");  url_digest(hash1, sizeof(hash1), u, NULL);  url_digest(hash2, sizeof(hash2), (url_t const *)d, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  u = url_hdup(home, (url_t *)s); TEST_1(u);  d = url_as_string(home, u); TEST_1(d);  TEST_S(d, c);  d = "http://&=+$,;:&=+$,;@host:8080/foo%2F%3B%3D"    ";param=+$,%2f%3b%3d/bar;param=:@&;another=@"    "?query=" RESERVED;  u = url_hdup(home, (url_t *)d); TEST_1(u);  TEST_S(u->url_user, "&=+$,;"); TEST_S(u->url_password, "&=+$,;");  TEST_S(u->url_path, "foo%2F%3B%3D;param=+$,%2F%3B%3D/bar;param=:@&;another=@");  url_digest(hash1, sizeof(hash1), u, NULL);  url_digest(hash2, sizeof(hash2), (url_t const *)d, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  u = url_hdup(home, (url_t *)s); TEST_1(u);  d = url_as_string(home, u); TEST_1(d);  TEST_S(d, c);  url_digest(hash1, sizeof(hash1), u, NULL);  url_digest(hash2, sizeof(hash2), (url_t const *)s, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  url_digest(hash2, sizeof(hash2), (url_t const *)c, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  END();}int test_any(void){  /* Test any (*) urls */  url_t any[1] = { URL_INIT_AS(any) };  su_home_t home[1] = { SU_HOME_INIT(home) };  url_t *u, url[1];  char *tst;  BEGIN();  TEST_S(url_scheme(url_any), "*");  TEST_S(url_scheme(url_mailto), "mailto");  TEST_S(url_scheme(url_im), "im");  TEST_S(url_scheme(url_cid), "cid");  TEST_S(url_scheme(url_msrp), "msrp");  TEST_S(url_scheme(url_msrps), "msrps");  TEST_1(tst = su_strdup(home, "*"));  TEST(url_d(url, tst), 0);  TEST(url_cmp(any, url), 0);  TEST(url->url_type, url_any);  TEST_1(u = url_hdup(home, url));  TEST(u->url_type, url_any);  TEST(url_cmp(any, u), 0);    url_digest(hash1, sizeof(hash1), url, NULL);  url_digest(hash2, sizeof(hash2), (url_t *)"*", NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  {    char buf[6];        TEST_1(u = url_hdup(home, (void *)"error"));    TEST_SIZE(url_xtra(u), 6);    TEST_SIZE(url_dup(buf, 6, url, u), 6);    TEST_S(buf, "error");  }  {    TEST_1(u = url_hdup(home, (void *)"scheme:test"));    TEST(u->url_type, url_unknown);  }  {    TEST_1(u = url_hdup(home, (void *)"*;param=foo?query=bar"));    TEST(u->url_type, url_unknown);    TEST_S(u->url_host, "*");    TEST_S(u->url_params, "param=foo");    TEST_S(u->url_headers, "query=bar");  }  {    TEST_1(u = url_hdup(home, (void *)"#foo"));    TEST(u->url_type, url_unknown);    TEST_S(u->url_fragment, "foo");  }  {    url_t u[1];    char b2[6] = "";    memset(u, 0xff, sizeof u);    TEST(url_d(u, b2), 0);    TEST(u->url_type, url_unknown);  }  su_home_deinit(home);    END();}int test_sip(void){  /* sip urls */  su_home_t home[1] = { SU_HOME_INIT(home) };  url_t sip[1] = { URL_INIT_AS(sip) };  url_t *u, url[1];  char *tst, *s;  char sipurl0[] =     "sip:pekka%2Epessi@nokia%2Ecom;method=%4D%45%53%53%41%47%45"    "?body=CANNED%20MSG";  char sipurl[] =     "sip:user:pass@host:32;param=1"    "?From=foo@bar&To=bar@baz#unf";  char sip2url[] =     "sip:user/path;tel-param:pass@host:32;param=1%3d%3d1"    "?From=foo@bar&To=bar@baz#unf";  char sip2[sizeof(sipurl) + 32];  char sipsurl[] =     "sips:user:pass@host:32;param=1"    "?From=foo@bar&To=bar@baz#unf";  size_t i, j;  url_t *a, *b;  BEGIN();  TEST_S(url_scheme(url_sip), "sip");  TEST_S(url_scheme(url_sips), "sips");  memset(url, 255, sizeof url);  TEST(url_d(url, sipurl0), 0);  TEST(url->url_type, url_sip);  TEST(url->url_root, 0);  TEST_S(url->url_scheme, "sip");  TEST_S(url->url_user, "pekka.pessi");  TEST_P(url->url_password, NULL);  TEST_S(url->url_host, "nokia.com");  TEST_P(url->url_port, NULL);  TEST_P(url->url_path, NULL);  TEST_S(url->url_params, "method=MESSAGE");  TEST_S(url->url_headers, "body=CANNED%20MSG");  TEST_P(url->url_fragment, NULL);  TEST_S(url_query_as_header_string(home, url->url_headers),	 "\n\nCANNED MSG");    sip->url_user = "user";  sip->url_password = "pass";  sip->url_host = "host";  sip->url_port = "32";  sip->url_params = "param=1";  sip->url_headers = "From=foo@bar&To=bar@baz";  sip->url_fragment = "unf";  memset(url, 255, sizeof url);  TEST_1(tst = su_strdup(home, sipurl));  TEST_1(url_d(url, tst) == 0);  TEST_1(url_cmp(sip, url) == 0);  TEST(url->url_type, url_sip);  TEST_1(u = url_hdup(home, url));  TEST(u->url_type, url_sip);  TEST_1(url_cmp(sip, u) == 0);  TEST(url_e(sip2, sizeof(sip2), u), strlen(sipurl));  TEST_1(strcmp(sip2, sipurl) == 0);  TEST_SIZE(snprintf(sip2, sizeof(sip2), URL_PRINT_FORMAT, 		     URL_PRINT_ARGS(sip)), strlen(sipurl));  TEST_1(strcmp(sip2, sipurl) == 0);  url_digest(hash1, sizeof(hash1), url, NULL);  url_digest(hash2, sizeof(hash2), (url_t const *)sipurl, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  TEST_1(tst = su_strdup(home, sip2url));  TEST_1(url_d(url, tst) == 0);  TEST_S(url->url_user, "user/path;tel-param");  TEST_S(url->url_params, "param=1%3D%3D1");  TEST_S(url_query_as_header_string(home, url->url_headers),	 "From:foo@bar\nTo:bar@baz");  url_digest(hash1, sizeof(hash1), url, NULL);  url_digest(hash2, sizeof(hash2), (url_t *)sip2url, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  sip->url_type = url_sips; sip->url_scheme = "sips";  TEST_1(tst = su_strdup(home, sipsurl));  TEST_1(url_d(url, tst) == 0);  TEST_1(url_cmp(sip, url) == 0);  TEST(url->url_type, url_sips);  /* Test url_dup() */  for (i = 0; i <= sizeof(sipsurl); i++) {    char buf[sizeof(sipsurl) + 1];    url_t dst[1];    buf[i] = '\377';    TEST_SIZE(url_dup(buf, i, dst, url), sizeof(sipsurl) - 1 - strlen("sips"));    TEST(buf[i], '\377');  }  url_digest(hash1, sizeof(hash1), url, NULL);  url_digest(hash2, sizeof(hash2), (url_t *)sipsurl, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  u = url_hdup(home, (url_t*)"SIP:test@127.0.0.1:55"); TEST_1(u);  TEST(u->url_type, url_sip);  TEST_P(url_hdup(home, (url_t*)"sip:test@127.0.0.1::55"), NULL);  TEST_P(url_hdup(home, (url_t*)"sip:test@127.0.0.1:55:"), NULL);  TEST_P(url_hdup(home, (url_t*)"sip:test@127.0.0.1:sip"), NULL);  u = url_hdup(home, (url_t*)"SIP:#**00**#;foo=/bar@127.0.0.1"); TEST_1(u);  TEST(u->url_type, url_sip);  TEST_S(u->url_user, "#**00**#;foo=/bar");  TEST_1(!url_hdup(home, (url_t*)"SIP:#**00**#;foo=/bar@#127.0.0.1"));  TEST_1(!url_hdup(home, (url_t*)"SIP:#**00**#;foo=/bar;127.0.0.1"));  for (i = 32; i <= 256; i++) {    char pu[512];    char param[512];    for (j = 0; j < i; j++)      param[j] = 'x';    param[j] = '\0';    memcpy(param, "x=", 2);    snprintf(pu, sizeof(pu), "sip:test@host;%s", param);    u = url_hdup(home, (url_t*)pu); TEST_1(u);    s = url_as_string(home, u);    TEST_S(pu, s);  }  s = su_strdup(home, "ttl;transport=tcp;ttl=15;ttl=;method=INVITE;ttl");  TEST_1(s);  s = url_strip_param_string(s, "ttl");  TEST_S(s, "transport=tcp;method=INVITE");  u = url_hdup(home, (void*)"sip:u:p@host:5060;maddr=127.0.0.1;transport=tcp");  TEST_1(u);  TEST_1(url_have_transport(u));  TEST_1(url_strip_transport(u));  TEST_P(u->url_params, NULL);  TEST_1(!url_have_transport(u));  u = url_hdup(home, (void*)"sip:u:p@host:5060;user=phone;ttl=1;isfocus");  TEST_1(u);  TEST_1(url_have_transport(u));  TEST_1(url_strip_transport(u));  TEST_S(u->url_params, "user=phone;isfocus");  TEST_1(!url_have_transport(u));  u = url_hdup(home, (void*)"sip:u:p@host:5060;maddr=127.0.0.1;user=phone");  TEST_1(u);  TEST_1(url_have_transport(u));  TEST_1(url_strip_transport(u));  TEST_S(u->url_params, "user=phone");  TEST_1(!url_have_transport(u));  u = url_hdup(home, (void*)"sip:u:p@host:5060;user=phone;transport=tcp");  TEST_1(u);  TEST_1(url_have_transport(u));    TEST_1(url_strip_transport(u));  TEST_S(u->url_params, "user=phone");  TEST_1(!url_have_transport(u));    u = url_hdup(home, (void*)"sip:u:p@host;user=phone;;");  TEST_1(u);  /* We don't have transport params */  TEST_1(!url_have_transport(u));  /* ...but we still strip empty params */  TEST_1(url_strip_transport(u));  TEST_S(u->url_params, "user=phone");  TEST_1(!url_have_transport(u));  u = url_hdup(home, (void*)"sip:u:p@host:5060;ttl=1;isfocus;transport=udp;");  TEST_1(u);  TEST_1(url_have_transport(u));  TEST_1(url_strip_transport(u));  TEST_S(u->url_params, "isfocus");  TEST_1(!url_have_transport(u));  u = url_hdup(home, (void *)"sip:%22foo%22@172.21.55.55:5060");  TEST_1(u);  TEST_S(u->url_user, "%22foo%22");  a = url_hdup(home, (void *)"sip:172.21.55.55:5060");  b = url_hdup(home, (void *)"sip:172.21.55.55");  TEST_1(a); TEST_1(b);  TEST_1(url_cmp(a, b) == 0);  TEST(url_cmp_all(a, b), 0);  a = url_hdup(home, (void *)"sips:172.21.55.55:5060");  b = url_hdup(home, (void *)"sips:172.21.55.55");  TEST_1(a); TEST_1(b);  TEST_1(url_cmp(a, b) != 0);  TEST_1(url_cmp_all(a, b) < 0);  a = url_hdup(home, (void *)"sips:172.21.55.55:5061");  b = url_hdup(home, (void *)"sips:172.21.55.55");  TEST_1(a); TEST_1(b);  TEST_1(url_cmp(a, b) == 0);  TEST(url_cmp_all(a, b), 0);  a = url_hdup(home, (void *)"sip:my.domain:5060");  b = url_hdup(home, (void *)"sip:my.domain");  TEST_1(a); TEST_1(b);  TEST_1(url_cmp(a, b) > 0);  TEST_1(url_cmp_all(a, b) > 0);  a = url_hdup(home, (void *)"sips:my.domain:5061");  b = url_hdup(home, (void *)"sips:my.domain");  TEST_1(a); TEST_1(b);  TEST_1(url_cmp(a, b) > 0);  TEST_1(url_cmp_all(a, b) > 0);  a = url_hdup(home, (void *)"sip:my.domain");  b = url_hdup(home, (void *)"SIP:MY.DOMAIN");  TEST_1(a); TEST_1(b);  TEST_1(url_cmp(a, b) == 0);  TEST_1(url_cmp_all(a, b) == 0);  su_home_deinit(home);  END();}int test_wv(void){  /* wv urls */  su_home_t home[1] = { SU_HOME_INIT(home) };  url_t wv[1] = { URL_INIT_AS(wv) };  url_t *u, url[1];  char *tst;  char wvurl[] = "wv:+12345678@imps.com";  char wv2[sizeof(wvurl) + 32];    BEGIN();  TEST_S(url_scheme(url_wv), "wv");  wv->url_user = "+12345678";  wv->url_host = "imps.com";    TEST_1(tst = su_strdup(home, wvurl));  TEST_1(url_d(url, tst) == 0);  TEST_1(url_cmp(wv, url) == 0);  TEST_1(url_cmp(url_hdup(home, (void *)"wv:+12345678@imps.com"), url) == 0);  TEST(url->url_type, url_wv);  TEST_1(u = url_hdup(home, url));  TEST(u->url_type, url_wv);  TEST_1(url_cmp(wv, u) == 0);  TEST_SIZE(url_e(wv2, sizeof(wv2), u), strlen(wvurl));  TEST_1(strcmp(wv2, wvurl) == 0);  TEST_SIZE(snprintf(wv2, sizeof(wv2), URL_PRINT_FORMAT, 		     URL_PRINT_ARGS(wv)), strlen(wvurl));  TEST_1(strcmp(wv2, wvurl) == 0);  url_digest(hash1, sizeof(hash1), url, NULL);  url_digest(hash2, sizeof(hash2), (url_t *)wvurl, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  TEST_1(u = url_hdup(home, (void*)"wv:/managers@imps.com"));  TEST_S(u->url_user, "/managers");  su_home_deinit(home);  END();}int test_tel(void){  /* tel urls: RFC 3906 */  su_home_t home[1] = { SU_HOME_INIT(home) };  url_t tel[1] = { URL_INIT_AS(tel) };  url_t *u, url[1];  char *tst;  char telurl[] =     "tel:+12345678"    ";param=1;param=2"    "?From=foo@bar&To=bar@baz#unf";  char tel2[sizeof(telurl) + 32];  url_t *a, *b;    BEGIN();  TEST_S(url_scheme(url_tel), "tel");  tel->url_user = "+12345678";  tel->url_params = "param=1;param=2";  tel->url_headers = "From=foo@bar&To=bar@baz";  tel->url_fragment = "unf";    TEST_1(tst = su_strdup(home, telurl));  TEST_1(url_d(url, tst) == 0);  TEST_1(url_cmp(tel, url) == 0);  TEST_1(url_cmp(url_hdup(home, (url_t const *)"tel:+12345678"			  ";param=1;param=2"			  "?From=foo@bar&To=bar@baz#unf"), url) == 0);  TEST(url->url_type, url_tel);  TEST_1(u = url_hdup(home, url));  TEST(u->url_type, url_tel);  TEST_1(url_cmp(tel, u) == 0);  TEST_SIZE(url_e(tel2, sizeof(tel2), u), strlen(telurl));  TEST_1(strcmp(tel2, telurl) == 0);  TEST_SIZE(snprintf(tel2, sizeof(tel2), URL_PRINT_FORMAT, 		     URL_PRINT_ARGS(tel)), strlen(telurl));  TEST_1(strcmp(tel2, telurl) == 0);  url_digest(hash1, sizeof(hash1), url, NULL);  url_digest(hash2, sizeof(hash2), (url_t *)telurl, NULL);  TEST(memcmp(hash1, hash2, sizeof(hash1)), 0);  a = url_hdup(home, (void *)"tel:+1.245.62357");  b = url_hdup(home, (void *)"tel:+(1).245.62357");  TEST_1(a); TEST_1(b);  TEST_1(url_cmp(a, b) == 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -