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

[svn] Fix various cookie-related problems.

This commit is contained in:
hniksic 2005-04-26 06:34:33 -07:00
parent 8cacec82fa
commit 428c1a2b3c
4 changed files with 61 additions and 14 deletions

View File

@ -1,3 +1,18 @@
2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
* cookies.c (cookie_handle_set_cookie): Delete the part of the
path after the trailing slash.
* http.c (gethttp): Call cookie_handle_set_cookie with path that
begins with '/'.
2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
* http.c (gethttp): Call skip_short_body only if keep_alive is in
use.
(gethttp): Send the User-Agent header with the CONNECT request as
well.
2005-04-25 Hrvoje Niksic <hniksic@xemacs.org> 2005-04-25 Hrvoje Niksic <hniksic@xemacs.org>
* main.c (option_data): Removed support for the undocumented flag * main.c (option_data): Removed support for the undocumented flag

View File

@ -870,9 +870,19 @@ cookie_handle_set_cookie (struct cookie_jar *jar,
} }
if (!cookie->path) if (!cookie->path)
cookie->path = xstrdup (path); {
/* The cookie doesn't set path: set it to the URL path, sans the
file part ("/dir/file" truncated to "/dir/"). */
char *trailing_slash = strrchr (path, '/');
if (trailing_slash)
cookie->path = strdupdelim (path, trailing_slash + 1);
else
/* no slash in the string -- can this even happen? */
cookie->path = xstrdup (path);
}
else else
{ {
/* The cookie sets its own path; verify that it is legal. */
if (!check_path_match (cookie->path, path)) if (!check_path_match (cookie->path, path))
{ {
DEBUGP (("Attempt to fake the path: %s, %s\n", DEBUGP (("Attempt to fake the path: %s, %s\n",
@ -881,6 +891,9 @@ cookie_handle_set_cookie (struct cookie_jar *jar,
} }
} }
/* Now store the cookie, or discard an existing cookie, if
discarding was requested. */
if (cookie->discard_requested) if (cookie->discard_requested)
{ {
discard_matching_cookie (jar, cookie); discard_matching_cookie (jar, cookie);

View File

@ -1113,6 +1113,14 @@ time_t http_atotm PARAMS ((const char *));
&& (ISSPACE (line[sizeof (string_constant) - 1]) \ && (ISSPACE (line[sizeof (string_constant) - 1]) \
|| !line[sizeof (string_constant) - 1])) || !line[sizeof (string_constant) - 1]))
#define SET_USER_AGENT(req) \
if (opt.useragent) \
request_set_header (req, "User-Agent", opt.useragent, rel_none); \
else \
request_set_header (req, "User-Agent", \
aprintf ("Wget/%s", version_string), rel_value);
/* Retrieve a document through HTTP protocol. It recognizes status /* Retrieve a document through HTTP protocol. It recognizes status
code, and correctly handles redirections. It closes the network code, and correctly handles redirections. It closes the network
socket. If it receives an error from the functions below it, it socket. If it receives an error from the functions below it, it
@ -1245,11 +1253,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
aprintf ("bytes=%s-", aprintf ("bytes=%s-",
number_to_static_string (hs->restval)), number_to_static_string (hs->restval)),
rel_value); rel_value);
if (opt.useragent) SET_USER_AGENT (req);
request_set_header (req, "User-Agent", opt.useragent, rel_none);
else
request_set_header (req, "User-Agent",
aprintf ("Wget/%s", version_string), rel_value);
request_set_header (req, "Accept", "*/*", rel_none); request_set_header (req, "Accept", "*/*", rel_none);
/* Find the username and password for authentication. */ /* Find the username and password for authentication. */
@ -1455,6 +1459,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
struct request *connreq = request_new (); struct request *connreq = request_new ();
request_set_method (connreq, "CONNECT", request_set_method (connreq, "CONNECT",
aprintf ("%s:%d", u->host, u->port)); aprintf ("%s:%d", u->host, u->port));
SET_USER_AGENT (req);
if (proxyauth) if (proxyauth)
{ {
request_set_header (connreq, "Proxy-Authorization", request_set_header (connreq, "Proxy-Authorization",
@ -1464,6 +1469,10 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
the regular request below. */ the regular request below. */
proxyauth = NULL; proxyauth = NULL;
} }
/* Examples in rfc2817 use the Host header in CONNECT
requests. I don't see how that gains anything, given
that the contents of Host would be exactly the same as
the contents of CONNECT. */
write_error = request_send (connreq, sock); write_error = request_send (connreq, sock);
request_free (connreq); request_free (connreq);
@ -1622,10 +1631,13 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
if (statcode == HTTP_STATUS_UNAUTHORIZED) if (statcode == HTTP_STATUS_UNAUTHORIZED)
{ {
/* Authorization is required. */ /* Authorization is required. */
if (skip_short_body (sock, contlen)) if (keep_alive)
CLOSE_FINISH (sock); {
else if (skip_short_body (sock, contlen))
CLOSE_INVALIDATE (sock); CLOSE_FINISH (sock);
else
CLOSE_INVALIDATE (sock);
}
pconn.authorized = 0; pconn.authorized = 0;
if (auth_finished || !(user && passwd)) if (auth_finished || !(user && passwd))
{ {
@ -1714,6 +1726,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
/* Handle (possibly multiple instances of) the Set-Cookie header. */ /* Handle (possibly multiple instances of) the Set-Cookie header. */
{ {
char *pth = NULL;
int scpos; int scpos;
const char *scbeg, *scend; const char *scbeg, *scend;
/* The jar should have been created by now. */ /* The jar should have been created by now. */
@ -1723,10 +1736,16 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
&scbeg, &scend)) != -1; &scbeg, &scend)) != -1;
++scpos) ++scpos)
{ {
char *set_cookie = strdupdelim (scbeg, scend); char *set_cookie; BOUNDED_TO_ALLOCA (scbeg, scend, set_cookie);
cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port, u->path, if (pth == NULL)
{
/* u->path doesn't begin with /, which cookies.c expects. */
pth = (char *) alloca (1 + strlen (u->path) + 1);
pth[0] = '/';
strcpy (pth + 1, u->path);
}
cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port, pth,
set_cookie); set_cookie);
xfree (set_cookie);
} }
} }

View File

@ -245,7 +245,7 @@ struct cmdline_option option_data[] =
{ IF_SSL ("sslcertkey"), 0, OPT_VALUE, "sslcertkey", -1 }, { IF_SSL ("sslcertkey"), 0, OPT_VALUE, "sslcertkey", -1 },
{ IF_SSL ("sslcerttype"), 0, OPT_VALUE, "sslcerttype", -1 }, { IF_SSL ("sslcerttype"), 0, OPT_VALUE, "sslcerttype", -1 },
{ IF_SSL ("sslcheckcert"), 0, OPT_VALUE, "sslcheckcert", -1 }, { IF_SSL ("sslcheckcert"), 0, OPT_VALUE, "sslcheckcert", -1 },
{ IF_SSL ("sslprotocol"), 0, OPT_VALUE, "sslprotocol", -1 }, { IF_SSL ("secure-protocol"), 0, OPT_VALUE, "secureprotocol", -1 },
{ "strict-comments", 0, OPT_BOOLEAN, "strictcomments", -1 }, { "strict-comments", 0, OPT_BOOLEAN, "strictcomments", -1 },
{ "timeout", 'T', OPT_VALUE, "timeout", -1 }, { "timeout", 'T', OPT_VALUE, "timeout", -1 },
{ "timestamping", 'N', OPT_BOOLEAN, "timestamping", -1 }, { "timestamping", 'N', OPT_BOOLEAN, "timestamping", -1 },