Blame src/testcurl/https/test_https_multi_daemon.c

Packit 875988
/*
Packit 875988
 This file is part of libmicrohttpd
Packit 875988
 Copyright (C) 2007 Christian Grothoff
Packit 875988
Packit 875988
 libmicrohttpd is free software; you can redistribute it and/or modify
Packit 875988
 it under the terms of the GNU General Public License as published
Packit 875988
 by the Free Software Foundation; either version 2, or (at your
Packit 875988
 option) any later version.
Packit 875988
Packit 875988
 libmicrohttpd is distributed in the hope that it will be useful, but
Packit 875988
 WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 875988
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 875988
 General Public License for more details.
Packit 875988
Packit 875988
 You should have received a copy of the GNU General Public License
Packit 875988
 along with libmicrohttpd; see the file COPYING.  If not, write to the
Packit 875988
 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit 875988
 Boston, MA 02110-1301, USA.
Packit 875988
 */
Packit 875988
Packit 875988
/**
Packit 875988
 * @file mhds_multi_daemon_test.c
Packit 875988
 * @brief  Testcase for libmicrohttpd multiple HTTPS daemon scenario
Packit 875988
 * @author Sagie Amir
Packit 875988
 */
Packit 875988
Packit 875988
#include "platform.h"
Packit 875988
#include "microhttpd.h"
Packit 875988
#include <curl/curl.h>
Packit 875988
#include <limits.h>
Packit 875988
#include <sys/stat.h>
Packit 875988
#ifdef MHD_HTTPS_REQUIRE_GRYPT
Packit 875988
#include <gcrypt.h>
Packit 875988
#endif /* MHD_HTTPS_REQUIRE_GRYPT */
Packit 875988
#include "tls_test_common.h"
Packit 875988
Packit 875988
extern const char srv_key_pem[];
Packit 875988
extern const char srv_self_signed_cert_pem[];
Packit 875988
Packit 875988
/*
Packit 875988
 * assert initiating two separate daemons and having one shut down
Packit 875988
 * doesn't affect the other
Packit 875988
 */
Packit 875988
static int
Packit 875988
test_concurent_daemon_pair (void *cls,
Packit 875988
			    const char *cipher_suite,
Packit 875988
                            int proto_version)
Packit 875988
{
Packit 875988
  int ret;
Packit 875988
  struct MHD_Daemon *d1;
Packit 875988
  struct MHD_Daemon *d2;
Packit 875988
  int port1, port2;
Packit 875988
  (void)cls;    /* Unused. Silent compiler warning. */
Packit 875988
Packit 875988
Packit 875988
  if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
Packit 875988
    port1 = port2 = 0;
Packit 875988
  else
Packit 875988
    {
Packit 875988
      port1 = 3050;
Packit 875988
      port2 = 3051;
Packit 875988
    }
Packit 875988
Packit 875988
  d1 = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
Packit 875988
                         MHD_USE_ERROR_LOG, port1,
Packit 875988
                         NULL, NULL, &http_ahc, NULL,
Packit 875988
                         MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
Packit 875988
                         MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
Packit 875988
                         MHD_OPTION_END);
Packit 875988
Packit 875988
  if (d1 == NULL)
Packit 875988
    {
Packit 875988
      fprintf (stderr, MHD_E_SERVER_INIT);
Packit 875988
      return -1;
Packit 875988
    }
Packit 875988
  if (0 == port1)
Packit 875988
    {
Packit 875988
      const union MHD_DaemonInfo *dinfo;
Packit 875988
      dinfo = MHD_get_daemon_info (d1, MHD_DAEMON_INFO_BIND_PORT);
Packit 875988
      if (NULL == dinfo || 0 == dinfo->port)
Packit 875988
        { MHD_stop_daemon (d1); return -1; }
Packit 875988
      port1 = (int)dinfo->port;
Packit 875988
    }
Packit 875988
Packit 875988
  d2 = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
Packit 875988
                         MHD_USE_ERROR_LOG, port2,
Packit 875988
                         NULL, NULL, &http_ahc, NULL,
Packit 875988
                         MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
Packit 875988
                         MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
Packit 875988
                         MHD_OPTION_END);
Packit 875988
Packit 875988
  if (d2 == NULL)
Packit 875988
    {
Packit 875988
      MHD_stop_daemon (d1);
Packit 875988
      fprintf (stderr, MHD_E_SERVER_INIT);
Packit 875988
      return -1;
Packit 875988
    }
Packit 875988
  if (0 == port2)
Packit 875988
    {
Packit 875988
      const union MHD_DaemonInfo *dinfo;
Packit 875988
      dinfo = MHD_get_daemon_info (d2, MHD_DAEMON_INFO_BIND_PORT);
Packit 875988
      if (NULL == dinfo || 0 == dinfo->port)
Packit 875988
        {
Packit 875988
          MHD_stop_daemon (d1);
Packit 875988
          MHD_stop_daemon (d2);
Packit 875988
          return -1;
Packit 875988
        }
Packit 875988
      port2 = (int)dinfo->port;
Packit 875988
    }
Packit 875988
Packit 875988
  ret =
Packit 875988
    test_daemon_get (NULL, cipher_suite, proto_version, port1, 0);
Packit 875988
  ret +=
Packit 875988
    test_daemon_get (NULL, cipher_suite, proto_version,
Packit 875988
                     port2, 0);
Packit 875988
Packit 875988
  MHD_stop_daemon (d2);
Packit 875988
  ret +=
Packit 875988
    test_daemon_get (NULL, cipher_suite, proto_version, port1, 0);
Packit 875988
  MHD_stop_daemon (d1);
Packit 875988
  return ret;
Packit 875988
}
Packit 875988
Packit 875988
Packit 875988
int
Packit 875988
main (int argc, char *const *argv)
Packit 875988
{
Packit 875988
  unsigned int errorCount = 0;
Packit 875988
  FILE *cert;
Packit 875988
  const char *aes256_sha = "AES256-SHA";
Packit 875988
  (void)argc; (void)argv;       /* Unused. Silent compiler warning. */
Packit 875988
Packit 875988
#ifdef MHD_HTTPS_REQUIRE_GRYPT
Packit 875988
  gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
Packit 875988
#ifdef GCRYCTL_INITIALIZATION_FINISHED
Packit 875988
  gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
Packit 875988
#endif
Packit 875988
#endif /* MHD_HTTPS_REQUIRE_GRYPT */
Packit 875988
  if (!testsuite_curl_global_init ())
Packit 875988
    return 99;
Packit 875988
  if (NULL == curl_version_info (CURLVERSION_NOW)->ssl_version)
Packit 875988
    {
Packit 875988
      fprintf (stderr, "Curl does not support SSL.  Cannot run the test.\n");
Packit 875988
      curl_global_cleanup ();
Packit 875988
      return 77;
Packit 875988
    }
Packit 875988
  if ((cert = setup_ca_cert ()) == NULL)
Packit 875988
    {
Packit 875988
      fprintf (stderr, MHD_E_TEST_FILE_CREAT);
Packit 875988
      curl_global_cleanup ();
Packit 875988
      return 99;
Packit 875988
    }
Packit 875988
Packit 875988
  if (curl_uses_nss_ssl() == 0)
Packit 875988
    {
Packit 875988
      aes256_sha = "rsa_aes_256_sha";
Packit 875988
    }
Packit 875988
Packit 875988
  errorCount +=
Packit 875988
    test_concurent_daemon_pair (NULL, aes256_sha, CURL_SSLVERSION_TLSv1);
Packit 875988
Packit 875988
  print_test_result (errorCount, "concurent_daemon_pair");
Packit 875988
Packit 875988
  curl_global_cleanup ();
Packit 875988
  fclose (cert);
Packit 875988
  if (0 != remove (ca_cert_file_name))
Packit 875988
    fprintf (stderr,
Packit 875988
	     "Failed to remove `%s'\n",
Packit 875988
	     ca_cert_file_name);
Packit 875988
  return errorCount != 0 ? 1 : 0;
Packit 875988
}