1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/***************************************************************************
29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                                  _   _ ____  _
39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *  Project                     ___| | | |  _ \| |
49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                             / __| | | | |_) | |
59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                            | (__| |_| |  _ <| |___
69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                             \___|\___/|_| \_\_____|
79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *
8486467e11b5904b3e04adc2f5fdb96fcfe65da84Alex Deymo * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
9e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which
11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms
128f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html.
13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is
16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file.
17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied.
20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/
229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "test.h"
239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "testutil.h"
25e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "warnless.h"
269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "memdebug.h"
279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
28e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_HANG_TIMEOUT 60 * 1000
299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint test(char *URL)
319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{
32cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes  CURL *curls = NULL;
33cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes  CURLM *multi = NULL;
349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  int still_running;
359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  int i = -1;
369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  int res = 0;
379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  CURLMsg *msg;
389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  start_test_timing();
409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
41e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  global_init(CURL_GLOBAL_ALL);
429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
43e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  multi_init(multi);
449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  easy_init(curls);
46e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
47e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  easy_setopt(curls, CURLOPT_URL, URL);
48e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  easy_setopt(curls, CURLOPT_HEADER, 1L);
499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
50e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  multi_add_handle(multi, curls);
519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  multi_perform(multi, &still_running);
539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  abort_on_test_timeout();
559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
56e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  while(still_running) {
579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    struct timeval timeout;
589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    fd_set fdread;
599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    fd_set fdwrite;
609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    fd_set fdexcep;
61e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    int maxfd = -99;
629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    FD_ZERO(&fdread);
649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    FD_ZERO(&fdwrite);
659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    FD_ZERO(&fdexcep);
669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    timeout.tv_sec = 1;
679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    timeout.tv_usec = 0;
689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
69e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* At this point, maxfd is guaranteed to be greater or equal than -1. */
72e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
73486467e11b5904b3e04adc2f5fdb96fcfe65da84Alex Deymo    select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    abort_on_test_timeout();
76e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    multi_perform(multi, &still_running);
78e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    abort_on_test_timeout();
809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  }
819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  msg = curl_multi_info_read(multi, &still_running);
83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(msg)
84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* this should now contain a result code from the easy handle,
85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET       get it */
86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    i = msg->data.result;
87e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelstest_cleanup:
899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  /* undocumented cleanup sequence - type UA */
91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  curl_multi_cleanup(multi);
939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  curl_easy_cleanup(curls);
949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  curl_global_cleanup();
959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  if(res)
979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    i = res;
989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  return i; /* return the final return code */
1009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels}
101