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