]> granicus.if.org Git - curl/commitdiff
Cleaned up hostname/name/gname and path/ppath confusion. Removed the fixed-
authorDaniel Stenberg <daniel@haxx.se>
Tue, 20 Apr 2004 07:53:24 +0000 (07:53 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 20 Apr 2004 07:53:24 +0000 (07:53 +0000)
length limit of the hostname part of the URL.

CHANGES
RELEASE-NOTES
lib/ftp.c
lib/http.c
lib/ssluse.c
lib/transfer.c
lib/url.c
lib/urldata.h

diff --git a/CHANGES b/CHANGES
index aba9ddfd7e5e03a26b77920d42b1e63ae66e1c0d..c97faea69cecd96cd5e6f8ad09f661394dd38285 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,16 @@
 
                                   Changelog
 
+Daniel (19 April 2004)
+- No more 512 byte limit for host name (inclusing name + password) in libcurl.
+  An added bonus is that we use less memory for the typical (shorter URL)
+  case.
+
+- Cleaned up the sources to better use the terms 'hostname' and 'path'
+  internally when referring to that data. The buffers used for keep that info
+  is called 'namebuffer' and 'pathbuffer'. Much easier to read and understand
+  than the previous mess.
+
 Daniel (15 April 2004)
 - Modified runtests.pl again to remove all log files in the log/ dir between
   each test, and then made -p display all non-zero byte files in the log dir.
@@ -19,7 +29,8 @@ Daniel (15 April 2004)
   Previously we had a fixed array for 100 levels, now we save space in each
   handle by allocating only for a few level by default and then enlarging that
   in case of need (with no maximum depth). Adjusted test case 142 to verify
-  that 150 dir levels work fine.
+  that 150 dir levels work fine.  An added bonus is that we use less memory
+  for the typical (not very deep) case.
 
 Daniel (14 April 2004)
 - Asking for CURL_IPRESOLVE_V6 when ipv6 addresses can't be resolved will
index e8914b2f749f20a15c1793690316f01a9e641ce4..5640135ff4fd21306721111c27ec488b04dd75d4 100644 (file)
@@ -7,7 +7,8 @@ Curl and libcurl 7.11.2. A bugfix release.
 
 This release includes the following changes:
 
- o removed maximum dir depth limit in the FTP code
+ o removed maximum user+password+hostname size limit
+ o removed maximum dir depth limit for FTP
  o the ares build now requires c-ares 1.2.0 or later
  o --tcp-nodelay and CURLOPT_TCP_NODELAY were added
  o curl/curlver.h contains the libcurl version info now
@@ -53,6 +54,7 @@ Other curl-related news since the previous public release:
    http://q-lang.sourceforge.net/
  o New German web mirror: http://curl.netmirror.org/
  o c-ares 1.2.0 was released: http://daniel.haxx.se/projects/c-ares/
+ o New US web mirror: http://curl.signal42.com/
 
 This release would not have looked like this without help, code, reports and
 advice from friends like these:
index cce1d9e9eb25fc7aa0b4af7bcccec349b138f4de..088cfaa5e75f6f38dc9896cb5efda23865aa52ef 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1611,7 +1611,7 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
           newport = num;
 
           /* we should use the same host we already are connected to */
-          newhostp = conn->name;
+          newhostp = conn->hostname;
         }
       }                      
       else
@@ -2320,8 +2320,8 @@ CURLcode Curl_ftp(struct connectdata *conn)
   struct FTP *ftp;
 
   char *slash_pos;  /* position of the first '/' char in curpos */
-  char *cur_pos=conn->ppath; /* current position in ppath. point at the begin
-                                of next path component */
+  char *cur_pos=conn->path; /* current position in ppath. point at the begin
+                               of next path component */
 
   /* the ftp struct is already inited in ftp_connect() */
   ftp = conn->proto.ftp;
@@ -2343,7 +2343,7 @@ CURLcode Curl_ftp(struct connectdata *conn)
   /* parse the URL path into separate path components */
   while((slash_pos=strchr(cur_pos, '/'))) {
     /* 1 or 0 to indicate absolute directory */
-    bool absolute_dir = (cur_pos - conn->ppath > 0) && (ftp->dirdepth == 0);
+    bool absolute_dir = (cur_pos - conn->path > 0) && (ftp->dirdepth == 0);
 
     /* seek out the next path component */
     if (slash_pos-cur_pos) {
index 3a1f89025ffa3bc3dcfa8437594160c3ec7ed6a4..66b5ce228e0401ded1fcb3bfe08aae777cd8bd3e 100644 (file)
@@ -1150,8 +1150,8 @@ CURLcode Curl_http(struct connectdata *conn)
   CURLcode result=CURLE_OK;
   struct HTTP *http;
   struct Cookie *co=NULL; /* no cookies from start */
-  char *ppath = conn->ppath; /* three previous function arguments */
-  char *host = conn->name;
+  char *ppath = conn->path;
+  char *host = conn->hostname;
   const char *te = ""; /* tranfer-encoding */
   char *ptr;
   char *request;
index d78d78f6ddc899886c37a40b2cd83798caecfbd7..6a81f24f7c78d89b945b043d6b1335b8d69ba36f 100644 (file)
@@ -544,7 +544,7 @@ static int Get_SSL_Session(struct connectdata *conn,
     if(!check->sessionid)
       /* not session ID means blank entry */
       continue;
-    if(curl_strequal(conn->name, check->name) &&
+    if(curl_strequal(conn->hostname, check->name) &&
        (conn->remote_port == check->remote_port) &&
        Curl_ssl_config_matches(&conn->ssl_config, &check->ssl_config)) {
       /* yes, we have a session ID! */
@@ -662,7 +662,7 @@ static int Store_SSL_Session(struct connectdata *conn,
   /* now init the session struct wisely */
   store->sessionid = ssl_sessionid;
   store->age = data->state.sessionage;    /* set current age */
-  store->name = strdup(conn->name);       /* clone host name */
+  store->name = strdup(conn->hostname);   /* clone host name */
   store->remote_port = conn->remote_port; /* port number */
 
   Curl_clone_ssl_config(&conn->ssl_config, &store->ssl_config);
index 977cb72d42778d1a8c096f2688e8171b6178380c..cb24dd30fdb900be2b6a23e4d57344005685f94d 100644 (file)
@@ -802,8 +802,8 @@ CURLcode Curl_readwrite(struct connectdata *conn,
                               /* If there is a custom-set Host: name, use it
                                  here, or else use real peer host name. */
                               conn->allocptr.cookiehost?
-                              conn->allocptr.cookiehost:conn->name,
-                              conn->ppath);
+                              conn->allocptr.cookiehost:conn->hostname,
+                              conn->path);
               Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
             }
             else if(checkprefix("Last-Modified:", k->p) &&
index de31fd10713e86f10d85040a77186fcff538f857..078b74c47d92814ccaf818d81fca16191f9fedd4 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -1360,7 +1360,8 @@ CURLcode Curl_disconnect(struct connectdata *conn)
 
   Curl_safefree(conn->proto.generic);
   Curl_safefree(conn->newurl);
-  Curl_safefree(conn->path);  /* the URL path part */
+  Curl_safefree(conn->pathbuffer); /* the URL path buffer */
+  Curl_safefree(conn->namebuffer); /* the URL host name buffer */
   Curl_SSL_Close(conn);
 
   /* close possibly still open sockets */
@@ -1460,7 +1461,7 @@ ConnectionExists(struct SessionHandle *data,
         continue;
 
       if(strequal(needle->protostr, check->protostr) &&
-         strequal(needle->name, check->name) &&
+         strequal(needle->hostname, check->hostname) &&
          (needle->remote_port == check->remote_port) ) {
         if(needle->protocol & PROT_SSL) {
           /* This is SSL, verify that we're using the same
@@ -2096,9 +2097,15 @@ static CURLcode CreateConnection(struct SessionHandle *data,
   if(urllen < LEAST_PATH_ALLOC)
     urllen=LEAST_PATH_ALLOC;
 
-  conn->path=(char *)malloc(urllen);
-  if(NULL == conn->path)
+  conn->pathbuffer=(char *)malloc(urllen);
+  if(NULL == conn->pathbuffer)
     return CURLE_OUT_OF_MEMORY; /* really bad error */
+  conn->path = conn->pathbuffer;
+
+  conn->namebuffer=(char *)malloc(urllen);
+  if(NULL == conn->namebuffer)
+    return CURLE_OUT_OF_MEMORY;
+  conn->hostname = conn->namebuffer;
 
   /*************************************************************
    * Parse the URL.
@@ -2160,7 +2167,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
   }
   else {
     /* Set default host and default path */
-    strcpy(conn->gname, "curl.haxx.se");
+    strcpy(conn->namebuffer, "curl.haxx.se");
     strcpy(conn->path, "/");
     /* We need to search for '/' OR '?' - whichever comes first after host
      * name but before the path. We need to change that to handle things like
@@ -2168,15 +2175,16 @@ static CURLcode CreateConnection(struct SessionHandle *data,
      * that missing slash at the beginning of the path.
      */
     if (2 > sscanf(data->change.url,
-                   "%64[^\n:]://%512[^\n/?]%[^\n]",
-                   conn->protostr, conn->gname, conn->path)) {
+                   "%64[^\n:]://%[^\n/?]%[^\n]",
+                   conn->protostr,
+                   conn->namebuffer, conn->path)) {
 
       /*
        * The URL was badly formatted, let's try the browser-style _without_
        * protocol specified like 'http://'.
        */
-      if((1 > sscanf(data->change.url, "%512[^\n/?]%[^\n]",
-                     conn->gname, conn->path)) ) {
+      if((1 > sscanf(data->change.url, "%[^\n/?]%[^\n]",
+                     conn->namebuffer, conn->path)) ) {
         /*
          * We couldn't even get this format.
          */
@@ -2192,21 +2200,21 @@ static CURLcode CreateConnection(struct SessionHandle *data,
       /* Note: if you add a new protocol, please update the list in
        * lib/version.c too! */
 
-      if(checkprefix("GOPHER", conn->gname))
+      if(checkprefix("GOPHER", conn->namebuffer))
         strcpy(conn->protostr, "gopher");
 #ifdef USE_SSLEAY
-      else if(checkprefix("HTTPS", conn->gname))
+      else if(checkprefix("HTTPS", conn->namebuffer))
         strcpy(conn->protostr, "https");
-      else if(checkprefix("FTPS", conn->gname))
+      else if(checkprefix("FTPS", conn->namebuffer))
         strcpy(conn->protostr, "ftps");
 #endif /* USE_SSLEAY */
-      else if(checkprefix("FTP", conn->gname))
+      else if(checkprefix("FTP", conn->namebuffer))
         strcpy(conn->protostr, "ftp");
-      else if(checkprefix("TELNET", conn->gname))
+      else if(checkprefix("TELNET", conn->namebuffer))
         strcpy(conn->protostr, "telnet");
-      else if (checkprefix("DICT", conn->gname))
+      else if (checkprefix("DICT", conn->namebuffer))
         strcpy(conn->protostr, "DICT");
-      else if (checkprefix("LDAP", conn->gname))
+      else if (checkprefix("LDAP", conn->namebuffer))
         strcpy(conn->protostr, "LDAP");
       else {
         strcpy(conn->protostr, "http");
@@ -2231,7 +2239,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
   /*
    * So if the URL was A://B/C,
    *   conn->protostr is A
-   *   conn->gname is B
+   *   conn->namebuffer is B
    *   conn->path is /C
    */
 
@@ -2256,13 +2264,6 @@ static CURLcode CreateConnection(struct SessionHandle *data,
       return CURLE_OUT_OF_MEMORY;
   }
 
-  /*************************************************************
-   * Set a few convenience pointers
-   *************************************************************/
-  conn->name = conn->gname;
-  conn->ppath = conn->path;
-  conn->hostname = conn->name;
-
   /*************************************************************
    * Detect what (if any) proxy to use
    *************************************************************/
@@ -2301,15 +2302,15 @@ static CURLcode CreateConnection(struct SessionHandle *data,
       nope=no_proxy?strtok_r(no_proxy, ", ", &no_proxy_tok_buf):NULL;
       while(nope) {
         unsigned int namelen;
-        char *endptr = strchr(conn->name, ':');
+        char *endptr = strchr(conn->hostname, ':');
         if(endptr)
-          namelen=endptr-conn->name;
+          namelen=endptr-conn->hostname;
         else
-          namelen=strlen(conn->name);
+          namelen=strlen(conn->hostname);
 
         if(strlen(nope) <= namelen) {
           char *checkn=
-            conn->name + namelen - strlen(nope);
+            conn->hostname + namelen - strlen(nope);
           if(checkprefix(nope, checkn)) {
             /* no proxy for this host! */
             break;
@@ -2501,10 +2502,10 @@ static CURLcode CreateConnection(struct SessionHandle *data,
     conn->remote_port = PORT_GOPHER;
     /* Skip /<item-type>/ in path if present */
     if (isdigit((int)conn->path[1])) {
-      conn->ppath = strchr(&conn->path[1], '/');
-      if (conn->ppath == NULL)
-       conn->ppath = conn->path;
-      }
+      conn->path = strchr(&conn->path[1], '/');
+      if (conn->path == NULL)
+       conn->path = conn->pathbuffer;
+    }
     conn->protocol |= PROT_GOPHER;
     conn->curl_do = Curl_http;
     conn->curl_do_more = NULL;
@@ -2566,13 +2567,13 @@ static CURLcode CreateConnection(struct SessionHandle *data,
       conn->curl_disconnect = Curl_ftp_disconnect;
     }
 
-    conn->ppath++; /* don't include the initial slash */
+    conn->path++; /* don't include the initial slash */
 
     /* FTP URLs support an extension like ";type=<typecode>" that
      * we'll try to get now! */
-    type=strstr(conn->ppath, ";type=");
+    type=strstr(conn->path, ";type=");
     if(!type) {
-      type=strstr(conn->gname, ";type=");
+      type=strstr(conn->namebuffer, ";type=");
     }
     if(type) {
       char command;
@@ -2681,24 +2682,23 @@ static CURLcode CreateConnection(struct SessionHandle *data,
    * To be able to detect port number flawlessly, we must not confuse them
    * IPv6-specified addresses in the [0::1] style. (RFC2732)
    *
-   * The conn->name is currently [user:passwd@]host[:port] where host could
-   * be a hostname, IPv4 address or IPv6 address.
+   * The conn->hostname is currently [user:passwd@]host[:port] where host
+   * could be a hostname, IPv4 address or IPv6 address.
    *************************************************************/
-  if((1 == sscanf(conn->name, "[%*39[0-9a-fA-F:.]%c", &endbracket)) &&
+  if((1 == sscanf(conn->hostname, "[%*39[0-9a-fA-F:.]%c", &endbracket)) &&
      (']' == endbracket)) {
     /* this is a RFC2732-style specified IP-address */
     conn->bits.ipv6_ip = TRUE;
 
-    conn->name++; /* pass the starting bracket */
-    conn->hostname++;
-    tmp = strchr(conn->name, ']');
+    conn->hostname++; /* pass the starting bracket */
+    tmp = strchr(conn->hostname, ']');
     *tmp = 0; /* zero terminate */
     tmp++; /* pass the ending bracket */
     if(':' != *tmp)
       tmp = NULL; /* no port number available */
   }
   else
-    tmp = strrchr(conn->name, ':');
+    tmp = strrchr(conn->hostname, ':');
 
   if (tmp) {
     char *rest;
@@ -2805,12 +2805,12 @@ static CURLcode CreateConnection(struct SessionHandle *data,
     /* This is a FTP or HTTP URL, we will now try to extract the possible
      * user+password pair in a string like:
      * ftp://user:password@ftp.my.site:8021/README */
-    char *ptr=strchr(conn->name, '@');
-    char *userpass = conn->name;
+    char *ptr=strchr(conn->hostname, '@');
+    char *userpass = conn->hostname;
     if(ptr != NULL) {
       /* there's a user+password given here, to the left of the @ */
 
-      conn->name = conn->hostname = ++ptr;
+      conn->hostname = ++ptr;
 
       /* So the hostname is sane.  Only bother interpreting the
        * results if we could care.  It could still be wasted
@@ -2924,8 +2924,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
      * existing one.
      */
     struct connectdata *old_conn = conn;
-    char *path = old_conn->path; /* setup the current path pointer properly */
-    char *ppath = old_conn->ppath; /* this is the modified path pointer */
+
     if(old_conn->proxyhost)
       free(old_conn->proxyhost);
 
@@ -2943,20 +2942,13 @@ static CURLcode CreateConnection(struct SessionHandle *data,
     /* get the newly set value, not the old one */
     conn->bits.no_body = old_conn->bits.no_body;
 
-    /* If we speak over a proxy, we need to copy the host name too, as it
-       might be another remote host even when re-using a connection */
-    strcpy(conn->gname, old_conn->gname); /* safe strcpy() */
-
-    /* we need these pointers if we speak over a proxy */
-    conn->hostname = conn->gname;
-    conn->name = &conn->gname[old_conn->name - old_conn->gname];
-
-    free(conn->path);    /* free the previously allocated path pointer */
+    free(conn->namebuffer); /* free the newly allocated name buffer */
+    conn->namebuffer = old_conn->namebuffer; /* use the old one */
+    conn->hostname = old_conn->hostname;
 
-    /* 'path' points to the allocated data, 'ppath' may have been advanced
-       to point somewhere within the 'path' area. */
-    conn->path = path;
-    conn->ppath = ppath;
+    free(conn->pathbuffer); /* free the newly allocated path pointer */
+    conn->pathbuffer = old_conn->pathbuffer; /* use the old one */
+    conn->path = old_conn->path;
 
     /* re-use init */
     conn->bits.reuse = TRUE; /* yes, we're re-using here */
@@ -3093,12 +3085,12 @@ static CURLcode CreateConnection(struct SessionHandle *data,
     conn->port =  conn->remote_port; /* it is the same port */
 
     /* Resolve target host right on */
-    rc = Curl_resolv(conn, conn->name, conn->port, &hostaddr);
+    rc = Curl_resolv(conn, conn->hostname, conn->port, &hostaddr);
     if(rc == 1)
       *async = TRUE;
 
     else if(!hostaddr) {
-      failf(data, "Couldn't resolve host '%s'", conn->name);
+      failf(data, "Couldn't resolve host '%s'", conn->hostname);
       result =  CURLE_COULDNT_RESOLVE_HOST;
       /* don't return yet, we need to clean up the timeout first */
     }
index 1da83512684d89cffd73ecee75d53ee9e7afcf15..a4040d15e5613404600ca5e7572bc1ffd7804bcf 100644 (file)
@@ -427,14 +427,15 @@ struct connectdata {
   struct sockaddr_in serv_addr;
 #endif
   char protostr[64];  /* store the protocol string in this buffer */
-  char gname[513]; /* store the hostname in this buffer */
-  char *name;      /* host name pointer to fool around with */
-  char *path;      /* allocated buffer to store the URL's path part in */
-  char *hostname;  /* hostname to connect, as parsed from url */
+  char *namebuffer; /* allocated buffer to store the hostname in */
+  char *hostname;  /* hostname to use, as parsed from url. points to
+                      somewhere within the namebuffer[] area */
+  char *pathbuffer;/* allocated buffer to store the URL's path part in */
+  char *path;      /* path to use, points to somewhere within the pathbuffer
+                      area */
   long port;       /* which port to use locally */
   unsigned short remote_port; /* what remote port to connect to,
                                  not the proxy port! */
-  char *ppath;
   curl_off_t bytecount;
   long headerbytecount;  /* only count received headers */
   long deductheadercount; /* this amount of bytes doesn't count when we check