cookie_interface.c revision e6cd738ed3716c02557fb3a47515244e949ade39
1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. 9e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 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 ***************************************************************************/ 22e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* This example shows usage of simple cookie interface. */ 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <stdio.h> 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <string.h> 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <stdlib.h> 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <errno.h> 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <time.h> 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <curl/curl.h> 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstatic void 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsprint_cookies(CURL *curl) 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURLcode res; 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct curl_slist *cookies; 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct curl_slist *nc; 389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int i; 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("Cookies, curl knows:\n"); 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); 429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (res != CURLE_OK) { 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res)); 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels exit(1); 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels nc = cookies, i = 1; 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels while (nc) { 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("[%d]: %s\n", i, nc->data); 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels nc = nc->next; 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels i++; 519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (i == 1) { 539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("(none)\n"); 549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_slist_free_all(cookies); 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsmain(void) 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURL *curl; 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURLcode res; 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_init(CURL_GLOBAL_ALL); 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl = curl_easy_init(); 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (curl) { 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels char nline[256]; 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/"); 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */ 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_perform(curl); 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (res != CURLE_OK) { 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels print_cookies(curl); 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("Erasing curl's knowledge of cookies!\n"); 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL"); 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels print_cookies(curl); 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("-----------------------------------------------\n" 869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "Setting a cookie \"PREF\" via cookie interface:\n"); 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef WIN32 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#define snprintf _snprintf 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Netscape format cookie */ 919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s", 92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ".google.com", "TRUE", "/", "FALSE", (unsigned long)time(NULL) + 31337UL, "PREF", "hello google, i like you very much!"); 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (res != CURLE_OK) { 959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res)); 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 99e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* HTTP-header style cookie. If you use the Set-Cookie format and don't 100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET specify a domain then the cookie is sent for any domain and will not be 101e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET modified, likely not what you intended. Starting in 7.43.0 any-domain 102e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET cookies will not be exported either. For more information refer to the 103e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET CURLOPT_COOKIELIST documentation. 104e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels snprintf(nline, sizeof(nline), 1069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "Set-Cookie: OLD_PREF=3d141414bf4209321; " 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com"); 1089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); 1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (res != CURLE_OK) { 1109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res)); 1119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 1129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels print_cookies(curl); 1159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_perform(curl); 1179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (res != CURLE_OK) { 1189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); 1199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 1209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 1239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Curl init failed!\n"); 1249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 1259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 1289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; 1299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 130