1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

[svn] New option --keep-session-cookies.

This commit is contained in:
hniksic 2003-11-04 16:11:33 -08:00
parent c3e7a030de
commit 38b37ed104
8 changed files with 95 additions and 67 deletions

View File

@ -1,3 +1,15 @@
2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
* cookies.c (save_cookies_mapper): Respect the setting of
keep-session-cookies.
(cookie_jar_load): Import session cookies.
Based on code submitted by Nicolas Schodet.
* utils.c (datetime_str): Use information in TM when it's
non-NULL.
* main.c (main): New option `--keep-session-cookies'.
2003-11-04 Hrvoje Niksic <hniksic@xemacs.org> 2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
* Makefile.in (realclean): Delete config.h.in. * Makefile.in (realclean): Delete config.h.in.

View File

@ -108,12 +108,13 @@ struct cookie {
whole. */ whole. */
int permanent; /* whether the cookie should outlive int permanent; /* whether the cookie should outlive
the session */ the session. */
time_t expiry_time; /* time when the cookie expires */ time_t expiry_time; /* time when the cookie expires, 0
means undetermined. */
int discard_requested; /* whether cookie was created to int discard_requested; /* whether cookie was created to
request discarding another request discarding another
cookie */ cookie. */
char *attr; /* cookie attribute name */ char *attr; /* cookie attribute name */
char *value; /* cookie attribute value */ char *value; /* cookie attribute value */
@ -123,7 +124,6 @@ struct cookie {
}; };
#define PORT_ANY (-1) #define PORT_ANY (-1)
#define COOKIE_EXPIRED_P(c) ((c)->expiry_time != 0 && (c)->expiry_time < cookies_now)
/* Allocate and return a new, empty cookie structure. */ /* Allocate and return a new, empty cookie structure. */
@ -132,14 +132,23 @@ cookie_new (void)
{ {
struct cookie *cookie = xnew0 (struct cookie); struct cookie *cookie = xnew0 (struct cookie);
/* Both cookie->permanent and cookie->expiry_time are now 0. By /* Both cookie->permanent and cookie->expiry_time are now 0. This
default, we assume that the cookie is non-permanent and valid means that the cookie doesn't expire, but is only valid for this
until the end of the session. */ session (i.e. not written out to disk). */
cookie->port = PORT_ANY; cookie->port = PORT_ANY;
return cookie; return cookie;
} }
/* Non-zero if the cookie has expired. Assumes cookies_now has been
set by one of the entry point functions. */
static int
cookie_expired_p (const struct cookie *c)
{
return c->expiry_time != 0 && c->expiry_time < cookies_now;
}
/* Deallocate COOKIE and its components. */ /* Deallocate COOKIE and its components. */
static void static void
@ -252,16 +261,21 @@ store_cookie (struct cookie_jar *jar, struct cookie *cookie)
hash_table_put (jar->chains, chain_key, cookie); hash_table_put (jar->chains, chain_key, cookie);
++jar->cookie_count; ++jar->cookie_count;
DEBUGP (("\nStored cookie %s %d%s %s %s %d %s %s %s\n", #ifdef ENABLE_DEBUG
if (opt.debug)
{
time_t exptime = (time_t) cookie->expiry_time;
DEBUGP (("\nStored cookie %s %d%s %s <%s> <%s> [expiry %s] %s %s\n",
cookie->domain, cookie->port, cookie->domain, cookie->port,
cookie->port == PORT_ANY ? " (ANY)" : "", cookie->port == PORT_ANY ? " (ANY)" : "",
cookie->path, cookie->path,
cookie->permanent ? "permanent" : "nonpermanent", cookie->permanent ? "permanent" : "session",
cookie->secure, cookie->secure ? "secure" : "insecure",
cookie->expiry_time cookie->expiry_time ? datetime_str (&exptime) : "none",
? asctime (localtime (&cookie->expiry_time)) : "<undefined>",
cookie->attr, cookie->value)); cookie->attr, cookie->value));
} }
#endif
}
/* Discard a cookie matching COOKIE's domain, port, path, and /* Discard a cookie matching COOKIE's domain, port, path, and
attribute name. This gets called when we encounter a cookie whose attribute name. This gets called when we encounter a cookie whose
@ -386,8 +400,8 @@ update_cookie_field (struct cookie *cookie,
cookie->expiry_time = (time_t)expires; cookie->expiry_time = (time_t)expires;
} }
else else
/* Error in expiration spec. Assume default (cookie valid for /* Error in expiration spec. Assume default (cookie doesn't
this session.) */ expire, but valid only for this session.) */
; ;
/* According to netscape's specification, expiry time in the /* According to netscape's specification, expiry time in the
@ -649,8 +663,8 @@ parse_set_cookies (const char *sc,
/* Check whether ADDR matches <digits>.<digits>.<digits>.<digits>. /* Check whether ADDR matches <digits>.<digits>.<digits>.<digits>.
We don't want to call network functions like inet_addr() because all We don't want to call network functions like inet_addr() because
we need is a check, preferrably one that is small, fast, and all we need is a check, preferrably one that is small, fast, and
well-defined. */ well-defined. */
static int static int
@ -818,7 +832,7 @@ check_path_match (const char *cookie_path, const char *path)
depending on the contents. */ depending on the contents. */
void void
cookie_jar_process_set_cookie (struct cookie_jar *jar, cookie_handle_set_cookie (struct cookie_jar *jar,
const char *host, int port, const char *host, int port,
const char *path, const char *set_cookie) const char *path, const char *set_cookie)
{ {
@ -969,7 +983,7 @@ cookie_matches_url (const struct cookie *cookie,
{ {
int pg; int pg;
if (COOKIE_EXPIRED_P (cookie)) if (cookie_expired_p (cookie))
/* Ignore stale cookies. Don't bother unchaining the cookie at /* Ignore stale cookies. Don't bother unchaining the cookie at
this point -- Wget is a relatively short-lived application, and this point -- Wget is a relatively short-lived application, and
stale cookies will not be saved by `save_cookies'. On the stale cookies will not be saved by `save_cookies'. On the
@ -1097,9 +1111,8 @@ goodness_comparator (const void *p1, const void *p2)
generated, NULL is returned. */ generated, NULL is returned. */
char * char *
cookie_jar_generate_cookie_header (struct cookie_jar *jar, const char *host, cookie_header (struct cookie_jar *jar, const char *host,
int port, const char *path, int port, const char *path, int secflag)
int connection_secure_p)
{ {
struct cookie **chains; struct cookie **chains;
int chain_count; int chain_count;
@ -1132,8 +1145,7 @@ cookie_jar_generate_cookie_header (struct cookie_jar *jar, const char *host,
count = 0; count = 0;
for (i = 0; i < chain_count; i++) for (i = 0; i < chain_count; i++)
for (cookie = chains[i]; cookie; cookie = cookie->next) for (cookie = chains[i]; cookie; cookie = cookie->next)
if (cookie_matches_url (cookie, host, port, path, connection_secure_p, if (cookie_matches_url (cookie, host, port, path, secflag, NULL))
NULL))
++count; ++count;
if (!count) if (!count)
return NULL; /* no cookies matched */ return NULL; /* no cookies matched */
@ -1148,8 +1160,7 @@ cookie_jar_generate_cookie_header (struct cookie_jar *jar, const char *host,
for (cookie = chains[i]; cookie; cookie = cookie->next) for (cookie = chains[i]; cookie; cookie = cookie->next)
{ {
int pg; int pg;
if (!cookie_matches_url (cookie, host, port, path, if (!cookie_matches_url (cookie, host, port, path, secflag, &pg))
connection_secure_p, &pg))
continue; continue;
outgoing[ocnt].cookie = cookie; outgoing[ocnt].cookie = cookie;
outgoing[ocnt].domain_goodness = strlen (cookie->domain); outgoing[ocnt].domain_goodness = strlen (cookie->domain);
@ -1356,14 +1367,21 @@ cookie_jar_load (struct cookie_jar *jar, const char *file)
malloced.) */ malloced.) */
*expires_e = '\0'; *expires_e = '\0';
sscanf (expires_b, "%lf", &expiry); sscanf (expires_b, "%lf", &expiry);
if (expiry < cookies_now)
/* ignore stale cookie. */
goto abort;
cookie->expiry_time = expiry;
/* If the cookie has survived being saved into an external file, if (expiry == 0)
it is obviously permanent. */ {
/* EXPIRY can be 0 for session cookies saved because the
user specified `--keep-session-cookies' in the past.
They remain session cookies, and will be saved only if
the user has specified `keep-session-cookies' again. */
}
else
{
if (expiry < cookies_now)
goto abort; /* ignore stale cookie. */
cookie->expiry_time = expiry;
cookie->permanent = 1; cookie->permanent = 1;
}
store_cookie (jar, cookie); store_cookie (jar, cookie);
@ -1388,9 +1406,9 @@ save_cookies_mapper (void *key, void *value, void *arg)
struct cookie *cookie = (struct cookie *)value; struct cookie *cookie = (struct cookie *)value;
for (; cookie; cookie = cookie->next) for (; cookie; cookie = cookie->next)
{ {
if (!cookie->permanent) if (!cookie->permanent && !opt.keep_session_cookies)
continue; continue;
if (COOKIE_EXPIRED_P (cookie)) if (cookie_expired_p (cookie))
continue; continue;
if (!cookie->domain_exact) if (!cookie->domain_exact)
fputc ('.', fp); fputc ('.', fp);
@ -1428,7 +1446,7 @@ cookie_jar_save (struct cookie_jar *jar, const char *file)
} }
fputs ("# HTTP cookie file.\n", fp); fputs ("# HTTP cookie file.\n", fp);
fprintf (fp, "# Generated by Wget on %s.\n", datetime_str (NULL)); fprintf (fp, "# Generated by Wget on %s.\n", datetime_str (&cookies_now));
fputs ("# Edit at your own risk.\n\n", fp); fputs ("# Edit at your own risk.\n\n", fp);
hash_table_map (jar->chains, save_cookies_mapper, fp); hash_table_map (jar->chains, save_cookies_mapper, fp);
@ -1436,7 +1454,6 @@ cookie_jar_save (struct cookie_jar *jar, const char *file)
if (ferror (fp)) if (ferror (fp))
logprintf (LOG_NOTQUIET, _("Error writing to `%s': %s\n"), logprintf (LOG_NOTQUIET, _("Error writing to `%s': %s\n"),
file, strerror (errno)); file, strerror (errno));
if (fclose (fp) < 0) if (fclose (fp) < 0)
logprintf (LOG_NOTQUIET, _("Error closing `%s': %s\n"), logprintf (LOG_NOTQUIET, _("Error closing `%s': %s\n"),
file, strerror (errno)); file, strerror (errno));

View File

@ -35,11 +35,10 @@ struct cookie_jar;
struct cookie_jar *cookie_jar_new PARAMS ((void)); struct cookie_jar *cookie_jar_new PARAMS ((void));
void cookie_jar_delete PARAMS ((struct cookie_jar *)); void cookie_jar_delete PARAMS ((struct cookie_jar *));
void cookie_jar_process_set_cookie PARAMS ((struct cookie_jar *, const char *, void cookie_handle_set_cookie PARAMS ((struct cookie_jar *, const char *,
int, const char *, const char *)); int, const char *, const char *));
char *cookie_jar_generate_cookie_header PARAMS ((struct cookie_jar *, char *cookie_header PARAMS ((struct cookie_jar *,
const char *, int, const char *, int, const char *, int));
const char *, int));
void cookie_jar_load PARAMS ((struct cookie_jar *, const char *)); void cookie_jar_load PARAMS ((struct cookie_jar *, const char *));
void cookie_jar_save PARAMS ((struct cookie_jar *, const char *)); void cookie_jar_save PARAMS ((struct cookie_jar *, const char *));

View File

@ -344,8 +344,7 @@ http_process_set_cookie (const char *hdr, void *arg)
/* The jar should have been created by now. */ /* The jar should have been created by now. */
assert (wget_cookie_jar != NULL); assert (wget_cookie_jar != NULL);
cookie_jar_process_set_cookie (wget_cookie_jar, u->host, u->port, u->path, cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port, u->path, hdr);
hdr);
return 1; return 1;
} }
@ -901,8 +900,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
request_keep_alive = NULL; request_keep_alive = NULL;
if (opt.cookies) if (opt.cookies)
cookies = cookie_jar_generate_cookie_header (wget_cookie_jar, u->host, cookies = cookie_header (wget_cookie_jar, u->host, u->port, u->path,
u->port, u->path,
#ifdef HAVE_SSL #ifdef HAVE_SSL
u->scheme == SCHEME_HTTPS u->scheme == SCHEME_HTTPS
#else #else

View File

@ -167,6 +167,7 @@ static struct {
{ "ignoretags", &opt.ignore_tags, cmd_vector }, { "ignoretags", &opt.ignore_tags, cmd_vector },
{ "includedirectories", &opt.includes, cmd_directory_vector }, { "includedirectories", &opt.includes, cmd_directory_vector },
{ "input", &opt.input_filename, cmd_file }, { "input", &opt.input_filename, cmd_file },
{ "keepsessioncookies", &opt.keep_session_cookies, cmd_boolean },
{ "killlonger", &opt.kill_longer, cmd_boolean }, { "killlonger", &opt.kill_longer, cmd_boolean },
{ "limitrate", &opt.limit_rate, cmd_bytes }, { "limitrate", &opt.limit_rate, cmd_bytes },
{ "loadcookies", &opt.cookies_input, cmd_file }, { "loadcookies", &opt.cookies_input, cmd_file },

View File

@ -210,6 +210,7 @@ HTTP options:\n\
--cookies=off don't use cookies.\n\ --cookies=off don't use cookies.\n\
--load-cookies=FILE load cookies from FILE before session.\n\ --load-cookies=FILE load cookies from FILE before session.\n\
--save-cookies=FILE save cookies to FILE after session.\n\ --save-cookies=FILE save cookies to FILE after session.\n\
--keep-session-cookies load and save session (non-permanent) cookies.\n\
--post-data=STRING use the POST method; send STRING as the data.\n\ --post-data=STRING use the POST method; send STRING as the data.\n\
--post-file=FILE use the POST method; send contents of FILE.\n\ --post-file=FILE use the POST method; send contents of FILE.\n\
\n"), stdout); \n"), stdout);
@ -287,6 +288,7 @@ main (int argc, char *const *argv)
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
{ "html-extension", no_argument, NULL, 'E' }, { "html-extension", no_argument, NULL, 'E' },
{ "ignore-length", no_argument, NULL, 138 }, { "ignore-length", no_argument, NULL, 138 },
{ "keep-session-cookies", no_argument, NULL, 181 },
{ "mirror", no_argument, NULL, 'm' }, { "mirror", no_argument, NULL, 'm' },
{ "no-clobber", no_argument, NULL, 141 }, { "no-clobber", no_argument, NULL, 141 },
{ "no-directories", no_argument, NULL, 147 }, { "no-directories", no_argument, NULL, 147 },
@ -536,6 +538,9 @@ GNU General Public License for more details.\n"));
case 177: case 177:
setoptval ("strictcomments", "on"); setoptval ("strictcomments", "on");
break; break;
case 181:
setoptval ("keepsessioncookies", "on");
break;
/* Options accepting an argument: */ /* Options accepting an argument: */
case 129: case 129:

View File

@ -177,9 +177,11 @@ struct options
int sslprotocol; /* 0 = auto / 1 = v2 / 2 = v3 / 3 = TLSv1 */ int sslprotocol; /* 0 = auto / 1 = v2 / 2 = v3 / 3 = TLSv1 */
#endif /* HAVE_SSL */ #endif /* HAVE_SSL */
int cookies; int cookies; /* whether cookies are used. */
char *cookies_input; char *cookies_input; /* file we're loading the cookies from. */
char *cookies_output; char *cookies_output; /* file we're saving the cookies to. */
int keep_session_cookies; /* whether session cookies should be
saved and loaded. */
char *post_data; /* POST query string */ char *post_data; /* POST query string */
char *post_file_name; /* File to post */ char *post_file_name; /* File to post */

View File

@ -177,20 +177,14 @@ sepstring (const char *s)
/* Return pointer to a static char[] buffer in which zero-terminated /* Return pointer to a static char[] buffer in which zero-terminated
string-representation of TM (in form hh:mm:ss) is printed. string-representation of TM (in form hh:mm:ss) is printed.
If TM is non-NULL, the current time-in-seconds will be stored If TM is NULL, the current time will be used. */
there.
(#### This is misleading: one would expect TM would be used instead
of the current time in that case. This design was probably
influenced by the design time(2), and should be changed at some
points. No callers use non-NULL TM anyway.) */
char * char *
time_str (time_t *tm) time_str (time_t *tm)
{ {
static char output[15]; static char output[15];
struct tm *ptm; struct tm *ptm;
time_t secs = time (tm); time_t secs = tm ? *tm : time (NULL);
if (secs == -1) if (secs == -1)
{ {
@ -211,7 +205,7 @@ datetime_str (time_t *tm)
{ {
static char output[20]; /* "YYYY-MM-DD hh:mm:ss" + \0 */ static char output[20]; /* "YYYY-MM-DD hh:mm:ss" + \0 */
struct tm *ptm; struct tm *ptm;
time_t secs = time (tm); time_t secs = tm ? *tm : time (NULL);
if (secs == -1) if (secs == -1)
{ {