]> sjero.net Git - wget/commitdiff
[svn] Added user-contributed patches.
authorhniksic <devnull@localhost>
Thu, 2 Mar 2000 14:16:12 +0000 (06:16 -0800)
committerhniksic <devnull@localhost>
Thu, 2 Mar 2000 14:16:12 +0000 (06:16 -0800)
src/ChangeLog
src/html.c
src/http.c
src/netrc.c
src/url.c
src/url.h

index 72eba003c447ce5bf0de977558f62702cd764e8b..961e32df6416a57f4491bbc8c4fea0994d3c921c 100644 (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
index c1ca4e77bb4a7986071e2a0bb096cab5afd07ac2..a27edac157bb96d9c1b36efa07a6a0dc1783e234 100644 (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" },
index b25e01460719aa39ae02a43a4956b624e65109fc..8373133b23617f036504afa50b0ca3305de74fe0 100644 (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 : "", 
index 82de2bc87747d28f71473d2eb10489d81620ddf3..de9f69ed8e3a4ae5bcece680ff5cd436f981e0bb 100644 (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)
index 33aa37b82bfa07099931d041cd5ec30244f7477d..b00484e4feaa9406ded4feba51b7b8c4be065542 100644 (file)
--- a/src/url.c
+++ b/src/url.c
@@ -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;
index 87044cdd497c9309d54bb15a5df376cd4936e57c..45e8b76ee8fab6b419a37560c99f8c249acf9669 100644 (file)
--- a/src/url.h
+++ b/src/url.h
@@ -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