[svn] Added user-contributed patches.

This commit is contained in:
hniksic 2000-03-02 06:16:12 -08:00
parent 18959ba4ab
commit 2b2fd2924a
6 changed files with 78 additions and 11 deletions

View File

@ -1,3 +1,14 @@
1999-09-17 Dan Berger <dberger@ix.netcom.com>
* http.c (gethttp): Send it.
* url.c (parseurl): Detect query string in HTTP URL-s.
(str_url): Print it.
2000-03-02 HIROSE Masaaki <hirose31@t3.rim.or.jp>
* html.c (html_allow): Add <link href=...> and <script src=...>.
1999-05-02 andrew deryabin <djsf@softhome.net>
* http.c (gethttp): Specify port in `Host' header only if it's

View File

@ -77,6 +77,8 @@ htmlfindurl (const char *buf, int bufsize, int *size, int init)
follow -- feel free to edit to suit your needs: */
static struct tag_attr html_allow[] = {
{ "a", "href" },
{ "link", "href" },
{ "script", "src" },
{ "img", "src" },
{ "img", "href" },
{ "body", "background" },

View File

@ -303,7 +303,7 @@ static time_t http_atotm PARAMS ((char *));
static uerr_t
gethttp (struct urlinfo *u, struct http_stat *hs, int *dt)
{
char *request, *type, *command, *path;
char *request, *type, *command, *path, *qstring;
char *user, *passwd;
char *pragma_h, *referer, *useragent, *range, *wwwauth, *remhost;
char *authenticate_h;
@ -384,6 +384,9 @@ gethttp (struct urlinfo *u, struct http_stat *hs, int *dt)
path = u->proxy->url;
else
path = u->path;
qstring = u->qstring;
command = (*dt & HEAD_ONLY) ? "HEAD" : "GET";
referer = NULL;
if (ou->referer)
@ -467,6 +470,7 @@ gethttp (struct urlinfo *u, struct http_stat *hs, int *dt)
/* Allocate the memory for the request. */
request = (char *)alloca (strlen (command) + strlen (path)
+ (qstring ? strlen (qstring) : 0)
+ strlen (useragent)
+ strlen (remhost) + host_port_len
+ strlen (HTTP_ACCEPT)
@ -479,12 +483,12 @@ gethttp (struct urlinfo *u, struct http_stat *hs, int *dt)
+ 64);
/* Construct the request. */
sprintf (request, "\
%s %s HTTP/1.0\r\n\
%s %s%s HTTP/1.0\r\n\
User-Agent: %s\r\n\
Host: %s%s\r\n\
Accept: %s\r\n\
%s%s%s%s%s%s\r\n",
command, path, useragent, remhost, host_port ? host_port : "",
command, path, qstring, useragent, remhost, host_port ? host_port : "",
HTTP_ACCEPT, referer ? referer : "",
wwwauth ? wwwauth : "",
proxyauth ? proxyauth : "",

View File

@ -226,6 +226,16 @@ maybe_add_to_list (acc_t **newentry, acc_t **list)
return;
}
/* Helper function for the parser, shifts contents of
null-terminated string once character to the left.
Used in processing \ and " constructs in the netrc file */
static void
shift_left(char *string){
char *p;
for (p=string; *p; ++p)
*p = *(p+1);
}
/* Parse a .netrc file (as described in the ftp(1) manual page). */
static acc_t *
@ -234,7 +244,7 @@ parse_netrc (const char *path)
FILE *fp;
char *line, *p, *tok, *premature_token;
acc_t *current, *retval;
int ln;
int ln, quote;
/* The latest token we've seen in the file. */
enum
@ -263,6 +273,7 @@ parse_netrc (const char *path)
/* Parse the line. */
p = line;
quote = 0;
/* If the line is empty, then end any macro definition. */
if (last_token == tok_macdef && !*p)
@ -280,11 +291,25 @@ parse_netrc (const char *path)
if (*p == '#')
break;
/* If the token starts with quotation mark, note this fact,
and squash the quotation character */
if (*p == '"'){
quote = 1;
shift_left (p);
}
tok = p;
/* Find the end of the token. */
while (*p && !ISSPACE (*p))
/* Find the end of the token, handling quotes and escapes. */
while (*p && (quote ? *p != '"' : !ISSPACE (*p))){
if (*p == '\\')
shift_left (p);
p ++;
}
/* if field was quoted, squash the trailing quotation mark */
if (quote)
shift_left(p);
/* Null-terminate the token, if it isn't already. */
if (*p)

View File

@ -458,8 +458,23 @@ parseurl (const char *url, struct urlinfo *u, int strict)
if (type == URLHTTP)
while (url[i] && url[i] == '/')
++i;
u->path = (char *)xmalloc (strlen (url + i) + 8);
strcpy (u->path, url + i);
/* dfb: break "path" into "path" and "qstring" if the URL is HTTP
if it's not an HTTP url, set l to the last character, so the
xmalloc and strncpy work as desired */
if (type == URLHTTP) {
for (l = i; url[l] && url[l] != '?'; l++);
if (l != strlen(url)) {
/* copy the query string, including the '?' into u->qstring */
u->qstring = (char *)xmalloc (strlen (url + l) + 8);
strcpy (u->qstring, url + l);
}
} else {
l = strlen(url);
}
u->path = strdupdelim (url + i, url + l);
if (type == URLFTP)
{
u->ftp_type = process_ftp_type (u->path);
@ -480,6 +495,8 @@ parseurl (const char *url, struct urlinfo *u, int strict)
/* Parse the directory. */
parse_dir (u->path, &u->dir, &u->file);
DEBUGP (("dir %s -> file %s -> ", u->dir, u->file));
if (type == URLHTTP && u->qstring)
DEBUGP (("query-string %s -> ", u->qstring));
/* Simplify the directory. */
path_simplify (u->dir);
/* Remove the leading `/' in HTTP. */
@ -626,7 +643,7 @@ char *
str_url (const struct urlinfo *u, int hide)
{
char *res, *host, *user, *passwd, *proto_name, *dir, *file;
int i, l, ln, lu, lh, lp, lf, ld;
int i, l, ln, lu, lh, lp, lf, ld, lq;
/* Look for the protocol name. */
for (i = 0; i < ARRAY_SIZE (sup_protos); i++)
@ -667,7 +684,8 @@ str_url (const struct urlinfo *u, int hide)
lh = strlen (host);
ld = strlen (dir);
lf = strlen (file);
res = (char *)xmalloc (ln + lu + lp + lh + ld + lf + 20); /* safe sex */
lq = (u->proto == URLHTTP && u->qstring) ? strlen (u->qstring) : 0;
res = (char *)xmalloc (ln + lu + lp + lh + ld + lf + lq + 20); /* safe sex */
/* sprintf (res, "%s%s%s%s%s%s:%d/%s%s%s", proto_name,
(user ? user : ""), (passwd ? ":" : ""),
(passwd ? passwd : ""), (user ? "@" : ""),
@ -698,9 +716,15 @@ str_url (const struct urlinfo *u, int hide)
if (*dir)
res[l++] = '/';
strcpy (res + l, file);
l += lf;
free (host);
free (dir);
free (file);
if (u->qstring)
{
/* copy in the raw query string to avoid munging arguments */
memcpy (res + l, u->qstring, lq);
}
FREE_MAYBE (user);
FREE_MAYBE (passwd);
return res;

View File

@ -32,7 +32,8 @@ struct urlinfo
char *host; /* Extracted hostname */
unsigned short port;
char ftp_type;
char *path, *dir, *file; /* Path, as well as dir and file
char *path, *dir, *file, *qstring;
/* Path, dir, file, and query string
(properly decoded) */
char *user, *passwd; /* Username and password */
struct urlinfo *proxy; /* The exact string to pass to proxy