1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel (at) haxx.se>, et al. 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 /* <DESC> 23 * Import and export cookies with COOKIELIST. 24 * </DESC> 25 */ 26 27 #include <stdio.h> 28 #include <string.h> 29 #include <stdlib.h> 30 #include <errno.h> 31 #include <time.h> 32 33 #include <curl/curl.h> 34 35 static void 36 print_cookies(CURL *curl) 37 { 38 CURLcode res; 39 struct curl_slist *cookies; 40 struct curl_slist *nc; 41 int i; 42 43 printf("Cookies, curl knows:\n"); 44 res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); 45 if(res != CURLE_OK) { 46 fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", 47 curl_easy_strerror(res)); 48 exit(1); 49 } 50 nc = cookies; 51 i = 1; 52 while(nc) { 53 printf("[%d]: %s\n", i, nc->data); 54 nc = nc->next; 55 i++; 56 } 57 if(i == 1) { 58 printf("(none)\n"); 59 } 60 curl_slist_free_all(cookies); 61 } 62 63 int 64 main(void) 65 { 66 CURL *curl; 67 CURLcode res; 68 69 curl_global_init(CURL_GLOBAL_ALL); 70 curl = curl_easy_init(); 71 if(curl) { 72 char nline[256]; 73 74 curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/"); 75 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 76 curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* start cookie engine */ 77 res = curl_easy_perform(curl); 78 if(res != CURLE_OK) { 79 fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); 80 return 1; 81 } 82 83 print_cookies(curl); 84 85 printf("Erasing curl's knowledge of cookies!\n"); 86 curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL"); 87 88 print_cookies(curl); 89 90 printf("-----------------------------------------------\n" 91 "Setting a cookie \"PREF\" via cookie interface:\n"); 92 #ifdef WIN32 93 #define snprintf _snprintf 94 #endif 95 /* Netscape format cookie */ 96 snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s", 97 ".example.com", "TRUE", "/", "FALSE", 98 (unsigned long)time(NULL) + 31337UL, 99 "PREF", "hello example, i like you very much!"); 100 res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); 101 if(res != CURLE_OK) { 102 fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", 103 curl_easy_strerror(res)); 104 return 1; 105 } 106 107 /* HTTP-header style cookie. If you use the Set-Cookie format and don't 108 specify a domain then the cookie is sent for any domain and will not be 109 modified, likely not what you intended. Starting in 7.43.0 any-domain 110 cookies will not be exported either. For more information refer to the 111 CURLOPT_COOKIELIST documentation. 112 */ 113 snprintf(nline, sizeof(nline), 114 "Set-Cookie: OLD_PREF=3d141414bf4209321; " 115 "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.example.com"); 116 res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); 117 if(res != CURLE_OK) { 118 fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", 119 curl_easy_strerror(res)); 120 return 1; 121 } 122 123 print_cookies(curl); 124 125 res = curl_easy_perform(curl); 126 if(res != CURLE_OK) { 127 fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); 128 return 1; 129 } 130 131 curl_easy_cleanup(curl); 132 } 133 else { 134 fprintf(stderr, "Curl init failed!\n"); 135 return 1; 136 } 137 138 curl_global_cleanup(); 139 return 0; 140 } 141