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