1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. 99bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 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 12e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * are also available at http://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 24e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "testutil.h" 25e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "warnless.h" 26e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "memdebug.h" 27e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 28e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_HANG_TIMEOUT 60 * 1000 29e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Simply download a HTTPS file! 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * This test was added after the HTTPS-using-multi-interface with OpenSSL 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * regression of 7.19.1 to hopefully prevent this embarassing mistake from 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * appearing again... Unfortunately the bug wasn't triggered by this test, 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * which presumably is because the connect to a local server is too 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * fast/different compared to the real/distant servers we saw the bug happen 389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * with. 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint test(char *URL) 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET CURL *http_handle = NULL; 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURLM *multi_handle = NULL; 44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int res = 0; 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int still_running; /* keep number of running handles */ 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 48e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET start_test_timing(); 49e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 50e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* 51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ** curl_global_init called indirectly from curl_easy_init. 52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET easy_init(http_handle); 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* set options */ 57e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET easy_setopt(http_handle, CURLOPT_URL, URL); 58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET easy_setopt(http_handle, CURLOPT_HEADER, 1L); 59e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET easy_setopt(http_handle, CURLOPT_SSL_VERIFYPEER, 0L); 60e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET easy_setopt(http_handle, CURLOPT_SSL_VERIFYHOST, 0L); 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* init a multi stack */ 63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET multi_init(multi_handle); 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* add the individual transfers */ 66e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET multi_add_handle(multi_handle, http_handle); 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* we start some action by calling perform right away */ 69e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET multi_perform(multi_handle, &still_running); 70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET abort_on_test_timeout(); 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels while(still_running) { 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct timeval timeout; 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fd_set fdread; 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fd_set fdwrite; 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fd_set fdexcep; 79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int maxfd = -99; 809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FD_ZERO(&fdread); 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FD_ZERO(&fdwrite); 839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FD_ZERO(&fdexcep); 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* set a suitable timeout to play around with */ 869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels timeout.tv_sec = 1; 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels timeout.tv_usec = 0; 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* get file descriptors from the transfers */ 90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); 91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* At this point, maxfd is guaranteed to be greater or equal than -1. */ 93e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 94e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); 95e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 96e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET abort_on_test_timeout(); 97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* timeout or readable/writable sockets */ 99e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET multi_perform(multi_handle, &still_running); 100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 101e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET abort_on_test_timeout(); 1029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelstest_cleanup: 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* undocumented cleanup sequence - type UA */ 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_multi_cleanup(multi_handle); 1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(http_handle); 1109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 1119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return res; 1139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 114