Annotation of embedaddon/curl/tests/libtest/lib1900.c, revision 1.1
1.1 ! misho 1: /***************************************************************************
! 2: * _ _ ____ _
! 3: * Project ___| | | | _ \| |
! 4: * / __| | | | |_) | |
! 5: * | (__| |_| | _ <| |___
! 6: * \___|\___/|_| \_\_____|
! 7: *
! 8: * Copyright (C) 2013 - 2019, Linus Nielsen Feltzing, <linus@haxx.se>
! 9: *
! 10: * This software is licensed as described in the file COPYING, which
! 11: * you should have received as part of this distribution. The terms
! 12: * are also available at https://curl.haxx.se/docs/copyright.html.
! 13: *
! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: * copies of the Software, and permit persons to whom the Software is
! 16: * furnished to do so, under the terms of the COPYING file.
! 17: *
! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: * KIND, either express or implied.
! 20: *
! 21: ***************************************************************************/
! 22: #include "test.h"
! 23:
! 24: #include "testutil.h"
! 25: #include "warnless.h"
! 26: #include "memdebug.h"
! 27:
! 28: #define TEST_HANG_TIMEOUT 60 * 1000
! 29: #define MAX_URLS 200
! 30: #define MAX_BLACKLIST 20
! 31:
! 32: static int urltime[MAX_URLS];
! 33: static char *urlstring[MAX_URLS];
! 34: static CURL *handles[MAX_URLS];
! 35: static char *site_blacklist[MAX_BLACKLIST];
! 36: static char *server_blacklist[MAX_BLACKLIST];
! 37: static int num_handles;
! 38: static int blacklist_num_servers;
! 39: static int blacklist_num_sites;
! 40:
! 41: static size_t
! 42: write_callback(void *contents, size_t size, size_t nmemb, void *userp)
! 43: {
! 44: size_t realsize = size * nmemb;
! 45: (void)contents;
! 46: (void)userp;
! 47:
! 48: return realsize;
! 49: }
! 50:
! 51: static int parse_url_file(const char *filename)
! 52: {
! 53: FILE *f;
! 54: int filetime;
! 55: char buf[200];
! 56:
! 57: num_handles = 0;
! 58: blacklist_num_sites = 0;
! 59: blacklist_num_servers = 0;
! 60:
! 61: f = fopen(filename, "rb");
! 62: if(!f)
! 63: return 0;
! 64:
! 65: while(!feof(f)) {
! 66: if(fscanf(f, "%d %199s\n", &filetime, buf)) {
! 67: urltime[num_handles] = filetime;
! 68: urlstring[num_handles] = strdup(buf);
! 69: num_handles++;
! 70: continue;
! 71: }
! 72:
! 73: if(fscanf(f, "blacklist_site %199s\n", buf)) {
! 74: site_blacklist[blacklist_num_sites] = strdup(buf);
! 75: blacklist_num_sites++;
! 76: continue;
! 77: }
! 78:
! 79: break;
! 80: }
! 81: fclose(f);
! 82:
! 83: site_blacklist[blacklist_num_sites] = NULL;
! 84: server_blacklist[blacklist_num_servers] = NULL;
! 85: return num_handles;
! 86: }
! 87:
! 88: static void free_urls(void)
! 89: {
! 90: int i;
! 91: for(i = 0; i < num_handles; i++) {
! 92: Curl_safefree(urlstring[i]);
! 93: }
! 94: for(i = 0; i < blacklist_num_servers; i++) {
! 95: Curl_safefree(server_blacklist[i]);
! 96: }
! 97: for(i = 0; i < blacklist_num_sites; i++) {
! 98: Curl_safefree(site_blacklist[i]);
! 99: }
! 100: }
! 101:
! 102: static int create_handles(void)
! 103: {
! 104: int i;
! 105:
! 106: for(i = 0; i < num_handles; i++) {
! 107: handles[i] = curl_easy_init();
! 108: }
! 109: return 0;
! 110: }
! 111:
! 112: static void setup_handle(char *base_url, CURLM *m, int handlenum)
! 113: {
! 114: char urlbuf[256];
! 115:
! 116: msnprintf(urlbuf, sizeof(urlbuf), "%s%s", base_url, urlstring[handlenum]);
! 117: curl_easy_setopt(handles[handlenum], CURLOPT_URL, urlbuf);
! 118: curl_easy_setopt(handles[handlenum], CURLOPT_VERBOSE, 1L);
! 119: curl_easy_setopt(handles[handlenum], CURLOPT_FAILONERROR, 1L);
! 120: curl_easy_setopt(handles[handlenum], CURLOPT_WRITEFUNCTION, write_callback);
! 121: curl_easy_setopt(handles[handlenum], CURLOPT_WRITEDATA, NULL);
! 122: curl_multi_add_handle(m, handles[handlenum]);
! 123: }
! 124:
! 125: static void remove_handles(void)
! 126: {
! 127: int i;
! 128:
! 129: for(i = 0; i < num_handles; i++) {
! 130: if(handles[i])
! 131: curl_easy_cleanup(handles[i]);
! 132: }
! 133: }
! 134:
! 135: int test(char *URL)
! 136: {
! 137: int res = 0;
! 138: CURLM *m = NULL;
! 139: CURLMsg *msg; /* for picking up messages with the transfer status */
! 140: int msgs_left; /* how many messages are left */
! 141: int running = 0;
! 142: int handlenum = 0;
! 143: struct timeval last_handle_add;
! 144:
! 145: if(parse_url_file(libtest_arg2) <= 0)
! 146: goto test_cleanup;
! 147:
! 148: start_test_timing();
! 149:
! 150: curl_global_init(CURL_GLOBAL_ALL);
! 151:
! 152: multi_init(m);
! 153:
! 154: create_handles();
! 155:
! 156: multi_setopt(m, CURLMOPT_PIPELINING, 1L);
! 157: multi_setopt(m, CURLMOPT_MAX_HOST_CONNECTIONS, 2L);
! 158: multi_setopt(m, CURLMOPT_MAX_PIPELINE_LENGTH, 3L);
! 159: multi_setopt(m, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, 15000L);
! 160: multi_setopt(m, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, 10000L);
! 161:
! 162: multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_blacklist);
! 163: multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_blacklist);
! 164:
! 165: last_handle_add = tutil_tvnow();
! 166:
! 167: for(;;) {
! 168: struct timeval interval;
! 169: struct timeval now;
! 170: fd_set rd, wr, exc;
! 171: int maxfd = -99;
! 172: long timeout;
! 173:
! 174: interval.tv_sec = 1;
! 175: interval.tv_usec = 0;
! 176:
! 177: if(handlenum < num_handles) {
! 178: now = tutil_tvnow();
! 179: if(tutil_tvdiff(now, last_handle_add) >= urltime[handlenum]) {
! 180: fprintf(stdout, "Adding handle %d\n", handlenum);
! 181: setup_handle(URL, m, handlenum);
! 182: last_handle_add = now;
! 183: handlenum++;
! 184: }
! 185: }
! 186:
! 187: curl_multi_perform(m, &running);
! 188:
! 189: abort_on_test_timeout();
! 190:
! 191: /* See how the transfers went */
! 192: do {
! 193: msg = curl_multi_info_read(m, &msgs_left);
! 194: if(msg && msg->msg == CURLMSG_DONE) {
! 195: int i;
! 196:
! 197: /* Find out which handle this message is about */
! 198: for(i = 0; i < num_handles; i++) {
! 199: int found = (msg->easy_handle == handles[i]);
! 200: if(found)
! 201: break;
! 202: }
! 203:
! 204: printf("Handle %d Completed with status %d\n", i, msg->data.result);
! 205: curl_multi_remove_handle(m, handles[i]);
! 206: }
! 207: } while(msg);
! 208:
! 209: if(handlenum == num_handles && !running) {
! 210: break; /* done */
! 211: }
! 212:
! 213: FD_ZERO(&rd);
! 214: FD_ZERO(&wr);
! 215: FD_ZERO(&exc);
! 216:
! 217: curl_multi_fdset(m, &rd, &wr, &exc, &maxfd);
! 218:
! 219: /* At this point, maxfd is guaranteed to be greater or equal than -1. */
! 220:
! 221: curl_multi_timeout(m, &timeout);
! 222:
! 223: if(timeout < 0)
! 224: timeout = 1;
! 225:
! 226: interval.tv_sec = timeout / 1000;
! 227: interval.tv_usec = (timeout % 1000) * 1000;
! 228:
! 229: interval.tv_sec = 0;
! 230: interval.tv_usec = 1000;
! 231:
! 232: select_test(maxfd + 1, &rd, &wr, &exc, &interval);
! 233:
! 234: abort_on_test_timeout();
! 235: }
! 236:
! 237: test_cleanup:
! 238:
! 239: remove_handles();
! 240:
! 241: /* undocumented cleanup sequence - type UB */
! 242:
! 243: curl_multi_cleanup(m);
! 244: curl_global_cleanup();
! 245:
! 246: free_urls();
! 247: return res;
! 248: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>