]> sjero.net Git - wget/blobdiff - src/http.c
[svn] Fix K&R incompatibilities reported by `gcc -Wtraditional'.
[wget] / src / http.c
index 6a5cf1f9f5d3261995e84e1cc31eae9eab6d27a2..97a773a1e2d720abe45ac5041c3245e0477d49a7 100644 (file)
@@ -64,7 +64,7 @@ extern int errno;
 #include "connect.h"
 #include "netrc.h"
 #ifdef HAVE_SSL
-# include "gen_sslfunc.h"
+# include "ssl.h"
 #endif
 #ifdef ENABLE_NTLM
 # include "http-ntlm.h"
@@ -368,7 +368,7 @@ request_send (const struct request *req, int fd)
 
   /* Send the request to the server. */
 
-  write_error = fd_write (fd, request_string, size - 1, -1);
+  write_error = fd_write (fd, request_string, size - 1, -1.0);
   if (write_error < 0)
     logprintf (LOG_VERBOSE, _("Failed writing HTTP request: %s.\n"),
               strerror (errno));
@@ -412,7 +412,7 @@ post_file (int sock, const char *file_name, wgint promised_size)
       if (length == 0)
        break;
       towrite = MIN (promised_size - written, length);
-      write_error = fd_write (sock, chunk, towrite, -1);
+      write_error = fd_write (sock, chunk, towrite, -1.0);
       if (write_error < 0)
        {
          fclose (fp);
@@ -840,7 +840,7 @@ skip_short_body (int fd, wgint contlen)
 
   while (contlen > 0)
     {
-      int ret = fd_read (fd, dlbuf, MIN (contlen, SKIP_SIZE), -1);
+      int ret = fd_read (fd, dlbuf, MIN (contlen, SKIP_SIZE), -1.0);
       if (ret <= 0)
        {
          /* Don't normally report the error since this is an
@@ -1113,6 +1113,14 @@ time_t http_atotm PARAMS ((const char *));
    && (ISSPACE (line[sizeof (string_constant) - 1])                    \
        || !line[sizeof (string_constant) - 1]))
 
+#define SET_USER_AGENT(req)                                            \
+  if (opt.useragent)                                                   \
+    request_set_header (req, "User-Agent", opt.useragent, rel_none);   \
+  else                                                                 \
+    request_set_header (req, "User-Agent",                             \
+                       aprintf ("Wget/%s", version_string), rel_value);
+
+
 /* Retrieve a document through HTTP protocol.  It recognizes status
    code, and correctly handles redirections.  It closes the network
    socket.  If it receives an error from the functions below it, it
@@ -1179,29 +1187,12 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
     {
       /* Initialize the SSL context.  After this has once been done,
         it becomes a no-op.  */
-      switch (ssl_init ())
+      if (!ssl_init ())
        {
-       case SSLERRCTXCREATE:
-         /* this is fatal */
-         logprintf (LOG_NOTQUIET, _("Failed to set up an SSL context\n"));
-         return SSLERRCTXCREATE;
-       case SSLERRCERTFILE:
-         /* try without certfile */
-         logprintf (LOG_NOTQUIET,
-                    _("Failed to load certificates from %s\n"),
-                    opt.sslcertfile);
-         logprintf (LOG_NOTQUIET,
-                    _("Trying without the specified certificate\n"));
-         break;
-       case SSLERRCERTKEY:
+         scheme_disable (SCHEME_HTTPS);
          logprintf (LOG_NOTQUIET,
-                    _("Failed to get certificate key from %s\n"),
-                    opt.sslcertkey);
-         logprintf (LOG_NOTQUIET,
-                    _("Trying without the specified certificate\n"));
-         break;
-       default:
-         break;
+                    _("Disabling SSL due to encountered errors.\n"));
+         return SSLINITFAILED;
        }
     }
 #endif /* HAVE_SSL */
@@ -1245,19 +1236,15 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
                        aprintf ("bytes=%s-",
                                 number_to_static_string (hs->restval)),
                        rel_value);
-  if (opt.useragent)
-    request_set_header (req, "User-Agent", opt.useragent, rel_none);
-  else
-    request_set_header (req, "User-Agent",
-                       aprintf ("Wget/%s", version_string), rel_value);
+  SET_USER_AGENT (req);
   request_set_header (req, "Accept", "*/*", rel_none);
 
   /* Find the username and password for authentication. */
   user = u->user;
   passwd = u->passwd;
   search_netrc (u->host, (const char **)&user, (const char **)&passwd, 0);
-  user = user ? user : opt.http_user;
-  passwd = passwd ? passwd : opt.http_passwd;
+  user = user ? user : (opt.http_user ? opt.http_user : opt.user);
+  passwd = passwd ? passwd : (opt.http_passwd ? opt.http_passwd : opt.passwd);
 
   if (user && passwd)
     {
@@ -1455,6 +1442,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
          struct request *connreq = request_new ();
          request_set_method (connreq, "CONNECT",
                              aprintf ("%s:%d", u->host, u->port));
+         SET_USER_AGENT (connreq);
          if (proxyauth)
            {
              request_set_header (connreq, "Proxy-Authorization",
@@ -1464,6 +1452,10 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
                 the regular request below.  */
              proxyauth = NULL;
            }
+         /* Examples in rfc2817 use the Host header in CONNECT
+            requests.  I don't see how that gains anything, given
+            that the contents of Host would be exactly the same as
+            the contents of CONNECT.  */
 
          write_error = request_send (connreq, sock);
          request_free (connreq);
@@ -1531,7 +1523,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
       if (opt.post_data)
        {
          DEBUGP (("[POST data: %s]\n", opt.post_data));
-         write_error = fd_write (sock, opt.post_data, post_data_size, -1);
+         write_error = fd_write (sock, opt.post_data, post_data_size, -1.0);
        }
       else if (opt.post_file_name && post_data_size != 0)
        write_error = post_file (sock, opt.post_file_name, post_data_size);
@@ -1622,10 +1614,13 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
   if (statcode == HTTP_STATUS_UNAUTHORIZED)
     {
       /* Authorization is required.  */
-      if (skip_short_body (sock, contlen))
-       CLOSE_FINISH (sock);
-      else
-       CLOSE_INVALIDATE (sock);
+      if (keep_alive)
+       {
+         if (skip_short_body (sock, contlen))
+           CLOSE_FINISH (sock);
+         else
+           CLOSE_INVALIDATE (sock);
+       }
       pconn.authorized = 0;
       if (auth_finished || !(user && passwd))
        {
@@ -1714,6 +1709,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
 
   /* Handle (possibly multiple instances of) the Set-Cookie header. */
   {
+    char *pth = NULL;
     int scpos;
     const char *scbeg, *scend;
     /* The jar should have been created by now. */
@@ -1723,10 +1719,16 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
                                      &scbeg, &scend)) != -1;
         ++scpos)
       {
-       char *set_cookie = strdupdelim (scbeg, scend);
-       cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port, u->path,
+       char *set_cookie; BOUNDED_TO_ALLOCA (scbeg, scend, set_cookie);
+       if (pth == NULL)
+         {
+           /* u->path doesn't begin with /, which cookies.c expects. */
+           pth = (char *) alloca (1 + strlen (u->path) + 1);
+           pth[0] = '/';
+           strcpy (pth + 1, u->path);
+         }
+       cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port, pth,
                                  set_cookie);
-       xfree (set_cookie);
       }
   }
 
@@ -2211,14 +2213,12 @@ File `%s' already there, will not retrieve.\n"), *hstat.local_file);
                locf = opt.output_document;
            }
          continue;
-         break;
        case HOSTERR: case CONIMPOSSIBLE: case PROXERR: case AUTHFAILED: 
-       case SSLERRCTXCREATE: case CONTNOTSUPPORTED:
+       case SSLINITFAILED: case CONTNOTSUPPORTED:
          /* Fatal errors just return from the function.  */
          free_hstat (&hstat);
          xfree_null (dummy);
          return err;
-         break;
        case FWRITEERR: case FOPENERR:
          /* Another fatal error.  */
          logputs (LOG_VERBOSE, "\n");
@@ -2227,7 +2227,6 @@ File `%s' already there, will not retrieve.\n"), *hstat.local_file);
          free_hstat (&hstat);
          xfree_null (dummy);
          return err;
-         break;
        case CONSSLERR:
          /* Another fatal error.  */
          logputs (LOG_VERBOSE, "\n");
@@ -2235,7 +2234,6 @@ File `%s' already there, will not retrieve.\n"), *hstat.local_file);
          free_hstat (&hstat);
          xfree_null (dummy);
          return err;
-         break;
        case NEWLOCATION:
          /* Return the new location to the caller.  */
          if (!hstat.newloc)
@@ -2250,13 +2248,11 @@ File `%s' already there, will not retrieve.\n"), *hstat.local_file);
          free_hstat (&hstat);
          xfree_null (dummy);
          return NEWLOCATION;
-         break;
        case RETRUNNEEDED:
          /* The file was already fully retrieved. */
          free_hstat (&hstat);
          xfree_null (dummy);
          return RETROK;
-         break;
        case RETRFINISHED:
          /* Deal with you later.  */
          break;
@@ -2499,7 +2495,6 @@ The sizes do not match (local %s) -- retrieving.\n"),
            }
        }
       /* not reached */
-      break;
     }
   while (!opt.ntry || (count < opt.ntry));
   return TRYLIMEXC;