lib504.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*****************************************************************************
  2. * _ _ ____ _
  3. * Project ___| | | | _ \| |
  4. * / __| | | | |_) | |
  5. * | (__| |_| | _ <| |___
  6. * \___|\___/|_| \_\_____|
  7. *
  8. * $Id$
  9. */
  10. #include "test.h"
  11. #include <sys/types.h>
  12. #include "testutil.h"
  13. #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
  14. #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
  15. /*
  16. * Source code in here hugely as reported in bug report 651464 by
  17. * Christopher R. Palmer.
  18. *
  19. * Use multi interface to get document over proxy with bad port number.
  20. * This caused the interface to "hang" in libcurl 7.10.2.
  21. */
  22. int test(char *URL)
  23. {
  24. CURL *c;
  25. int ret=0;
  26. CURLM *m;
  27. fd_set rd, wr, exc;
  28. CURLMcode res;
  29. char done = FALSE;
  30. int running;
  31. int max_fd;
  32. int rc;
  33. struct timeval ml_start;
  34. struct timeval mp_start;
  35. char ml_timedout = FALSE;
  36. char mp_timedout = FALSE;
  37. if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
  38. fprintf(stderr, "curl_global_init() failed\n");
  39. return TEST_ERR_MAJOR_BAD;
  40. }
  41. if ((c = curl_easy_init()) == NULL) {
  42. fprintf(stderr, "curl_easy_init() failed\n");
  43. curl_global_cleanup();
  44. return TEST_ERR_MAJOR_BAD;
  45. }
  46. /* the point here being that there must not run anything on the given
  47. proxy port */
  48. curl_easy_setopt(c, CURLOPT_PROXY, libtest_arg2);
  49. curl_easy_setopt(c, CURLOPT_URL, URL);
  50. curl_easy_setopt(c, CURLOPT_VERBOSE, 1L);
  51. if ((m = curl_multi_init()) == NULL) {
  52. fprintf(stderr, "curl_multi_init() failed\n");
  53. curl_easy_cleanup(c);
  54. curl_global_cleanup();
  55. return TEST_ERR_MAJOR_BAD;
  56. }
  57. if ((res = curl_multi_add_handle(m, c)) != CURLM_OK) {
  58. fprintf(stderr, "curl_multi_add_handle() failed, "
  59. "with code %d\n", res);
  60. curl_multi_cleanup(m);
  61. curl_easy_cleanup(c);
  62. curl_global_cleanup();
  63. return TEST_ERR_MAJOR_BAD;
  64. }
  65. ml_timedout = FALSE;
  66. ml_start = tutil_tvnow();
  67. while (!done) {
  68. struct timeval interval;
  69. interval.tv_sec = 1;
  70. interval.tv_usec = 0;
  71. if (tutil_tvdiff(tutil_tvnow(), ml_start) >
  72. MAIN_LOOP_HANG_TIMEOUT) {
  73. ml_timedout = TRUE;
  74. break;
  75. }
  76. mp_timedout = FALSE;
  77. mp_start = tutil_tvnow();
  78. fprintf(stderr, "curl_multi_perform()\n");
  79. res = CURLM_CALL_MULTI_PERFORM;
  80. while (res == CURLM_CALL_MULTI_PERFORM) {
  81. res = curl_multi_perform(m, &running);
  82. if (tutil_tvdiff(tutil_tvnow(), mp_start) >
  83. MULTI_PERFORM_HANG_TIMEOUT) {
  84. mp_timedout = TRUE;
  85. break;
  86. }
  87. }
  88. if (mp_timedout)
  89. break;
  90. if(!running) {
  91. /* This is where this code is expected to reach */
  92. int numleft;
  93. CURLMsg *msg = curl_multi_info_read(m, &numleft);
  94. fprintf(stderr, "Expected: not running\n");
  95. if(msg && !numleft)
  96. ret = 100; /* this is where we should be */
  97. else
  98. ret = 99; /* not correct */
  99. break;
  100. }
  101. fprintf(stderr, "running == %d, res == %d\n", running, res);
  102. if (res != CURLM_OK) {
  103. ret = 2;
  104. break;
  105. }
  106. FD_ZERO(&rd);
  107. FD_ZERO(&wr);
  108. FD_ZERO(&exc);
  109. max_fd = 0;
  110. fprintf(stderr, "curl_multi_fdset()\n");
  111. if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
  112. fprintf(stderr, "unexpected failured of fdset.\n");
  113. ret = 3;
  114. break;
  115. }
  116. rc = select_test(max_fd+1, &rd, &wr, &exc, &interval);
  117. fprintf(stderr, "select returned %d\n", rc);
  118. }
  119. if (ml_timedout || mp_timedout) {
  120. if (ml_timedout) fprintf(stderr, "ml_timedout\n");
  121. if (mp_timedout) fprintf(stderr, "mp_timedout\n");
  122. fprintf(stderr, "ABORTING TEST, since it seems "
  123. "that it would have run forever.\n");
  124. ret = TEST_ERR_RUNS_FOREVER;
  125. }
  126. curl_multi_remove_handle(m, c);
  127. curl_easy_cleanup(c);
  128. curl_multi_cleanup(m);
  129. curl_global_cleanup();
  130. return ret;
  131. }