+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
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" },
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;
path = u->proxy->url;
else
path = u->path;
+
+ qstring = u->qstring;
+
command = (*dt & HEAD_ONLY) ? "HEAD" : "GET";
referer = NULL;
if (ou->referer)
/* 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)
+ 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 : "",
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 *
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
/* Parse the line. */
p = line;
+ quote = 0;
/* If the line is empty, then end any macro definition. */
if (last_token == tok_macdef && !*p)
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)
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);
/* 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. */
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++)
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 ? "@" : ""),
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;
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