Commit 7d06185a authored by Sterling Hughes's avatar Sterling Hughes
Browse files

Make the keys for hostcache entries be in the format::

host:port, so accessing curl.haxx.se on port 80 would yield a key value
of ::
curl.haxx.se:80
parent 01ecb1d7
Loading
Loading
Loading
Loading
+43 −3
Original line number Original line Diff line number Diff line
@@ -98,11 +98,49 @@ struct curl_dns_cache_entry {
  time_t timestamp;
  time_t timestamp;
};
};


static int _num_chars(int i)
{
  int chars = 0;

  do {
    chars++;

    i = (int) i / 10;
  } while (i > 1);

  return chars;
}

static char *
_create_hostcache_id(char *server, int server_len, int port)
{
  char *id = NULL;
  int   id_len;

  id_len = server_len + _num_chars(port);

  id = malloc(id_len + 1);
  if (!id) {
    return NULL;
  }

  id_len = sprintf(id, "%s:%d", server, port);
  if (id_len <= 0) {
    free(id);
    return NULL;
  }

  return id;
}

  

Curl_addrinfo *Curl_resolv(struct SessionHandle *data,
Curl_addrinfo *Curl_resolv(struct SessionHandle *data,
                           char *hostname,
                           char *hostname,
                           int port,
                           int port,
                           char **bufp)
                           char **bufp)
{
{
  char *cache_id = NULL;
  struct curl_dns_cache_entry *p = NULL;
  struct curl_dns_cache_entry *p = NULL;
  size_t hostname_len;
  size_t hostname_len;
  time_t now;
  time_t now;
@@ -113,11 +151,13 @@ Curl_addrinfo *Curl_resolv(struct SessionHandle *data,
    return Curl_getaddrinfo(data, hostname, port, bufp);
    return Curl_getaddrinfo(data, hostname, port, bufp);
  }
  }


  hostname_len = strlen(hostname)+1;
  hostname_len = strlen(hostname);

  cache_id = _create_hostcache_id(hostname, hostname_len, port);
  
  
  time(&now);
  time(&now);
  /* See if its already in our dns cache */
  /* See if its already in our dns cache */
  if (curl_hash_find(data->hostcache, hostname, hostname_len, (void **) &p)) {
  if (cache_id && curl_hash_find(data->hostcache, hostname, hostname_len+1, (void **) &p)) {
    /* Do we need to check for a cache timeout? */
    /* Do we need to check for a cache timeout? */
    if (data->set.dns_cache_timeout != -1) {
    if (data->set.dns_cache_timeout != -1) {
      /* Return if the entry has not timed out */
      /* Return if the entry has not timed out */
@@ -144,7 +184,7 @@ Curl_addrinfo *Curl_resolv(struct SessionHandle *data,
  p->timestamp = now;
  p->timestamp = now;


  /* Save it in our host cache */
  /* Save it in our host cache */
  curl_hash_update(data->hostcache, hostname, hostname_len, (const void *) p);
  curl_hash_update(data->hostcache, hostname, hostname_len+1, (const void *) p);


  return p->addr;
  return p->addr;
}
}