mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Improvements/fixes to HTTP Content-Disposition header support.
This commit is contained in:
parent
ad445da01c
commit
9a66d92f60
@ -1,3 +1,16 @@
|
|||||||
|
2006-04-28 Mauro Tortonesi <mauro@ferrara.linux.it>
|
||||||
|
|
||||||
|
* http.c: If Content-Disposition header is present, allow unique
|
||||||
|
filename generation unless -nc is given. Permit to disable parsing of
|
||||||
|
Content-Disposition header.
|
||||||
|
|
||||||
|
* options.h: Added option --no-content-disposition to disable parsing
|
||||||
|
of HTTP Content-Disposition header.
|
||||||
|
|
||||||
|
* init.c: Ditto.
|
||||||
|
|
||||||
|
* main.c: Ditto.
|
||||||
|
|
||||||
2006-04-11 Hrvoje Niksic <hniksic@xemacs.org>
|
2006-04-11 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
* hash.c (TOLOWER): Wrap macro arg in parentheses.
|
* hash.c (TOLOWER): Wrap macro arg in parentheses.
|
||||||
|
62
src/http.c
62
src/http.c
@ -1726,33 +1726,49 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
|
|||||||
|
|
||||||
/* Determine the local filename if needed. Notice that if -O is used
|
/* Determine the local filename if needed. Notice that if -O is used
|
||||||
* hstat.local_file is set by http_loop to the argument of -O. */
|
* hstat.local_file is set by http_loop to the argument of -O. */
|
||||||
if (!hs->local_file)
|
if (!hs->local_file)
|
||||||
{
|
{
|
||||||
/* Honor Content-Disposition whether possible. */
|
/* Honor Content-Disposition whether possible. */
|
||||||
if (!resp_header_copy (resp, "Content-Disposition", hdrval, sizeof (hdrval))
|
if (!opt.content_disposition
|
||||||
|
|| !resp_header_copy (resp, "Content-Disposition",
|
||||||
|
hdrval, sizeof (hdrval))
|
||||||
|| !parse_content_disposition (hdrval, &hs->local_file))
|
|| !parse_content_disposition (hdrval, &hs->local_file))
|
||||||
{
|
{
|
||||||
/* Choose filename according to URL name. */
|
/* The Content-Disposition header is missing or broken.
|
||||||
|
* Choose unique file name according to given URL. */
|
||||||
hs->local_file = url_file_name (u);
|
hs->local_file = url_file_name (u);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUGP (("hs->local_file is: %s %s\n", hs->local_file,
|
||||||
|
file_exists_p (hs->local_file) ? "(existing)" : "(not existing)"));
|
||||||
|
|
||||||
/* TODO: perform this check only once. */
|
/* TODO: perform this check only once. */
|
||||||
if (opt.noclobber && file_exists_p (hs->local_file))
|
if (file_exists_p (hs->local_file))
|
||||||
{
|
{
|
||||||
/* If opt.noclobber is turned on and file already exists, do not
|
if (opt.noclobber)
|
||||||
retrieve the file */
|
{
|
||||||
logprintf (LOG_VERBOSE, _("\
|
/* If opt.noclobber is turned on and file already exists, do not
|
||||||
|
retrieve the file */
|
||||||
|
logprintf (LOG_VERBOSE, _("\
|
||||||
File `%s' already there; not retrieving.\n\n"), hs->local_file);
|
File `%s' already there; not retrieving.\n\n"), hs->local_file);
|
||||||
/* If the file is there, we suppose it's retrieved OK. */
|
/* If the file is there, we suppose it's retrieved OK. */
|
||||||
*dt |= RETROKF;
|
*dt |= RETROKF;
|
||||||
|
|
||||||
/* #### Bogusness alert. */
|
/* #### Bogusness alert. */
|
||||||
/* If its suffix is "html" or "htm" or similar, assume text/html. */
|
/* If its suffix is "html" or "htm" or similar, assume text/html. */
|
||||||
if (has_html_suffix_p (hs->local_file))
|
if (has_html_suffix_p (hs->local_file))
|
||||||
*dt |= TEXTHTML;
|
*dt |= TEXTHTML;
|
||||||
|
|
||||||
return RETROK;
|
return RETROK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *unique = unique_name (hs->local_file, true);
|
||||||
|
if (unique != hs->local_file)
|
||||||
|
xfree (hs->local_file);
|
||||||
|
hs->local_file = unique;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Support timestamping */
|
/* Support timestamping */
|
||||||
@ -1998,11 +2014,13 @@ File `%s' already there; not retrieving.\n\n"), hs->local_file);
|
|||||||
content-type. */
|
content-type. */
|
||||||
if (!type ||
|
if (!type ||
|
||||||
0 == strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)) ||
|
0 == strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)) ||
|
||||||
0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S)))
|
0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S)))
|
||||||
*dt |= TEXTHTML;
|
*dt |= TEXTHTML;
|
||||||
else
|
else
|
||||||
*dt &= ~TEXTHTML;
|
*dt &= ~TEXTHTML;
|
||||||
|
|
||||||
|
DEBUGP (("TEXTHTML is %s.\n", *dt | TEXTHTML ? "on": "off"));
|
||||||
|
|
||||||
if (opt.html_extension && (*dt & TEXTHTML))
|
if (opt.html_extension && (*dt & TEXTHTML))
|
||||||
/* -E / --html-extension / html_extension = on was specified, and this is a
|
/* -E / --html-extension / html_extension = on was specified, and this is a
|
||||||
text/html file. If some case-insensitive variation on ".htm[l]" isn't
|
text/html file. If some case-insensitive variation on ".htm[l]" isn't
|
||||||
@ -2121,13 +2139,6 @@ File `%s' already there; not retrieving.\n\n"), hs->local_file);
|
|||||||
return RETRFINISHED;
|
return RETRFINISHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print fetch message, if opt.verbose. */
|
|
||||||
if (opt.verbose)
|
|
||||||
{
|
|
||||||
logprintf (LOG_NOTQUIET, _("Saving to: `%s'\n"),
|
|
||||||
HYPHENP (hs->local_file) ? "STDOUT" : hs->local_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open the local file. */
|
/* Open the local file. */
|
||||||
if (!output_stream)
|
if (!output_stream)
|
||||||
{
|
{
|
||||||
@ -2164,6 +2175,13 @@ File `%s' already there; not retrieving.\n\n"), hs->local_file);
|
|||||||
else
|
else
|
||||||
fp = output_stream;
|
fp = output_stream;
|
||||||
|
|
||||||
|
/* Print fetch message, if opt.verbose. */
|
||||||
|
if (opt.verbose)
|
||||||
|
{
|
||||||
|
logprintf (LOG_NOTQUIET, _("Saving to: `%s'\n"),
|
||||||
|
HYPHENP (hs->local_file) ? "STDOUT" : hs->local_file);
|
||||||
|
}
|
||||||
|
|
||||||
/* This confuses the timestamping code that checks for file size.
|
/* This confuses the timestamping code that checks for file size.
|
||||||
#### The timestamping code should be smarter about file size. */
|
#### The timestamping code should be smarter about file size. */
|
||||||
if (opt.save_headers && hs->restval == 0)
|
if (opt.save_headers && hs->restval == 0)
|
||||||
|
@ -126,6 +126,7 @@ static struct {
|
|||||||
{ "connecttimeout", &opt.connect_timeout, cmd_time },
|
{ "connecttimeout", &opt.connect_timeout, cmd_time },
|
||||||
{ "continue", &opt.always_rest, cmd_boolean },
|
{ "continue", &opt.always_rest, cmd_boolean },
|
||||||
{ "convertlinks", &opt.convert_links, cmd_boolean },
|
{ "convertlinks", &opt.convert_links, cmd_boolean },
|
||||||
|
{ "contentdisposition", &opt.content_disposition, cmd_boolean },
|
||||||
{ "cookies", &opt.cookies, cmd_boolean },
|
{ "cookies", &opt.cookies, cmd_boolean },
|
||||||
{ "cutdirs", &opt.cut_dirs, cmd_number },
|
{ "cutdirs", &opt.cut_dirs, cmd_number },
|
||||||
#ifdef ENABLE_DEBUG
|
#ifdef ENABLE_DEBUG
|
||||||
@ -313,6 +314,8 @@ defaults (void)
|
|||||||
opt.restrict_files_os = restrict_windows;
|
opt.restrict_files_os = restrict_windows;
|
||||||
#endif
|
#endif
|
||||||
opt.restrict_files_ctrl = true;
|
opt.restrict_files_ctrl = true;
|
||||||
|
|
||||||
|
opt.content_disposition = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the user's home directory (strdup-ed), or NULL if none is
|
/* Return the user's home directory (strdup-ed), or NULL if none is
|
||||||
|
@ -143,6 +143,7 @@ static struct cmdline_option option_data[] =
|
|||||||
{ "connect-timeout", 0, OPT_VALUE, "connecttimeout", -1 },
|
{ "connect-timeout", 0, OPT_VALUE, "connecttimeout", -1 },
|
||||||
{ "continue", 'c', OPT_BOOLEAN, "continue", -1 },
|
{ "continue", 'c', OPT_BOOLEAN, "continue", -1 },
|
||||||
{ "convert-links", 'k', OPT_BOOLEAN, "convertlinks", -1 },
|
{ "convert-links", 'k', OPT_BOOLEAN, "convertlinks", -1 },
|
||||||
|
{ "content-disposition", 0, OPT_BOOLEAN, "contentdisposition", -1 },
|
||||||
{ "cookies", 0, OPT_BOOLEAN, "cookies", -1 },
|
{ "cookies", 0, OPT_BOOLEAN, "cookies", -1 },
|
||||||
{ "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 },
|
{ "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 },
|
||||||
{ WHEN_DEBUG ("debug"), 'd', OPT_BOOLEAN, "debug", -1 },
|
{ WHEN_DEBUG ("debug"), 'd', OPT_BOOLEAN, "debug", -1 },
|
||||||
@ -518,6 +519,8 @@ HTTP options:\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"),
|
||||||
N_("\
|
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_("\
|
||||||
|
--no-content-disposition don't honor Content-Disposition header.\n"),
|
||||||
"\n",
|
"\n",
|
||||||
|
|
||||||
#ifdef HAVE_SSL
|
#ifdef HAVE_SSL
|
||||||
|
@ -220,6 +220,8 @@ struct options
|
|||||||
prefer_none
|
prefer_none
|
||||||
} prefer_family; /* preferred address family when more
|
} prefer_family; /* preferred address family when more
|
||||||
than one type is available */
|
than one type is available */
|
||||||
|
|
||||||
|
bool content_disposition; /* Honor HTTP Content-Disposition header. */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct options opt;
|
extern struct options opt;
|
||||||
|
Loading…
Reference in New Issue
Block a user