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

📄 test_nth.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 2 页
字号:
		     HTTP_200_OK, 		     HTTPTAG_CONTENT_TYPE_STR("text/html"),		     HTTPTAG_PAYLOAD_STR("<html><body>sub/</body></html>\n"),		     TAG_END()));  TEST_1(site_create(t, m, "/sub/sub/",		     HTTP_200_OK, 		     HTTPTAG_CONTENT_TYPE_STR("text/html"),		     HTTPTAG_PAYLOAD_STR		     ("<html><body>sub/sub/</body></html>\n"),		     TAG_END()));  TEST_1(sub2 = 	 site_create(t, m, "/sub2/",		     HTTP_200_OK, 		     HTTPTAG_CONTENT_TYPE_STR("text/html"),		     HTTPTAG_PAYLOAD_STR("<html><body>sub2/</body></html>\n"),		     TAG_END()));  TEST_1(site_create(t, sub2, "sub/",		     HTTP_200_OK, 		     HTTPTAG_CONTENT_TYPE_STR("text/html"),		     HTTPTAG_PAYLOAD_STR		     ("<html><body>sub2/sub/</body></html>\n"),		     TAG_END()));#ifndef _WIN32  temp = mkstemp(passwd_name);#else  temp = open(passwd_name, O_WRONLY|O_CREAT|O_TRUNC, 666);#endif  TEST_1(temp != -1);  atexit(remove_tmp);		/* Make sure temp file is unlinked */  TEST_SIZE(write(temp, passwd, strlen(passwd)), strlen(passwd));  TEST_1(close(temp) == 0);  am = auth_mod_create(t->t_root, 		       AUTHTAG_METHOD("Digest"), 		       AUTHTAG_REALM("auth"),		       AUTHTAG_DB(passwd_name),		       TAG_END());  TEST_1(am);  TEST_1(site_create(t, m, "auth/",		     HTTP_200_OK, 		     HTTPTAG_CONTENT_TYPE_STR("text/html"),		     HTTPTAG_PAYLOAD_STR		     ("<html><body>auth/</body></html>\n"),		     NTHTAG_AUTH_MODULE(am),		     TAG_END()));  auth_mod_unref(am);  am = auth_mod_create(t->t_root, 		       AUTHTAG_METHOD("Delayed+Basic"), 		       AUTHTAG_REALM("auth2"),		       AUTHTAG_DB(passwd_name),		       TAG_END());  TEST_1(am);  TEST_1(site_create(t, m, "auth2/",		     HTTP_200_OK, 		     HTTPTAG_CONTENT_TYPE_STR("text/html"),		     HTTPTAG_PAYLOAD_STR		     ("<html><body>auth/</body></html>\n"),		     NTHTAG_AUTH_MODULE(am),		     TAG_END()));  auth_mod_unref(am);  END();}static int send_request(tester_t *t, char const *req, size_t reqlen,			int close_socket,			char reply[], int rlen,			int *return_len){  static su_socket_t c = INVALID_SOCKET;  int m, r;  su_wait_t w[1];  BEGIN();  if (c == INVALID_SOCKET) {    c = su_socket(t->t_addr->su_family, SOCK_STREAM, 0); TEST_1(c != SOCK_STREAM);    TEST_1(su_setblocking(c, 1) != -1);    TEST_1(connect(c, &t->t_addr->su_sa, t->t_addrlen) != -1);    while (su_root_step(t->t_root, 1) == 0);  }  if (reqlen == (size_t)-1)    reqlen = strlen(req);  TEST_SIZE(su_send(c, req, reqlen, 0), reqlen);  if (close_socket == 1)    shutdown(c, 1);  TEST(su_wait_create(w, c, SU_WAIT_IN), 0);  while (su_root_step(t->t_root, 1) == 0 || su_wait(w, 1, 0) < 0);  for (r = 0;;) {    TEST_1((m = recv(c, reply, rlen - r - 1, 0)) != -1);    r += m;    if (m == 0 || r == rlen - 1)      break;  }  reply[r] = '\0';  if (close_socket != -1)    su_close(c), c = -1;  *return_len = r;  END();}int sspace(char const *buffer) {  int m = strcspn(buffer, " ");   if (buffer[m])     m += 1 + strcspn(buffer + m + 1, " ");   return m;}#define CRLF "\r\n"static int test_requests(tester_t *t){  char buffer[4096 + 1];  int m;  BEGIN();  {    static char const get[] =       "GET / HTTP/1.1" CRLF      "Host: 127.0.0.1" CRLF      "User-Agent: Test-Tool" CRLF      "Connection: close" CRLF      CRLF;    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m] = '\0';    TEST_S(buffer, "HTTP/1.1 200");  }  {    static char const get[] =       "GET / HTTP/1.1" CRLF      "Host: 127.0.0.1" CRLF      "User-Agent: Test-Tool" CRLF      "Connection: close" CRLF      CRLF;    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = strcspn(buffer, CRLF); buffer[m] = '\0';    TEST_S(buffer, "HTTP/1.1 200 OK");  }  {    static char const request[] =       "GET %s HTTP/1.1" CRLF      "Host: 127.0.0.1" CRLF      "User-Agent: Test-Tool" CRLF      "Connection: close" CRLF      CRLF;    char *get;    get = su_sprintf(NULL, request, "/sub");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 301");    m += strcspn(buffer + m, CRLF) + 1;    free(get);    get = su_sprintf(NULL, request, "/sub/");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = strcspn(buffer, CRLF); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 200 OK");    TEST_1(strstr(buffer + m, "<body>sub/</body>"));    free(get);    get = su_sprintf(NULL, request, "/sub2/");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = strcspn(buffer, CRLF); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 200 OK");    TEST_1(strstr(buffer + m, "<body>sub2/</body>"));    free(get);    get = su_sprintf(NULL, request, "/sub2/hub");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = strcspn(buffer, CRLF); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 200 OK");    TEST_1(strstr(buffer + m, "<body>sub2/</body>"));    free(get);    /* Test that absolute path for subdir site is calculated correctly */    get = su_sprintf(NULL, request, "/sub2/sub");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 301");    TEST_1(strstr(buffer + m, "/sub2/sub/" CRLF));    free(get);    get = su_sprintf(NULL, request, "/sub2/sub/");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = strcspn(buffer, CRLF); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 200 OK");    TEST_1(strstr(buffer + m, "<body>sub2/sub/</body>"));    free(get);    get = su_sprintf(NULL, request, "/sub/sub");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = strcspn(buffer, CRLF); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 200 OK");    TEST_1(strstr(buffer + m, "<body>sub/sub</body>"));    free(get);    get = su_sprintf(NULL, request, "/auth/");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 401");    free(get);    get = su_sprintf(NULL, request, "/auth2/");    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 401");    free(get);  }  {    static char const get[] =       "GET /auth2/ HTTP/1.1" CRLF      "Host: 127.0.0.1" CRLF      "User-Agent: Test-Tool" CRLF      "Connection: close" CRLF      /* alice:secret in base64 */      "Authorization: Basic YWxpY2U6c2VjcmV0" CRLF      CRLF;    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m++] = '\0';    TEST_S(buffer, "HTTP/1.1 200");  }  {    static char const kuik[] =       "kuik" CRLF CRLF;    TEST(send_request(t, kuik, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m] = '\0';    TEST_S(buffer, "HTTP/1.1 400");  }  {    static char const kuik[] =       "POST / HTTP/1.1" CRLF      "Host: 127.0.0.1" CRLF      "Content-Length: 4294967296" CRLF      CRLF;    TEST(send_request(t, kuik, -1, 1, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m] = '\0';    TEST_S(buffer, "HTTP/1.1 400");  }  {    static char const get[] =       "GET / HTTP/10.10" CRLF      "Host: 127.0.0.1" CRLF      "User-Agent: Test-Tool" CRLF      "Connection: close" CRLF      CRLF;    TEST(send_request(t, get, -1, 0, buffer, sizeof(buffer), &m), 0);    m = sspace(buffer); buffer[m] = '\0';    TEST_S(buffer, "HTTP/1.1 505");  }  {    static char const get[] =       "GET /" CRLF;    TEST(send_request(t, get, -1, 1, buffer, sizeof(buffer) - 1, &m), 0);    buffer[6] = '\0';    TEST_S(buffer, "<html>");  }  if (0)  {    static char const post[] =       "POST /foo HTTP/1.1" CRLF      "Host: 127.0.0.1" CRLF      "User-Agent: Test-Tool" CRLF      "Connection: close" CRLF      "Content-Length: 7" CRLF      "Expect: 100-continue" CRLF      CRLF;    static char const body[] =      "<html/>";    TEST(send_request(t, post, -1, -1, buffer, sizeof(buffer) - 1, &m), 0);    m = sspace(buffer); buffer[m] = '\0';    TEST_S(buffer, "HTTP/1.1 100");    TEST(send_request(t, body, -1, 0, buffer, sizeof(buffer) - 1, &m), 0);    m = sspace(buffer); buffer[m] = '\0';    TEST_S(buffer, "HTTP/1.1 200");  }  END();}static int init_engine(tester_t *t){  BEGIN();  su_socket_t s;  t->t_engine = nth_engine_create(t->t_root, 				  NTHTAG_STREAMING(0),				  TAG_END());  TEST_1(t->t_engine);  t->t_sink = s = su_socket(AF_INET, SOCK_STREAM, 0); TEST_1(s != -1);  TEST(bind(s, &t->t_sinkaddr->su_sa, 	    t->t_sinkaddrlen = (sizeof t->t_sinkaddr->su_sin)),       0);  TEST_1(getsockname(s, &t->t_sinkaddr->su_sa, &t->t_sinkaddrlen) != -1);  TEST(listen(t->t_sink, 5), 0);    TEST_1(t->t_sinkuri = (url_string_t *)	 su_sprintf(t->t_home, "HTTP://127.0.0.1:%u", 		    htons(t->t_sinkaddr->su_port)));  END();}static int response_to_client(client_t *c,			      nth_client_t *hc,			      http_t const *http){  if (http) {    c->c_status = http->http_status->st_status;  }  else {    c->c_status = nth_client_status(hc);  }  return 0;}static int test_client(tester_t *t){  BEGIN();  nth_client_t *hc;  char *uri;  client_t client[1];  memset(client, 0, sizeof client);  TEST_1(uri = su_strcat(NULL, t->t_master->s_url->us_str, "/"));  TEST_1(hc = nth_client_tcreate(t->t_engine,				 response_to_client, client,				 HTTP_METHOD_GET,				 URL_STRING_MAKE(uri),				 TAG_END()));  while (client->c_status == 0) su_root_step(t->t_root, 1);  TEST(client->c_status, 200);  nth_client_destroy(hc);  su_free(NULL, uri);  memset(client, 0, sizeof client);  TEST_1(hc = nth_client_tcreate(t->t_engine,				 response_to_client, client,				 HTTP_METHOD_GET,				 URL_STRING_MAKE(t->t_sinkuri),				 NTHTAG_EXPIRES(1000),				 TAG_END()));  while (client->c_status == 0) su_root_step(t->t_root, 1);  TEST(client->c_status, 408);  nth_client_destroy(hc);	   END();}#if HAVE_ALARMstatic RETSIGTYPE sig_alarm(int s){  fprintf(stderr, "%s: FAIL! test timeout!\n", name);  exit(1);}#endifvoid usage(int exitcode){  fprintf(stderr, "usage: %s [-v|-q] [-a] [-p proxy-uri]\n", name);  exit(exitcode);}int main(int argc, char **argv){  int i;  int retval = 0;  int o_alarm = 1;  tester_t t[1] = {{{ SU_HOME_INIT(t) }}};  char const *srcdir = getenv("srcdir");  if (srcdir == NULL)    srcdir = ".";  for (i = 1; argv[i]; i++) {    if (strcmp(argv[i], "-v") == 0)      tstflags |= tst_verbatim;    else if (strcmp(argv[i], "-a") == 0)      tstflags |= tst_abort;    else if (strcmp(argv[i], "-q") == 0)      tstflags &= ~tst_verbatim;    else if (strcmp(argv[i], "-p") == 0 && argv[i + 1])      t->t_proxy = (url_string_t *)argv[++i];    else if (strcmp(argv[i], "-s") == 0 && argv[i + 1])      srcdir = argv[++i];    else if (strcmp(argv[i], "--no-alarm") == 0) {      o_alarm = 0;    }    else if (strcmp(argv[i], "-") == 0) {      i++; break;    }    else if (argv[i][0] != '-') {      break;    }    else      usage(1);  }  t->t_srcdir = srcdir;#if HAVE_ALARM  if (o_alarm) {    alarm(60);    signal(SIGALRM, sig_alarm);  }#endif  su_init();  retval |= init_test(t);  retval |= test_nth_client_api(t);  retval |= test_nth_server_api(t);  retval |= init_server(t);  retval |= test_requests(t);  retval |= init_engine(t);  retval |= test_client(t);  retval |= deinit_test(t);   su_deinit();  return retval;}

⌨️ 快捷键说明

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