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