mirror of
https://github.com/mirror/wget.git
synced 2025-02-05 09:10:12 +08:00
[svn] Restructure generation of HTTP requests. Allow headers specified with
--header to override generated headers.
This commit is contained in:
parent
83b0e38940
commit
0ff9eb4727
6
NEWS
6
NEWS
@ -14,6 +14,12 @@ use of IPv4 and IPv6 respectively.
|
||||
|
||||
** Talking to SSL servers over proxies now actually works.
|
||||
|
||||
** The `--header' option can now be used to override generated
|
||||
headers. For example, `wget --header="Host: foo.bar"
|
||||
http://127.0.0.1' tells Wget to connect to localhost, but to specify
|
||||
"foo.bar" in the `Host' header. In previous versions such use of
|
||||
`--header' lead to duplicate headers in HTTP requests.
|
||||
|
||||
** The progress bar is now updated regularly even when the data does
|
||||
not arrive.
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
2003-11-29 Hrvoje Niksic <hniksic@xemacs.org>
|
||||
|
||||
* cookies.c (cookie_header): Only generate the contents of the
|
||||
header, not the leading "Cookie: " or the trailing "\r\n".
|
||||
|
||||
* http.c (gethttp): When adding headers specified with `--header',
|
||||
allow them to override the headers generated by Wget.
|
||||
|
||||
* init.c (cmd_spec_header): Made opt.user_headers a vector.
|
||||
|
||||
* http.c (request_new): New function. Returns a request structure
|
||||
which can be modified in various ways, most notably by adding HTTP
|
||||
headers to the request.
|
||||
(request_set_header): New function for adding the header to the
|
||||
request. If the header is already available, it gets replaced.
|
||||
(request_send): Construct and send the request.
|
||||
(gethttp): Use the request_* functions to generate the request.
|
||||
|
||||
2003-11-28 Hrvoje Niksic <hniksic@xemacs.org>
|
||||
|
||||
* http.c (gethttp): Don't include the Proxy-Authorization header
|
||||
|
@ -65,3 +65,16 @@ char *alloca ();
|
||||
#define _BSD_SOURCE
|
||||
|
||||
#endif /* NAMESPACE_TWEAKS */
|
||||
|
||||
/* Determine whether to use stdarg. Use it only if the compiler
|
||||
supports ANSI C and stdarg.h is present. We check for both because
|
||||
there are configurations where stdarg.h exists, but doesn't work.
|
||||
This check cannot be in sysdep.h because we use it to choose which
|
||||
system headers to include. */
|
||||
#ifndef WGET_USE_STDARG
|
||||
# ifdef __STDC__
|
||||
# ifdef HAVE_STDARG_H
|
||||
# define WGET_USE_STDARG
|
||||
# endif
|
||||
# endif
|
||||
#endif /* not WGET_USE_STDARG */
|
||||
|
@ -1192,16 +1192,12 @@ cookie_header (struct cookie_jar *jar, const char *host,
|
||||
}
|
||||
|
||||
/* Allocate output buffer:
|
||||
"Cookie: " -- 8
|
||||
name=value pairs -- result_size
|
||||
"; " separators -- (count - 1) * 2
|
||||
\r\n line ending -- 2
|
||||
\0 terminator -- 1 */
|
||||
result_size = 8 + result_size + (count - 1) * 2 + 2 + 1;
|
||||
result_size = result_size + (count - 1) * 2 + 1;
|
||||
result = xmalloc (result_size);
|
||||
pos = 0;
|
||||
strcpy (result, "Cookie: ");
|
||||
pos += 8;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
struct cookie *c = outgoing[i].cookie;
|
||||
@ -1219,8 +1215,6 @@ cookie_header (struct cookie_jar *jar, const char *host,
|
||||
result[pos++] = ' ';
|
||||
}
|
||||
}
|
||||
result[pos++] = '\r';
|
||||
result[pos++] = '\n';
|
||||
result[pos++] = '\0';
|
||||
assert (pos == result_size);
|
||||
return result;
|
||||
|
841
src/http.c
841
src/http.c
File diff suppressed because it is too large
Load Diff
31
src/init.c
31
src/init.c
@ -145,7 +145,7 @@ static struct {
|
||||
{ "forcehtml", &opt.force_html, cmd_boolean },
|
||||
{ "ftpproxy", &opt.ftp_proxy, cmd_string },
|
||||
{ "glob", &opt.ftp_glob, cmd_boolean },
|
||||
{ "header", NULL, cmd_spec_header },
|
||||
{ "header", &opt.user_headers, cmd_spec_header },
|
||||
{ "htmlextension", &opt.html_extension, cmd_boolean },
|
||||
{ "htmlify", NULL, cmd_spec_htmlify },
|
||||
{ "httpkeepalive", &opt.http_keep_alive, cmd_boolean },
|
||||
@ -1040,32 +1040,13 @@ cmd_spec_dirstruct (const char *com, const char *val, void *closure)
|
||||
static int
|
||||
cmd_spec_header (const char *com, const char *val, void *closure)
|
||||
{
|
||||
if (!*val)
|
||||
if (!check_user_specified_header (val))
|
||||
{
|
||||
/* Empty header means reset headers. */
|
||||
xfree_null (opt.user_header);
|
||||
opt.user_header = NULL;
|
||||
fprintf (stderr, _("%s: %s: Invalid header `%s'.\n"),
|
||||
exec_name, com, val);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!check_user_specified_header (val))
|
||||
{
|
||||
fprintf (stderr, _("%s: %s: Invalid header `%s'.\n"),
|
||||
exec_name, com, val);
|
||||
return 0;
|
||||
}
|
||||
i = opt.user_header ? strlen (opt.user_header) : 0;
|
||||
opt.user_header = (char *)xrealloc (opt.user_header, i + strlen (val)
|
||||
+ 2 + 1);
|
||||
strcpy (opt.user_header + i, val);
|
||||
i += strlen (val);
|
||||
opt.user_header[i++] = '\r';
|
||||
opt.user_header[i++] = '\n';
|
||||
opt.user_header[i] = '\0';
|
||||
}
|
||||
return 1;
|
||||
return cmd_vector (com, val, closure);
|
||||
}
|
||||
|
||||
static int
|
||||
|
13
src/log.c
13
src/log.c
@ -29,19 +29,6 @@ so, delete this exception statement from your version. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* This allows the architecture-specific .h files to specify the use
|
||||
of stdargs regardless of __STDC__. */
|
||||
#ifndef WGET_USE_STDARG
|
||||
/* Use stdarg only if the compiler supports ANSI C and stdarg.h is
|
||||
present. We check for both because there are configurations where
|
||||
stdarg.h exists, but doesn't work. */
|
||||
# ifdef __STDC__
|
||||
# ifdef HAVE_STDARG_H
|
||||
# define WGET_USE_STDARG
|
||||
# endif
|
||||
# endif
|
||||
#endif /* not WGET_USE_STDARG */
|
||||
|
||||
#include <stdio.h>
|
||||
#ifdef HAVE_STRING_H
|
||||
# include <string.h>
|
||||
|
@ -33,13 +33,6 @@ so, delete this exception statement from your version. */
|
||||
/* The log file to which Wget writes to after HUP. */
|
||||
#define DEFAULT_LOGFILE "wget-log"
|
||||
|
||||
/* Make gcc check for the format of logmsg() and debug_logmsg(). */
|
||||
#ifdef __GNUC__
|
||||
# define GCC_FORMAT_ATTR(a, b) __attribute__ ((format (printf, a, b)))
|
||||
#else /* not __GNUC__ */
|
||||
# define GCC_FORMAT_ATTR(a, b)
|
||||
#endif /* not __GNUC__ */
|
||||
|
||||
enum log_options { LOG_VERBOSE, LOG_NOTQUIET, LOG_NONVERBOSE, LOG_ALWAYS };
|
||||
|
||||
#ifdef HAVE_STDARG_H
|
||||
|
@ -96,7 +96,7 @@ struct options
|
||||
|
||||
char *http_user; /* HTTP user. */
|
||||
char *http_passwd; /* HTTP password. */
|
||||
char *user_header; /* User-defined header(s). */
|
||||
char **user_headers; /* User-defined header(s). */
|
||||
int http_keep_alive; /* whether we use keep-alive */
|
||||
|
||||
int use_proxy; /* Do we use proxy? */
|
||||
|
51
src/utils.c
51
src/utils.c
@ -61,6 +61,11 @@ so, delete this exception statement from your version. */
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
#include <assert.h>
|
||||
#ifdef WGET_USE_STDARG
|
||||
# include <stdarg.h>
|
||||
#else
|
||||
# include <varargs.h>
|
||||
#endif
|
||||
|
||||
/* For TIOCGWINSZ and friends: */
|
||||
#ifdef HAVE_SYS_IOCTL_H
|
||||
@ -176,6 +181,52 @@ sepstring (const char *s)
|
||||
return res;
|
||||
}
|
||||
|
||||
#ifdef WGET_USE_STDARG
|
||||
# define VA_START(args, arg1) va_start (args, arg1)
|
||||
#else
|
||||
# define VA_START(args, ignored) va_start (args)
|
||||
#endif
|
||||
|
||||
/* Like sprintf, but allocates a string of sufficient size with malloc
|
||||
and returns it. GNU libc has a similar function named asprintf,
|
||||
which requires the pointer to the string to be passed. */
|
||||
|
||||
char *
|
||||
aprintf (const char *fmt, ...)
|
||||
{
|
||||
/* This function is implemented using vsnprintf, which we provide
|
||||
for the systems that don't have it. Therefore, it should be 100%
|
||||
portable. */
|
||||
|
||||
int size = 32;
|
||||
char *str = xmalloc (size);
|
||||
|
||||
while (1)
|
||||
{
|
||||
int n;
|
||||
va_list args;
|
||||
|
||||
/* See log_vprintf_internal for explanation why it's OK to rely
|
||||
on the return value of vsnprintf. */
|
||||
|
||||
VA_START (args, fmt);
|
||||
n = vsnprintf (str, size, fmt, args);
|
||||
va_end (args);
|
||||
|
||||
/* If the printing worked, return the string. */
|
||||
if (n > -1 && n < size)
|
||||
return str;
|
||||
|
||||
/* Else try again with a larger buffer. */
|
||||
if (n > -1) /* C99 */
|
||||
size = n + 1; /* precisely what is needed */
|
||||
else
|
||||
size <<= 1; /* twice the old size */
|
||||
str = xrealloc (str, size);
|
||||
}
|
||||
return NULL; /* unreached */
|
||||
}
|
||||
|
||||
/* Return pointer to a static char[] buffer in which zero-terminated
|
||||
string-representation of TM (in form hh:mm:ss) is printed.
|
||||
|
||||
|
@ -68,6 +68,13 @@ char **sepstring PARAMS ((const char *));
|
||||
int frontcmp PARAMS ((const char *, const char *));
|
||||
void fork_to_background PARAMS ((void));
|
||||
|
||||
#ifdef HAVE_STDARG_H
|
||||
char *aprintf PARAMS ((const char *, ...))
|
||||
GCC_FORMAT_ATTR (1, 2);
|
||||
#else /* not HAVE_STDARG_H */
|
||||
char *aprintf ();
|
||||
#endif /* not HAVE_STDARG_H */
|
||||
|
||||
void touch PARAMS ((const char *, time_t));
|
||||
int remove_link PARAMS ((const char *));
|
||||
int file_exists_p PARAMS ((const char *));
|
||||
|
@ -101,6 +101,12 @@ so, delete this exception statement from your version. */
|
||||
# define DEBUGP(x) DO_NOTHING
|
||||
#endif /* not ENABLE_DEBUG */
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define GCC_FORMAT_ATTR(a, b) __attribute__ ((format (printf, a, b)))
|
||||
#else /* not __GNUC__ */
|
||||
# define GCC_FORMAT_ATTR(a, b)
|
||||
#endif /* not __GNUC__ */
|
||||
|
||||
/* Everything uses this, so include them here directly. */
|
||||
#include "xmalloc.h"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user