END_TEST

START_TEST(create_from_str_1_test)
{
  dpl_addrlist_t        *addrlist;
  dpl_addr_t            *addrp = NULL;
  dpl_status_t          r;
  char                  *s, ident[INET_ADDRSTRLEN];

  /* create the addrlist */
  addrlist = dpl_addrlist_create_from_str("4244", "192.168.1.1");
  dpl_assert_ptr_not_null(addrlist);

  /* verify length */
  dpl_assert_int_eq(1, dpl_addrlist_count(addrlist));

  /* verify getting elements by index */
  r = dpl_addrlist_get_nth(addrlist, 0, &addrp);
  dpl_assert_int_eq(DPL_SUCCESS, r);
  dpl_assert_ptr_not_null(addrp);
  dpl_assert_str_eq(addrp->host, "192.168.1.1");
  dpl_assert_str_eq(addrp->portstr, "4244");
  dpl_assert_ptr_not_null(addrp->h);
  dpl_assert_int_eq(addrp->h->h_addrtype, AF_INET); 
  inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident));
  dpl_assert_str_eq(ident, "192.168.1.1");
  dpl_assert_int_eq(addrp->port, 4244);

  /* indexes wrap modulo the count */
  r = dpl_addrlist_get_nth(addrlist, 1, &addrp);
  dpl_assert_ptr_not_null(addrp);
  dpl_assert_str_eq(addrp->host, "192.168.1.1");
  dpl_assert_str_eq(addrp->portstr, "4244");
  dpl_assert_ptr_not_null(addrp->h);
  dpl_assert_int_eq(addrp->h->h_addrtype, AF_INET); 
  inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident));
  dpl_assert_str_eq(ident, "192.168.1.1");
  dpl_assert_int_eq(addrp->port, 4244);

  r = dpl_addrlist_get_nth(addrlist, 347, &addrp);
  dpl_assert_ptr_not_null(addrp);
  dpl_assert_str_eq(addrp->host, "192.168.1.1");
  dpl_assert_str_eq(addrp->portstr, "4244");
  dpl_assert_ptr_not_null(addrp->h);
  dpl_assert_int_eq(addrp->h->h_addrtype, AF_INET); 
  inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident));
  dpl_assert_str_eq(ident, "192.168.1.1");
  dpl_assert_int_eq(addrp->port, 4244);

  /* verify the string form of the addrlist */
  s = dpl_addrlist_get(addrlist);
  dpl_assert_str_eq(s, "192.168.1.1:4244");

  free(s);
  dpl_addrlist_free(addrlist);
}
Exemple #2
0
END_TEST

/* Passing addrlist=null to various functions fails cleanly */
START_TEST(null_test)
{
  char *s;

  /* dpl_addrlist_get() has an odd return for this corner case, but whatever */
  s = dpl_addrlist_get(NULL);
  dpl_assert_str_eq(s, "");
  free(s);

  dpl_assert_int_eq(0, dpl_addrlist_count(NULL));
  dpl_addrlist_free(NULL);
  dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_blacklist(NULL, "192.168.1.32", "80", 30));
  dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_unblacklist(NULL, "192.168.1.32", "80"));
  dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_set_from_str(NULL, "192.168.1.32"));
  dpl_assert_ptr_null(dpl_addrlist_create_from_str(NULL, NULL));
  dpl_addrlist_lock(NULL);
  dpl_addrlist_unlock(NULL);
  dpl_assert_int_eq(DPL_ENOENT, dpl_addrlist_get_nth(NULL, 1, &s, &s, NULL, NULL));
  dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_add(NULL, "192.168.1.32", "80"));
}
Exemple #3
0
END_TEST

START_TEST(create_from_str_1_test)
{
  dpl_addrlist_t *addrlist;
  char *hoststr = NULL;
  char *portstr = NULL;
  struct in_addr ipaddr;
  u_short port;
  dpl_status_t r;
  char *s;

  /* create the addrlist */
  addrlist = dpl_addrlist_create_from_str("4244", "192.168.1.1");
  dpl_assert_ptr_not_null(addrlist);

  /* verify length */
  dpl_assert_int_eq(1, dpl_addrlist_count(addrlist));

  /* verify getting elements by index */

  hoststr = portstr = NULL;
  memset(&ipaddr, 0, sizeof(ipaddr));
  port = 0;
  r = dpl_addrlist_get_nth(addrlist, 0, &hoststr, &portstr, &ipaddr, &port);
  dpl_assert_int_eq(DPL_SUCCESS, r);
  dpl_assert_str_eq(hoststr, "192.168.1.1");
  dpl_assert_str_eq(portstr, "4244");
  dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1");
  dpl_assert_int_eq(port, 4244);

  /* indexes wrap modulo the count */

  hoststr = portstr = NULL;
  memset(&ipaddr, 0, sizeof(ipaddr));
  port = 0;
  r = dpl_addrlist_get_nth(addrlist, 1, &hoststr, &portstr, &ipaddr, &port);
  dpl_assert_int_eq(DPL_SUCCESS, r);
  dpl_assert_str_eq(hoststr, "192.168.1.1");
  dpl_assert_str_eq(portstr, "4244");
  dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1");
  dpl_assert_int_eq(port, 4244);


  hoststr = portstr = NULL;
  memset(&ipaddr, 0, sizeof(ipaddr));
  port = 0;
  r = dpl_addrlist_get_nth(addrlist, 347, &hoststr, &portstr, &ipaddr, &port);
  dpl_assert_int_eq(DPL_SUCCESS, r);
  dpl_assert_str_eq(hoststr, "192.168.1.1");
  dpl_assert_str_eq(portstr, "4244");
  dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1");
  dpl_assert_int_eq(port, 4244);

  /* verify the string form of the addrlist */
  s = dpl_addrlist_get(addrlist);
  dpl_assert_str_eq(s, "192.168.1.1:4244");

  free(s);
  dpl_addrlist_free(addrlist);
}
Exemple #4
0
END_TEST

START_TEST(create_from_str_3_test)
{
  dpl_addrlist_t *addrlist;
  char *hoststr = NULL;
  char *portstr = NULL;
  struct in_addr ipaddr;
  u_short port;
  dpl_status_t r;
  int i;
  char *s;
  int port_position[3] = { 0, 0, 0 };
  int port_counts[3] = { 0, 0, 0 };
  char expstr[256] = "";

  /* create the addrlist */
  addrlist = dpl_addrlist_create_from_str("4244",
					  "192.168.1.1:4242,192.168.1.2:4243,192.168.1.3");
  dpl_assert_ptr_not_null(addrlist);

  /* verify length */
  dpl_assert_int_eq(3, dpl_addrlist_count(addrlist));

  /* verify getting elements by index */
  /* indexes wrap modulo the count */

  for (i = 0 ; i < 12 ; i++)
    {
      hoststr = portstr = NULL;
      memset(&ipaddr, 0, sizeof(ipaddr));
      port = 0;
      r = dpl_addrlist_get_nth(addrlist, i, &hoststr, &portstr, &ipaddr, &port);
      dpl_assert_int_eq(DPL_SUCCESS, r);

      fail_unless(port >= 4242, NULL);
      fail_unless(port <= 4244, NULL);
      if (port == 4242)
	{
	  dpl_assert_str_eq(hoststr, "192.168.1.1");
	  dpl_assert_str_eq(portstr, "4242");
	  dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1");
	  port_counts[0]++;
	}
      else if (port == 4243)
	{
	  dpl_assert_str_eq(hoststr, "192.168.1.2");
	  dpl_assert_str_eq(portstr, "4243");
	  dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.2");
	  port_counts[1]++;
	}
      else /* 4244 */
	{
	  dpl_assert_str_eq(hoststr, "192.168.1.3");
	  dpl_assert_str_eq(portstr, "4244");
	  dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.3");
	  port_counts[2]++;
	}

      if (port_position[i % 3])
	dpl_assert_int_eq(port_position[i % 3], port);
      else
	port_position[i % 3] = port;
    }
  dpl_assert_int_eq(port_counts[0], 4);
  dpl_assert_int_eq(port_counts[1], 4);
  dpl_assert_int_eq(port_counts[2], 4);

  /* verify the string form of the addrlist */
  /* this is tough because the list is randomised internally */

  for (i = 0 ; i < 3 ; i++)
    {
      if (i)
	strcat(expstr, ",");
      if (port_position[i] == 4242)
	strcat(expstr, "192.168.1.1:4242");
      else if (port_position[i] == 4243)
	strcat(expstr, "192.168.1.2:4243");
      else if (port_position[i] == 4244)
	strcat(expstr, "192.168.1.3:4244");
    }

  s = dpl_addrlist_get(addrlist);
  dpl_assert_str_eq(s, expstr);

  free(s);
  dpl_addrlist_free(addrlist);
}
END_TEST

START_TEST(create_from_str_3_test)
{
  dpl_addrlist_t        *addrlist;
  dpl_addr_t            *addrp = NULL;
  dpl_status_t          r;
  int                   i;
  char                  *s, ident[INET_ADDRSTRLEN];
  int                   port_position[3] = { 0, 0, 0 };
  int                   port_counts[3] = { 0, 0, 0 };
  char                  expstr[256] = "";

  /* create the addrlist */
  addrlist = dpl_addrlist_create_from_str("4244",
					  "192.168.1.1:4242,192.168.1.2:4243,192.168.1.3");
  dpl_assert_ptr_not_null(addrlist);

  /* verify length */
  dpl_assert_int_eq(3, dpl_addrlist_count(addrlist));

  /* verify getting elements by index */
  /* indexes wrap modulo the count */

  for (i = 0; i < 12; i++)
    {
      r = dpl_addrlist_get_nth(addrlist, i, &addrp);
      dpl_assert_int_eq(DPL_SUCCESS, r);
      dpl_assert_ptr_not_null(addrp);
      dpl_assert_ptr_not_null(addrp->h);

      fail_unless(addrp->port >= 4242, NULL);
      fail_unless(addrp->port <= 4244, NULL);

      inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident));

      if (addrp->port == 4242)
	{
	  dpl_assert_str_eq(addrp->host, "192.168.1.1");
	  dpl_assert_str_eq(addrp->portstr, "4242");
	  dpl_assert_str_eq(ident, "192.168.1.1");
	  port_counts[0]++;
	}
      else if (addrp->port == 4243)
	{
	  dpl_assert_str_eq(addrp->host, "192.168.1.2");
	  dpl_assert_str_eq(addrp->portstr, "4243");
	  dpl_assert_str_eq(ident, "192.168.1.2");
	  port_counts[1]++;
	}
      else /* 4244 */
	{
	  dpl_assert_str_eq(addrp->host, "192.168.1.3");
	  dpl_assert_str_eq(addrp->portstr, "4244");
	  dpl_assert_str_eq(ident, "192.168.1.3");
	  port_counts[2]++;
	}

      if (port_position[i % 3])
	dpl_assert_int_eq(port_position[i % 3], addrp->port);
      else
	port_position[i % 3] = addrp->port;
    }
  dpl_assert_int_eq(port_counts[0], 4);
  dpl_assert_int_eq(port_counts[1], 4);
  dpl_assert_int_eq(port_counts[2], 4);

  /* verify the string form of the addrlist */
  /* this is tough because the list is randomised internally */

  for (i = 0 ; i < 3 ; i++)
    {
      if (i)
	strcat(expstr, ",");
      if (port_position[i] == 4242)
	strcat(expstr, "192.168.1.1:4242");
      else if (port_position[i] == 4243)
	strcat(expstr, "192.168.1.2:4243");
      else if (port_position[i] == 4244)
	strcat(expstr, "192.168.1.3:4244");
    }

  s = dpl_addrlist_get(addrlist);
  dpl_assert_str_eq(s, expstr);

  free(s);
  dpl_addrlist_free(addrlist);
}
Exemple #6
0
static int
conf_cb_func(void *cb_arg,
             const char *var,
             char *value)
{
  dpl_ctx_t *ctx = (dpl_ctx_t *) cb_arg;
  char path[1024];

  DPRINTF("%s %s\n", var, value);

  if (!strcmp(var, ""))
    return 0;
  else if (!strcmp(var, "use_https"))
    {
      if (!strcasecmp(value, "true"))
        ctx->use_https = 1;
      else if (!strcasecmp(value, "false"))
        ctx->use_https = 0;
      else
        {
          fprintf(stderr, "invalid value '%s'\n", var);
          return -1;
        }
    }
  else if (!strcmp(var, "host"))
    {
      if (NULL != ctx->addrlist)
        {
          fprintf(stderr, "address list already defined\n");
          return -1;
        }

      ctx->addrlist = dpl_addrlist_create_from_str(ctx->use_https ? "443" : "80", value);
      if (NULL == ctx->addrlist)
        {
          fprintf(stderr, "error parsing address list\n");
          return -1;
        }
    }
  else if (!strcmp(var, "port"))
    {
      fprintf(stderr, "Warning: the 'port' option in configuration file is ignored.\n");
      fprintf(stderr, "The port(s) must be specified in the hostname(s).\n");
      fprintf(stderr, "If nothing is specified, 80 is used (or 443 for https).\n");
    }
  else if (!strcmp(var, "blacklist_expiretime"))
    {
      ctx->blacklist_expiretime = atoi(value);
    }
  else if (! strcmp(var, "header_size"))
    {
      ctx->header_size = strtoul(value, NULL, 0);
    }
  else if (!strcmp(var, "base_path"))
    {
      int value_len = strlen(value);

      if (strcmp(value, "/"))
        {
          if (value_len >= 1 && value[value_len-1] == '/')
            {
              fprintf(stderr, "base_path must not end by a delimiter\n");
              return -1;
            }
        }

      ctx->base_path = strdup(value);
      if (NULL == ctx->base_path)
        return -1;
    }
  else if (!strcmp(var, "access_key"))
    {
      ctx->access_key = strdup(value);
      if (NULL == ctx->access_key)
        return -1;
    }
  else if (!strcmp(var, "secret_key"))
    {
      ctx->secret_key = strdup(value);
      if (NULL == ctx->secret_key)
        return -1;
    }
  else if (!strcmp(var, "ssl_cert_file"))
    {
      if (value[0] != '/')
        {
          snprintf(path, sizeof (path), "%s/%s", ctx->droplet_dir, value);
          ctx->ssl_cert_file = strdup(path);
        }
      else
        ctx->ssl_cert_file = strdup(value);
      if (NULL == ctx->ssl_cert_file)
        return -1;
    }
  else if (!strcmp(var, "ssl_key_file"))
    {
      if (value[0] != '/')
        {
          snprintf(path, sizeof (path), "%s/%s", ctx->droplet_dir, value);
          ctx->ssl_key_file = strdup(path);
        }
      else
        ctx->ssl_key_file = strdup(value);
      if (NULL == ctx->ssl_key_file)
        return -1;
    }
  else if (!strcmp(var, "ssl_password"))
    {
      ctx->ssl_password = strdup(value);
      if (NULL == ctx->ssl_password)
        return -1;
    }
  else if (!strcmp(var, "ssl_ca_list"))
    {
      ctx->ssl_ca_list = strdup(value);
      if (NULL == ctx->ssl_ca_list)
        return -1;
    }
  else if (!strcmp(var, "pricing"))
    {
      ctx->pricing = strdup(value);
      if (NULL == ctx->pricing)
        return -1;
    }
  else if (!strcmp(var, "pricing_dir"))
    {
      ctx->pricing_dir = strdup(value);
      if (NULL == ctx->pricing_dir)
        return -1;
    }
  else if (!strcmp(var, "read_buf_size"))
    {
      ctx->read_buf_size = strtoul(value, NULL, 0);
    }
  else if (!strcmp(var, "encrypt_key"))
    {
      ctx->encrypt_key = strdup(value);
      if (NULL == ctx->encrypt_key)
        return -1;
    }
  else if (!strcmp(var, "backend"))
    {
      ctx->backend = dpl_backend_find(value);
      if (NULL == ctx->backend)
        {
          fprintf(stderr, "no such backend '%s'\n", value);
          return -1;
        }
    }
  else if (!strcmp(var, "encode_slashes"))
    {
      if (!strcasecmp(value, "true"))
        ctx->encode_slashes = 1;
      else if (!strcasecmp(value, "false"))
        ctx->encode_slashes = 0;
      else
        {
          fprintf(stderr, "invalid value '%s'\n", var);
          return -1;
        }
    }
  else if (!strcmp(var, "keep_alive"))
    {
      if (!strcasecmp(value, "true"))
        ctx->keep_alive = 1;
      else if (!strcasecmp(value, "false"))
        ctx->keep_alive = 0;
      else
        {
          fprintf(stderr, "invalid value '%s'\n", var);
          return -1;
        }
    }
  else if (!strcmp(var, "url_encoding"))
    {
      if (!strcasecmp(value, "true"))
        ctx->url_encoding = 1;
      else if (!strcasecmp(value, "false"))
        ctx->url_encoding = 0;
      else
        {
          fprintf(stderr, "invalid value '%s'\n", var);
          return -1;
        }
    }
  else if (!strcmp(var, "enterprise_number"))
    {
      ctx->enterprise_number = strtoul(value, NULL, 0);
    }
  else
    {
      fprintf(stderr, "no such variable '%s'\n", var);
      return -1;
    }

  return 0;
}