int test(char *URL) { CURL *easy = NULL; CURLM *multi = NULL; int res = 0; int running; int msgs_left; CURLMsg *msg; FILE *upload = NULL; int error; start_test_timing(); upload = fopen(libtest_arg3, "rb"); if(!upload) { error = ERRNO; fprintf(stderr, "fopen() failed with error: %d (%s)\n", error, strerror(error)); fprintf(stderr, "Error opening file: (%s)\n", libtest_arg3); return TEST_ERR_FOPEN; } res_global_init(CURL_GLOBAL_ALL); if(res) { fclose(upload); return res; } easy_init(easy); /* go verbose */ easy_setopt(easy, CURLOPT_VERBOSE, 1L); /* specify target */ easy_setopt(easy, CURLOPT_URL, URL); /* enable uploading */ easy_setopt(easy, CURLOPT_UPLOAD, 1L); /* data pointer for the file read function */ easy_setopt(easy, CURLOPT_READDATA, upload); /* use active mode FTP */ easy_setopt(easy, CURLOPT_FTPPORT, "-"); /* server connection timeout */ easy_setopt(easy, CURLOPT_ACCEPTTIMEOUT_MS, strtol(libtest_arg2, NULL, 10)*1000); multi_init(multi); multi_add_handle(multi, easy); for(;;) { struct timeval interval; fd_set fdread; fd_set fdwrite; fd_set fdexcep; long timeout = -99; int maxfd = -99; multi_perform(multi, &running); abort_on_test_timeout(); if(!running) break; /* done */ FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); /* At this point, maxfd is guaranteed to be greater or equal than -1. */ multi_timeout(multi, &timeout); /* At this point, timeout is guaranteed to be greater or equal than -1. */ if(timeout != -1L) { int itimeout = (timeout > (long)INT_MAX) ? INT_MAX : (int)timeout; interval.tv_sec = itimeout/1000; interval.tv_usec = (itimeout%1000)*1000; } else { interval.tv_sec = 0; interval.tv_usec = 100000L; /* 100 ms */ } select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &interval); abort_on_test_timeout(); } msg = curl_multi_info_read(multi, &msgs_left); if(msg) res = msg->data.result; test_cleanup: /* undocumented cleanup sequence - type UA */ curl_multi_cleanup(multi); curl_easy_cleanup(easy); curl_global_cleanup(); /* close the local file */ fclose(upload); return res; }
int test(char *URL) { CURL *easy = NULL; CURLM *multi = NULL; int res = 0; int running; int msgs_left; int phase; CURLMsg *msg; start_test_timing(); res_global_init(CURL_GLOBAL_ALL); if(res) { return res; } easy_init(easy); multi_init(multi); for (phase = CONNECT_ONLY_PHASE; phase < LAST_PHASE; ++phase) { /* go verbose */ easy_setopt(easy, CURLOPT_VERBOSE, 1L); /* specify target */ easy_setopt(easy, CURLOPT_URL, URL); /* enable 'CONNECT_ONLY' option when in connect phase */ if (phase == CONNECT_ONLY_PHASE) easy_setopt(easy, CURLOPT_CONNECT_ONLY, 1L); /* enable 'NOBODY' option to send 'QUIT' command in quit phase */ if (phase == QUIT_PHASE) { easy_setopt(easy, CURLOPT_CONNECT_ONLY, 0L); easy_setopt(easy, CURLOPT_NOBODY, 1L); easy_setopt(easy, CURLOPT_FORBID_REUSE, 1L); } multi_add_handle(multi, easy); for(;;) { struct timeval interval; fd_set fdread; fd_set fdwrite; fd_set fdexcep; long timeout = -99; int maxfd = -99; multi_perform(multi, &running); abort_on_test_timeout(); if(!running) break; /* done */ FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); /* At this point, maxfd is guaranteed to be greater or equal than -1. */ multi_timeout(multi, &timeout); /* At this point, timeout is guaranteed to be greater or equal than -1. */ if(timeout != -1L) { int itimeout = (timeout > (long)INT_MAX) ? INT_MAX : (int)timeout; interval.tv_sec = itimeout/1000; interval.tv_usec = (itimeout%1000)*1000; } else { interval.tv_sec = TEST_HANG_TIMEOUT/1000+1; interval.tv_usec = 0; } select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &interval); abort_on_test_timeout(); } msg = curl_multi_info_read(multi, &msgs_left); if(msg) res = msg->data.result; multi_remove_handle(multi, easy); } test_cleanup: /* undocumented cleanup sequence - type UA */ curl_multi_cleanup(multi); curl_easy_cleanup(easy); curl_global_cleanup(); return res; }
int test(char *url) { CURLM *multi = NULL; int running; int i, j; int num_handles = 0; enum HandleState state = ReadyForNewHandle; size_t urllen = strlen(url) + 4 + 1; char* full_url = malloc(urllen); start_test_timing(); if(!full_url) { fprintf(stderr, "Not enough memory for full url\n"); return TEST_ERR_MAJOR_BAD; } for(i = 0; i < MAX_EASY_HANDLES; ++i) { easy[i] = NULL; sockets[i] = CURL_SOCKET_BAD; } res_global_init(CURL_GLOBAL_ALL); if(res) { free(full_url); return res; } multi_init(multi); #ifdef USE_PIPELINING multi_setopt(multi, CURLMOPT_PIPELINING, 1L); multi_setopt(multi, CURLMOPT_MAX_HOST_CONNECTIONS, 5L); multi_setopt(multi, CURLMOPT_MAX_TOTAL_CONNECTIONS, 10L); #endif for(;;) { struct timeval interval; fd_set fdread; fd_set fdwrite; fd_set fdexcep; long timeout = -99; int maxfd = -99; bool found_new_socket = FALSE; /* Start a new handle if we aren't at the max */ if(state == ReadyForNewHandle) { easy_init(easy[num_handles]); if(num_handles % 3 == 2) { snprintf(full_url, urllen, "%s0200", url); easy_setopt(easy[num_handles], CURLOPT_HTTPAUTH, CURLAUTH_NTLM); } else { snprintf(full_url, urllen, "%s0100", url); easy_setopt(easy[num_handles], CURLOPT_HTTPAUTH, CURLAUTH_BASIC); } easy_setopt(easy[num_handles], CURLOPT_FRESH_CONNECT, 1L); easy_setopt(easy[num_handles], CURLOPT_URL, full_url); easy_setopt(easy[num_handles], CURLOPT_VERBOSE, 1L); easy_setopt(easy[num_handles], CURLOPT_HTTPGET, 1L); easy_setopt(easy[num_handles], CURLOPT_USERPWD, "testuser:testpass"); easy_setopt(easy[num_handles], CURLOPT_WRITEFUNCTION, callback); easy_setopt(easy[num_handles], CURLOPT_WRITEDATA, easy + num_handles); easy_setopt(easy[num_handles], CURLOPT_HEADER, 1L); multi_add_handle(multi, easy[num_handles]); num_handles += 1; state = NeedSocketForNewHandle; } multi_perform(multi, &running); abort_on_test_timeout(); if(!running && state == NoMoreHandles) break; /* done */ FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); /* At this point, maxfd is guaranteed to be greater or equal than -1. */ /* Any socket which is new in fdread is associated with the new handle */ for(i = 0; i <= maxfd; ++i) { bool socket_exists = FALSE; curl_socket_t curfd = (curl_socket_t)i; if(!FD_ISSET(curfd, &fdread)) { continue; } /* Check if this socket was already detected for an earlier handle (or for this handle, num_handles-1, in the callback */ for(j = 0; j < num_handles; ++j) { if(sockets[j] == curfd) { socket_exists = TRUE; break; } } if(socket_exists) { continue; } if(found_new_socket || state != NeedSocketForNewHandle) { fprintf(stderr, "Unexpected new socket\n"); res = TEST_ERR_MAJOR_BAD; goto test_cleanup; } /* Now we know the socket is for the most recent handle, num_handles-1 */ if(sockets[num_handles-1] != CURL_SOCKET_BAD) { /* A socket for this handle was already detected in the callback; if it matched socket_exists should be true and we would never get here */ assert(curfd != sockets[num_handles-1]); fprintf(stderr, "Handle %d wrote to socket %d then detected on %d\n", num_handles-1, (int)sockets[num_handles-1], (int)curfd); res = TEST_ERR_MAJOR_BAD; goto test_cleanup; } else { sockets[num_handles-1] = curfd; found_new_socket = TRUE; /* continue to make sure there's only one new handle */ } } if(state == NeedSocketForNewHandle) { if(maxfd != -1 && !found_new_socket) { fprintf(stderr, "Warning: socket did not open immediately for new " "handle (trying again)\n"); continue; } state = num_handles < MAX_EASY_HANDLES ? ReadyForNewHandle : NoMoreHandles; } multi_timeout(multi, &timeout); /* At this point, timeout is guaranteed to be greater or equal than -1. */ fprintf(stderr, "%s:%d num_handles %d timeout %ld\n", __FILE__, __LINE__, num_handles, timeout); if(timeout != -1L) { int itimeout = (timeout > (long)INT_MAX) ? INT_MAX : (int)timeout; interval.tv_sec = itimeout/1000; interval.tv_usec = (itimeout%1000)*1000; } else { interval.tv_sec = TEST_HANG_TIMEOUT/1000+1; interval.tv_usec = 0; /* if there's no timeout and we get here on the last handle, we may already have read the last part of the stream so waiting makes no sense */ if(!running && num_handles == MAX_EASY_HANDLES) { break; } } select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &interval); abort_on_test_timeout(); } test_cleanup: /* proper cleanup sequence - type PB */ for(i = 0; i < MAX_EASY_HANDLES; i++) { curl_multi_remove_handle(multi, easy[i]); curl_easy_cleanup(easy[i]); } curl_multi_cleanup(multi); curl_global_cleanup(); free(full_url); return res; }
int test(char *URL) { int res = 0; CURL *curl = NULL; FILE *hd_src = NULL; int hd ; int error; struct_stat file_info; CURLM *m = NULL; struct ReadWriteSockets sockets = {{NULL, 0, 0}, {NULL, 0, 0}}; struct timeval timeout = {-1, 0}; int success = 0; start_test_timing(); if (!libtest_arg3) { fprintf(stderr, "Usage: lib582 [url] [filename] [username]\n"); return TEST_ERR_USAGE; } hd_src = fopen(libtest_arg2, "rb"); if(NULL == hd_src) { error = ERRNO; fprintf(stderr, "fopen() failed with error: %d (%s)\n", error, strerror(error)); fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2); return TEST_ERR_FOPEN; } /* get the file size of the local file */ hd = fstat(fileno(hd_src), &file_info); if(hd == -1) { /* can't open file, bail out */ error = ERRNO; fprintf(stderr, "fstat() failed with error: %d (%s)\n", error, strerror(error)); fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2); fclose(hd_src); return TEST_ERR_FSTAT; } fprintf(stderr, "Set to upload %d bytes\n", (int)file_info.st_size); res_global_init(CURL_GLOBAL_ALL); if(res) { fclose(hd_src); return res; } easy_init(curl); /* enable uploading */ easy_setopt(curl, CURLOPT_UPLOAD, 1L); /* specify target */ easy_setopt(curl,CURLOPT_URL, URL); /* go verbose */ easy_setopt(curl, CURLOPT_VERBOSE, 1L); /* now specify which file to upload */ easy_setopt(curl, CURLOPT_READDATA, hd_src); easy_setopt(curl, CURLOPT_USERPWD, libtest_arg3); easy_setopt(curl, CURLOPT_SSH_PUBLIC_KEYFILE, "curl_client_key.pub"); easy_setopt(curl, CURLOPT_SSH_PRIVATE_KEYFILE, "curl_client_key"); easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size); multi_init(m); multi_setopt(m, CURLMOPT_SOCKETFUNCTION, curlSocketCallback); multi_setopt(m, CURLMOPT_SOCKETDATA, &sockets); multi_setopt(m, CURLMOPT_TIMERFUNCTION, curlTimerCallback); multi_setopt(m, CURLMOPT_TIMERDATA, &timeout); multi_add_handle(m, curl); while (!checkForCompletion(m, &success)) { fd_set readSet, writeSet; curl_socket_t maxFd = 0; struct timeval tv = {10, 0}; FD_ZERO(&readSet); FD_ZERO(&writeSet); updateFdSet(&sockets.read, &readSet, &maxFd); updateFdSet(&sockets.write, &writeSet, &maxFd); if (timeout.tv_sec != -1) { int usTimeout = getMicroSecondTimeout(&timeout); tv.tv_sec = usTimeout / 1000000; tv.tv_usec = usTimeout % 1000000; } else if (maxFd <= 0) { tv.tv_sec = 0; tv.tv_usec = 100000; } select_test(maxFd, &readSet, &writeSet, NULL, &tv); /* Check the sockets for reading / writing */ checkFdSet(m, &sockets.read, &readSet, CURL_CSELECT_IN, "read"); checkFdSet(m, &sockets.write, &writeSet, CURL_CSELECT_OUT, "write"); if (timeout.tv_sec != -1 && getMicroSecondTimeout(&timeout) == 0) { /* Curl's timer has elapsed. */ notifyCurl(m, CURL_SOCKET_TIMEOUT, 0, "timeout"); } abort_on_test_timeout(); } if (!success) { fprintf(stderr, "Error uploading file.\n"); res = TEST_ERR_MAJOR_BAD; } test_cleanup: /* proper cleanup sequence - type PB */ curl_multi_remove_handle(m, curl); curl_easy_cleanup(curl); curl_multi_cleanup(m); curl_global_cleanup(); /* close the local file */ fclose(hd_src); /* free local memory */ free(sockets.read.sockets); free(sockets.write.sockets); return res; }
int test(char *URL) { int res = 0; CURL *curl = NULL; FILE *hd_src = NULL; int hd; struct_stat file_info; CURLM *m = NULL; int running; start_test_timing(); if(!libtest_arg2) { #ifdef LIB529 /* test 529 */ fprintf(stderr, "Usage: lib529 [url] [uploadfile]\n"); #else /* test 525 */ fprintf(stderr, "Usage: lib525 [url] [uploadfile]\n"); #endif return TEST_ERR_USAGE; } hd_src = fopen(libtest_arg2, "rb"); if(NULL == hd_src) { fprintf(stderr, "fopen failed with error: %d (%s)\n", errno, strerror(errno)); fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2); return TEST_ERR_FOPEN; } /* get the file size of the local file */ hd = fstat(fileno(hd_src), &file_info); if(hd == -1) { /* can't open file, bail out */ fprintf(stderr, "fstat() failed with error: %d (%s)\n", errno, strerror(errno)); fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2); fclose(hd_src); return TEST_ERR_FSTAT; } res_global_init(CURL_GLOBAL_ALL); if(res) { fclose(hd_src); return res; } easy_init(curl); /* enable uploading */ easy_setopt(curl, CURLOPT_UPLOAD, 1L); /* specify target */ easy_setopt(curl, CURLOPT_URL, URL); /* go verbose */ easy_setopt(curl, CURLOPT_VERBOSE, 1L); /* use active FTP */ easy_setopt(curl, CURLOPT_FTPPORT, "-"); /* now specify which file to upload */ easy_setopt(curl, CURLOPT_READDATA, hd_src); /* NOTE: if you want this code to work on Windows with libcurl as a DLL, you MUST also provide a read callback with CURLOPT_READFUNCTION. Failing to do so will give you a crash since a DLL may not use the variable's memory when passed in to it from an app like this. */ /* Set the size of the file to upload (optional). If you give a *_LARGE option you MUST make sure that the type of the passed-in argument is a curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must make sure that to pass in a type 'long' argument. */ easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size); multi_init(m); multi_add_handle(m, curl); for(;;) { struct timeval interval; fd_set rd, wr, exc; int maxfd = -99; interval.tv_sec = 1; interval.tv_usec = 0; multi_perform(m, &running); abort_on_test_timeout(); if(!running) break; /* done */ FD_ZERO(&rd); FD_ZERO(&wr); FD_ZERO(&exc); multi_fdset(m, &rd, &wr, &exc, &maxfd); /* At this point, maxfd is guaranteed to be greater or equal than -1. */ select_test(maxfd+1, &rd, &wr, &exc, &interval); abort_on_test_timeout(); } test_cleanup: #ifdef LIB529 /* test 529 */ /* proper cleanup sequence - type PA */ curl_multi_remove_handle(m, curl); curl_multi_cleanup(m); curl_easy_cleanup(curl); curl_global_cleanup(); #else /* test 525 */ /* proper cleanup sequence - type PB */ curl_multi_remove_handle(m, curl); curl_easy_cleanup(curl); curl_multi_cleanup(m); curl_global_cleanup(); #endif /* close the local file */ fclose(hd_src); return res; }
int test(char *URL) { CURL* easy = NULL; CURLM* multi = NULL; int still_running; int res = 0; char redirect[160]; /* DNS cache injection */ struct curl_slist *dns_cache_list; sprintf(redirect, "google.com:%s:%s", libtest_arg2, libtest_arg3); start_test_timing(); dns_cache_list = curl_slist_append(NULL, redirect); if(!dns_cache_list) { fprintf(stderr, "curl_slist_append() failed\n"); return TEST_ERR_MAJOR_BAD; } res_global_init(CURL_GLOBAL_ALL); if(res) { curl_slist_free_all(dns_cache_list); return res; } easy_init(easy); easy_setopt(easy, CURLOPT_URL, URL); easy_setopt(easy, CURLOPT_HEADER, 1L); easy_setopt(easy, CURLOPT_RESOLVE, dns_cache_list); multi_init(multi); multi_add_handle(multi, easy); multi_perform(multi, &still_running); abort_on_test_timeout(); while(still_running) { struct timeval timeout; fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd = -99; FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); timeout.tv_sec = 1; timeout.tv_usec = 0; multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); /* At this point, maxfd is guaranteed to be greater or equal than -1. */ select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); abort_on_test_timeout(); multi_perform(multi, &still_running); abort_on_test_timeout(); } test_cleanup: #ifdef LIB1502 /* undocumented cleanup sequence - type UA */ curl_multi_cleanup(multi); curl_easy_cleanup(easy); curl_global_cleanup(); #endif #ifdef LIB1503 /* proper cleanup sequence - type PA */ curl_multi_remove_handle(multi, easy); curl_multi_cleanup(multi); curl_easy_cleanup(easy); curl_global_cleanup(); #endif #ifdef LIB1504 /* undocumented cleanup sequence - type UB */ curl_easy_cleanup(easy); curl_multi_cleanup(multi); curl_global_cleanup(); #endif #ifdef LIB1505 /* proper cleanup sequence - type PB */ curl_multi_remove_handle(multi, easy); curl_easy_cleanup(easy); curl_multi_cleanup(multi); curl_global_cleanup(); #endif curl_slist_free_all(dns_cache_list); return res; }