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:
parent
c3e7a030de
commit
38b37ed104
@ -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.
|
||||||
|
103
src/cookies.c
103
src/cookies.c
@ -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,15 +261,20 @@ 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
|
||||||
cookie->domain, cookie->port,
|
if (opt.debug)
|
||||||
cookie->port == PORT_ANY ? " (ANY)" : "",
|
{
|
||||||
cookie->path,
|
time_t exptime = (time_t) cookie->expiry_time;
|
||||||
cookie->permanent ? "permanent" : "nonpermanent",
|
DEBUGP (("\nStored cookie %s %d%s %s <%s> <%s> [expiry %s] %s %s\n",
|
||||||
cookie->secure,
|
cookie->domain, cookie->port,
|
||||||
cookie->expiry_time
|
cookie->port == PORT_ANY ? " (ANY)" : "",
|
||||||
? asctime (localtime (&cookie->expiry_time)) : "<undefined>",
|
cookie->path,
|
||||||
cookie->attr, cookie->value));
|
cookie->permanent ? "permanent" : "session",
|
||||||
|
cookie->secure ? "secure" : "insecure",
|
||||||
|
cookie->expiry_time ? datetime_str (&exptime) : "none",
|
||||||
|
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
|
||||||
@ -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,9 +663,9 @@ 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
|
||||||
numeric_address_p (const char *addr)
|
numeric_address_p (const char *addr)
|
||||||
@ -818,9 +832,9 @@ 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)
|
||||||
{
|
{
|
||||||
struct cookie *cookie;
|
struct cookie *cookie;
|
||||||
cookies_now = time (NULL);
|
cookies_now = time (NULL);
|
||||||
@ -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. */
|
{
|
||||||
cookie->permanent = 1;
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
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));
|
||||||
|
@ -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 *));
|
||||||
|
12
src/http.c
12
src/http.c
@ -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,14 +900,13 @@ 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
|
||||||
0
|
0
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
if (opt.post_data || opt.post_file_name)
|
if (opt.post_data || opt.post_file_name)
|
||||||
{
|
{
|
||||||
|
@ -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 },
|
||||||
|
@ -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:
|
||||||
|
@ -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 */
|
||||||
|
12
src/utils.c
12
src/utils.c
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user