gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r12334 - in libmicrohttpd/src: daemon include testcurl/http


From: gnunet
Subject: [GNUnet-SVN] r12334 - in libmicrohttpd/src: daemon include testcurl/https
Date: Sun, 25 Jul 2010 09:17:26 +0200

Author: grothoff
Date: 2010-07-25 09:17:26 +0200 (Sun, 25 Jul 2010)
New Revision: 12334

Added:
   libmicrohttpd/src/testcurl/https/mhds_get_test_select.c
Modified:
   libmicrohttpd/src/daemon/connection.c
   libmicrohttpd/src/daemon/connection_https.c
   libmicrohttpd/src/daemon/daemon.c
   libmicrohttpd/src/daemon/internal.c
   libmicrohttpd/src/daemon/internal.h
   libmicrohttpd/src/include/microhttpd.h
   libmicrohttpd/src/testcurl/https/Makefile.am
   libmicrohttpd/src/testcurl/https/mhds_get_test.c
   libmicrohttpd/src/testcurl/https/tls_daemon_options_test.c
   libmicrohttpd/src/testcurl/https/tls_thread_mode_test.c
Log:
GHM hacking

Modified: libmicrohttpd/src/daemon/connection.c
===================================================================
--- libmicrohttpd/src/daemon/connection.c       2010-07-24 15:24:50 UTC (rev 
12333)
+++ libmicrohttpd/src/daemon/connection.c       2010-07-25 07:17:26 UTC (rev 
12334)
@@ -778,12 +778,17 @@
 #endif
       switch (connection->state)
         {
+#if HTTPS_SUPPORT     
+       case MHD_TLS_CONNECTION_INIT:
+         if (0 == gnutls_record_get_direction (connection->tls_session))
+            p->events |= MHD_POLL_ACTION_IN;
+         else
+           p->events |= MHD_POLL_ACTION_OUT;
+         break;
+#endif
         case MHD_CONNECTION_INIT:
         case MHD_CONNECTION_URL_RECEIVED:
         case MHD_CONNECTION_HEADER_PART_RECEIVED:
-#if HTTPS_SUPPORT
-        case MHD_TLS_CONNECTION_INIT:
-#endif
           /* while reading headers, we always grow the
              read buffer if needed, no size-check required */
           if ((connection->read_closed) &&
@@ -1866,8 +1871,6 @@
             connection_close_error (connection);
           return MHD_NO;
         case MHD_TLS_CONNECTION_INIT:
-        case MHD_TLS_HELLO_REQUEST:
-        case MHD_TLS_HANDSHAKE_FAILED:
           EXTRA_CHECK (0);
           break;
         default:

Modified: libmicrohttpd/src/daemon/connection_https.c
===================================================================
--- libmicrohttpd/src/daemon/connection_https.c 2010-07-24 15:24:50 UTC (rev 
12333)
+++ libmicrohttpd/src/daemon/connection_https.c 2010-07-25 07:17:26 UTC (rev 
12334)
@@ -47,8 +47,7 @@
 MHD_tls_connection_close (struct MHD_Connection *connection,
                           enum MHD_RequestTerminationCode termination_code)
 {
-  gnutls_bye (connection->tls_session, GNUTLS_SHUT_WR);
-  /* connection->tls_session->internals.read_eof = 1; // FIXME_GHM: needed? */
+  gnutls_bye (connection->tls_session, GNUTLS_SHUT_RDWR);
   MHD_connection_close (connection, termination_code);
 }
 
@@ -90,26 +89,12 @@
         MHD_tls_connection_close (connection,
                                   MHD_REQUEST_TERMINATED_COMPLETED_OK);
       return MHD_NO;
-    case MHD_TLS_HANDSHAKE_FAILED:
-      MHD_tls_connection_close (connection,
-                                MHD_REQUEST_TERMINATED_WITH_ERROR);
-      return MHD_NO;
-      /* some HTTP state */
     default:
       return MHD_connection_handle_idle (connection);
     }
   return MHD_YES;
 }
 
-/* FIXME_GHM: this is digging into gnutls/SSL internals
-   that is likely wrong... */
-/* Record Protocol */
-typedef enum content_type_t
-{
-  GNUTLS_CHANGE_CIPHER_SPEC = 20, GNUTLS_ALERT,
-  GNUTLS_HANDSHAKE, GNUTLS_APPLICATION_DATA,
-  GNUTLS_INNER_APPLICATION = 24
-} content_type_t;
 
 /**
  * This function handles a particular SSL/TLS connection when
@@ -132,142 +117,36 @@
 MHD_tls_connection_handle_read (struct MHD_Connection *connection)
 {
   int ret;
-  unsigned char msg_type;
 
   connection->last_activity = time (NULL);
-  if (connection->state == MHD_CONNECTION_CLOSED ||
-      connection->state == MHD_TLS_HANDSHAKE_FAILED)
-    return MHD_NO;
-
-#if DEBUG_STATES
-  MHD_DLOG (connection->daemon, "%s: state: %s\n",
-            __FUNCTION__, MHD_state_to_string (connection->state));
-#endif
-
-  /* discover content type */
-  if (RECV (connection->socket_fd, &msg_type, 1, MSG_PEEK) == -1)
+  if (connection->state == MHD_TLS_CONNECTION_INIT)
     {
+      ret = gnutls_handshake (connection->tls_session);
+      if (ret == GNUTLS_E_SUCCESS) 
+       {
+         /* set connection state to enable HTTP processing */
+         connection->state = MHD_CONNECTION_INIT;
+         return MHD_YES;         
+       }
+      if ( (ret == GNUTLS_E_AGAIN) || 
+          (ret == GNUTLS_E_INTERRUPTED) )
+       {
+         /* handshake not done */
+         return MHD_YES;
+       }
+      /* handshake failed */
 #if HAVE_MESSAGES
-      MHD_DLOG (connection->daemon, "Failed to peek into TLS content type\n");
-#endif
-      return MHD_NO;
-    }
-
-  switch (msg_type)
-    {
-      /* check for handshake messages first */
-    case GNUTLS_HANDSHAKE:
-      /* negotiate handshake only while in INIT & HELLO_REQUEST states */
-      if (connection->state == MHD_TLS_CONNECTION_INIT ||
-          connection->state == MHD_TLS_HELLO_REQUEST)
-        {
-          ret = gnutls_handshake (connection->tls_session);
-          if (ret == 0)
-            {
-              /* set connection state to enable HTTP processing */
-              connection->state = MHD_CONNECTION_INIT;
-              break;
-            }
-          /* set connection as closed */
-          else
-            {
-#if HAVE_MESSAGES
-              MHD_DLOG (connection->daemon,
-                        "Error: Handshake has failed (%d)\n", ret);
-#endif
-              connection->state = MHD_TLS_HANDSHAKE_FAILED;
-              return MHD_NO;
-            }
-        }
-      /* a handshake message has been received out of bound */
-      else
-        {
-#if HAVE_MESSAGES
-          MHD_DLOG (connection->daemon,
-                    "Error: received handshake message out of context\n");
-#endif
-          MHD_tls_connection_close (connection,
-                                    MHD_REQUEST_TERMINATED_WITH_ERROR);
-          return MHD_NO;
-        }
-
-      /* ignore any out of bound change chiper spec messages */
-    case GNUTLS_CHANGE_CIPHER_SPEC:
-      MHD_tls_connection_close (connection,
-                                MHD_REQUEST_TERMINATED_WITH_ERROR);
-      return MHD_NO;
-
-    case GNUTLS_ALERT:
-#if FIXME_GHM      
-      /*
-       * this call of MHD_gtls_recv_int expects 0 bytes read.
-       * done to decrypt alert message
-       */
-      gnutls_recv_int (connection->tls_session, GNUTLS_ALERT,
-                      GNUTLS_HANDSHAKE_FINISHED, 0, 0);
-      /* CLOSE_NOTIFY */
-      if (connection->tls_session->internals.last_alert ==
-          GNUTLS_A_CLOSE_NOTIFY)
-        {
-          connection->state = MHD_CONNECTION_CLOSED;
-          return MHD_YES;
-        }
-      /* non FATAL or WARNING */
-      else
-       if (connection->tls_session->internals.last_alert_level !=
-               GNUTLS_AL_FATAL)
-        {
-#if HAVE_MESSAGES
-          MHD_DLOG (connection->daemon,
-                    "Received TLS alert: %s\n",
-                    MHD__gnutls_alert_get_name ((int)
-                                                connection->tls_session->
-                                                internals.last_alert));
-#endif
-          return MHD_YES;
-        }
-      /* FATAL */
-      else if (connection->tls_session->internals.last_alert_level ==
-               GNUTLS_AL_FATAL)
-        {
-          MHD_tls_connection_close (connection,
-                                    MHD_REQUEST_TERMINATED_WITH_ERROR);
-          return MHD_NO;
-        }
-      /* this should never execute */
-      else
-        {
-#if HAVE_MESSAGES
-          MHD_DLOG (connection->daemon,
-                    "Received unrecognized alert: %d\n",
-                    connection->tls_session->internals.last_alert);
-#endif
-          return MHD_NO;
-        }
-#endif
-
-
-      /* forward application level content to MHD */
-    case GNUTLS_APPLICATION_DATA:
-      return MHD_connection_handle_read (connection);
-    case GNUTLS_INNER_APPLICATION:
-      break;
-    default:
-#if HAVE_MESSAGES
       MHD_DLOG (connection->daemon,
-                "Error: unrecognized TLS message type: %d, connection state: 
%s. l: %d, f: %s\n",
-                msg_type, MHD_state_to_string (connection->state), __LINE__,
-                __FUNCTION__);
+               "Error: received handshake message out of context\n");
 #endif
-      /* close connection upon reception of unrecognized message type */
       MHD_tls_connection_close (connection,
-                                MHD_REQUEST_TERMINATED_WITH_ERROR);
+                               MHD_REQUEST_TERMINATED_WITH_ERROR);
       return MHD_NO;
     }
-
-  return MHD_YES;
+  return MHD_connection_handle_read (connection);
 }
 
+
 /**
  * This function was created to handle writes to sockets when it has
  * been determined that the socket can be written to. This function
@@ -280,23 +159,38 @@
 static int
 MHD_tls_connection_handle_write (struct MHD_Connection *connection)
 {
-  connection->last_activity = time (NULL);
+  int ret;
 
+  connection->last_activity = time (NULL);
 #if DEBUG_STATES
   MHD_DLOG (connection->daemon, "%s: state: %s\n",
             __FUNCTION__, MHD_state_to_string (connection->state));
 #endif
-
-  switch (connection->state)
+  if (connection->state == MHD_TLS_CONNECTION_INIT)
     {
-    case MHD_CONNECTION_CLOSED:
-    case MHD_TLS_HANDSHAKE_FAILED:
+      ret = gnutls_handshake (connection->tls_session);
+      if (ret == GNUTLS_E_SUCCESS)
+       {
+         /* set connection state to enable HTTP processing */
+         connection->state = MHD_CONNECTION_INIT;
+         return MHD_YES;         
+       }
+      if ( (ret == GNUTLS_E_AGAIN) || 
+          (ret == GNUTLS_E_INTERRUPTED) )
+       {
+         /* handshake not done */
+         return MHD_YES;
+       }
+      /* handshake failed */
+#if HAVE_MESSAGES
+      MHD_DLOG (connection->daemon,
+               "Error: received handshake message out of context\n");
+#endif
+      MHD_tls_connection_close (connection,
+                               MHD_REQUEST_TERMINATED_WITH_ERROR);
       return MHD_NO;
-      /* some HTTP connection state */
-    default:
-      return MHD_connection_handle_write (connection);
     }
-  return MHD_NO;
+  return MHD_connection_handle_write (connection);
 }
 
 /**

Modified: libmicrohttpd/src/daemon/daemon.c
===================================================================
--- libmicrohttpd/src/daemon/daemon.c   2010-07-24 15:24:50 UTC (rev 12333)
+++ libmicrohttpd/src/daemon/daemon.c   2010-07-25 07:17:26 UTC (rev 12334)
@@ -626,7 +626,44 @@
     return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL | MSG_DONTWAIT);
 }
 
+
+#if HTTPS_SUPPORT
 /**
+ * Set if a socket should use non-blocking IO.
+ * @param fd socket
+ */
+static void
+socket_set_nonblocking (int fd)
+{
+#if MINGW
+  u_long mode;
+  mode = 1;
+  if (ioctlsocket (fd, FIONBIO, &mode) == SOCKET_ERROR)
+    {
+      SetErrnoFromWinsockError (WSAGetLastError ());
+#if HAVE_MESSAGES
+      FPRINTF(stderr, "Failed to make socket non-blocking: %s\n", 
+             STRERROR (errno));
+#endif
+    }
+#else
+
+  /* not MINGW */
+  int flags = fcntl (fd, F_GETFL);
+  if ( (flags == -1) ||
+       (0 != fcntl (fd, F_SETFL, flags | O_NONBLOCK)) )
+    {
+#if HAVE_MESSAGES
+      FPRINTF(stderr, "Failed to make socket non-blocking: %s\n", 
+             STRERROR (errno));
+#endif
+    }
+#endif
+}
+#endif
+
+
+/**
  * Accept an incoming connection and create the MHD_Connection object for
  * it.  This function also enforces policy by way of checking with the
  * accept policy callback.
@@ -765,13 +802,20 @@
       connection->state = MHD_TLS_CONNECTION_INIT;
       MHD_set_https_calbacks (connection);
       gnutls_init (&connection->tls_session, GNUTLS_SERVER);
+      gnutls_priority_set (connection->tls_session,
+                          daemon->priority_cache);
+      if (0 == (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
+       {
+         /* use non-blocking IO for gnutls */
+         socket_set_nonblocking (connection->socket_fd);
+       }
       switch (connection->daemon->cred_type)
         {
           /* set needed credentials for certificate authentication. */
         case GNUTLS_CRD_CERTIFICATE:
           gnutls_credentials_set (connection->tls_session,
                                  GNUTLS_CRD_CERTIFICATE,
-                                       connection->daemon->x509_cred);
+                                 connection->daemon->x509_cred);
           break;
         default:
 #if HAVE_MESSAGES
@@ -1199,6 +1243,9 @@
   enum MHD_OPTION opt;
   struct MHD_OptionItem *oa;
   unsigned int i;
+#if HTTPS_SUPPORT
+  int ret;
+#endif
   
   while (MHD_OPTION_END != (opt = va_arg (ap, enum MHD_OPTION)))
     {
@@ -1241,16 +1288,6 @@
            }
           break;
 #if HTTPS_SUPPORT
-        case MHD_OPTION_PROTOCOL_VERSION:
-         FPRINTF (stderr,
-                  "Protocol version setting currently not supported.\n");
-#if HAVE_MESSAGES
-         else
-           FPRINTF (stderr,
-                    "MHD HTTPS option %d passed to MHD but MHD_USE_SSL not 
set\n",
-                    opt);        
-#endif
-          break;
         case MHD_OPTION_HTTPS_MEM_KEY:
          if (daemon->options & MHD_USE_SSL)
            daemon->https_mem_key = va_arg (ap, const char *);
@@ -1272,14 +1309,17 @@
 #endif
           break;
         case MHD_OPTION_CIPHER_ALGORITHM:
-         FPRINTF (stderr,
-                  "CIPHER setting currently not supported\n");
+         ret = gnutls_priority_init (&daemon->priority_cache,
+                                     va_arg (ap, const char*),
+                                     NULL);
 #if HAVE_MESSAGES
-         else
+         if (ret != GNUTLS_E_SUCCESS)
            FPRINTF (stderr,
-                    "MHD HTTPS option %d passed to MHD but MHD_USE_SSL not 
set\n",
-                    opt);        
+                    "gnutls unhappy: %s\n",
+                    gnutls_strerror (ret));
 #endif   
+         if (ret != GNUTLS_E_SUCCESS)
+           return MHD_NO;
           break;
 #endif
         case MHD_OPTION_EXTERNAL_LOGGER:
@@ -1333,7 +1373,6 @@
                case MHD_OPTION_SOCK_ADDR:
                case MHD_OPTION_HTTPS_MEM_KEY:
                case MHD_OPTION_HTTPS_MEM_CERT:
-               case MHD_OPTION_PROTOCOL_VERSION:
                case MHD_OPTION_CIPHER_ALGORITHM:
                case MHD_OPTION_ARRAY:
                  if (MHD_YES != parse_options (daemon,
@@ -1421,6 +1460,11 @@
   if (retVal == NULL)
     return NULL;
   memset (retVal, 0, sizeof (struct MHD_Daemon));
+#if HTTPS_SUPPORT
+  gnutls_priority_init (&retVal->priority_cache,
+                       "NORMAL",
+                       NULL);
+#endif
   retVal->options = (enum MHD_OPTION)options;
   retVal->port = port;
   retVal->apc = apc;

Modified: libmicrohttpd/src/daemon/internal.c
===================================================================
--- libmicrohttpd/src/daemon/internal.c 2010-07-24 15:24:50 UTC (rev 12333)
+++ libmicrohttpd/src/daemon/internal.c 2010-07-25 07:17:26 UTC (rev 12334)
@@ -77,12 +77,6 @@
       return "closed";
     case MHD_TLS_CONNECTION_INIT:
       return "secure connection init";
-    case MHD_TLS_HELLO_REQUEST:
-      return "secure hello request";
-    case MHD_TLS_HANDSHAKE_FAILED:
-      return "secure handshake failed";
-    case MHD_TLS_HANDSHAKE_COMPLETE:
-      return "secure handshake _complete";
     default:
       return "unrecognized connection state";
     }

Modified: libmicrohttpd/src/daemon/internal.h
===================================================================
--- libmicrohttpd/src/daemon/internal.h 2010-07-24 15:24:50 UTC (rev 12333)
+++ libmicrohttpd/src/daemon/internal.h 2010-07-25 07:17:26 UTC (rev 12334)
@@ -345,21 +345,8 @@
    * Handshake messages will be processed in this state & while
    * in the 'MHD_TLS_HELLO_REQUEST' state
    */
-  MHD_TLS_CONNECTION_INIT = MHD_CONNECTION_CLOSED + 1,
+  MHD_TLS_CONNECTION_INIT = MHD_CONNECTION_CLOSED + 1
 
-  /**
-   * This state indicates the server has send a 'Hello Request' to
-   * the client & a renegotiation of the handshake is in progress.
-   *
-   * Handshake messages will processed in this state & while
-   * in the 'MHD_TLS_CONNECTION_INIT' state
-   */
-  MHD_TLS_HELLO_REQUEST,
-
-  MHD_TLS_HANDSHAKE_FAILED,
-
-  MHD_TLS_HANDSHAKE_COMPLETE
-
 };
 
 /**
@@ -806,6 +793,11 @@
 
 #if HTTPS_SUPPORT
   /**
+   * Desired cipher algorithms.
+   */
+  gnutls_priority_t priority_cache;
+
+  /**
    * What kind of credentials are we offering
    * for SSL/TLS?
    */

Modified: libmicrohttpd/src/include/microhttpd.h
===================================================================
--- libmicrohttpd/src/include/microhttpd.h      2010-07-24 15:24:50 UTC (rev 
12333)
+++ libmicrohttpd/src/include/microhttpd.h      2010-07-25 07:17:26 UTC (rev 
12334)
@@ -418,21 +418,9 @@
   MHD_OPTION_CRED_TYPE = 10,
 
   /**
-   * SSL/TLS protocol version.
-   *
-   * Memory pointer to a zero (MHD_GNUTLS_PROTOCOL_END) terminated
-   * (const) array of 'enum MHD_GNUTLS_Protocol' values representing the
-   * protocol versions to this server should support. Unsupported
-   * requests will be droped by the server.
+   * Memory pointer to a "const char*" specifying the
+   * cipher algorithm (default: "NORMAL").
    */
-  MHD_OPTION_PROTOCOL_VERSION = 11,
-
-  /**
-   * Memory pointer to a zero (MHD_GNUTLS_CIPHER_UNKNOWN)
-   * terminated (const) array of 'enum MHD_GNUTLS_CipherAlgorithm'
-   * representing the cipher priority order to which the HTTPS
-   * daemon should adhere.
-   */
   MHD_OPTION_CIPHER_ALGORITHM = 12,
 
   /**

Modified: libmicrohttpd/src/testcurl/https/Makefile.am
===================================================================
--- libmicrohttpd/src/testcurl/https/Makefile.am        2010-07-24 15:24:50 UTC 
(rev 12333)
+++ libmicrohttpd/src/testcurl/https/Makefile.am        2010-07-25 07:17:26 UTC 
(rev 12334)
@@ -14,6 +14,7 @@
   tls_authentication_test \
   mhds_multi_daemon_test \
   mhds_get_test \
+  mhds_get_test_select \
   mhds_session_info_test \
   tls_thread_mode_test \
   tls_multi_thread_mode_test \
@@ -28,6 +29,7 @@
   tls_daemon_options_test \
   mhds_multi_daemon_test \
   mhds_get_test \
+  mhds_get_test_select \
   mhds_session_info_test \
   tls_thread_mode_test \
   tls_multi_thread_mode_test \
@@ -116,3 +118,12 @@
   $(top_builddir)/src/testcurl/libcurl_version_check.a \
   $(top_builddir)/src/daemon/libmicrohttpd.la \
   @LIBCURL@  
+
+
+mhds_get_test_select_SOURCES = \
+  mhds_get_test_select.c \
+  tls_test_common.c
+mhds_get_test_select_LDADD  = \
+  $(top_builddir)/src/testcurl/libcurl_version_check.a \
+  $(top_builddir)/src/daemon/libmicrohttpd.la \
+  @LIBCURL@  

Modified: libmicrohttpd/src/testcurl/https/mhds_get_test.c
===================================================================
--- libmicrohttpd/src/testcurl/https/mhds_get_test.c    2010-07-24 15:24:50 UTC 
(rev 12333)
+++ libmicrohttpd/src/testcurl/https/mhds_get_test.c    2010-07-25 07:17:26 UTC 
(rev 12334)
@@ -29,6 +29,7 @@
 #include <limits.h>
 #include <sys/stat.h>
 #include <curl/curl.h>
+#include <gcrypt.h>
 #include "tls_test_common.h"
 
 int curl_check_version (const char *req_version, ...);
@@ -89,6 +90,8 @@
   return ret;
 }
 
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+
 int
 main (int argc, char *const *argv)
 {
@@ -96,12 +99,15 @@
   unsigned int errorCount = 0;
 
   /* gnutls_global_set_log_level(11); */
-
   if (curl_check_version (MHD_REQ_CURL_VERSION, MHD_REQ_CURL_OPENSSL_VERSION))
     {
       return -1;
     }
+  gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
 
+  if (!gcry_check_version (GCRYPT_VERSION))
+    abort ();
+
   if ((test_fd = setup_test_file ()) == NULL)
     {
       fprintf (stderr, MHD_E_TEST_FILE_CREAT);

Added: libmicrohttpd/src/testcurl/https/mhds_get_test_select.c
===================================================================
--- libmicrohttpd/src/testcurl/https/mhds_get_test_select.c                     
        (rev 0)
+++ libmicrohttpd/src/testcurl/https/mhds_get_test_select.c     2010-07-25 
07:17:26 UTC (rev 12334)
@@ -0,0 +1,243 @@
+/*
+ This file is part of libmicrohttpd
+ (C) 2007 Christian Grothoff
+
+ libmicrohttpd is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ libmicrohttpd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libmicrohttpd; see the file COPYING.  If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * @file mhds_get_test.c
+ * @brief  Testcase for libmicrohttpd HTTPS GET operations
+ * @author Sagie Amir
+ */
+
+#include "platform.h"
+#include "microhttpd.h"
+#include <limits.h>
+#include <sys/stat.h>
+#include <curl/curl.h>
+#include <gcrypt.h>
+#include "tls_test_common.h"
+
+int curl_check_version (const char *req_version, ...);
+extern const char srv_key_pem[];
+extern const char srv_self_signed_cert_pem[];
+extern const char srv_signed_cert_pem[];
+extern const char srv_signed_key_pem[];
+
+static int oneone;
+
+static int
+ahc_echo (void *cls,
+          struct MHD_Connection *connection,
+          const char *url,
+          const char *method,
+          const char *version,
+          const char *upload_data, size_t *upload_data_size,
+          void **unused)
+{
+  static int ptr;
+  const char *me = cls;
+  struct MHD_Response *response;
+  int ret;
+
+  if (0 != strcmp (me, method))
+    return MHD_NO;              /* unexpected method */
+  if (&ptr != *unused)
+    {
+      *unused = &ptr;
+      fprintf (stderr, "received %s\n", method);
+      return MHD_YES;
+    }
+  *unused = NULL;
+  response = MHD_create_response_from_data (strlen (url),
+                                            (void *) url, MHD_NO, MHD_YES);
+  ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
+  fprintf (stderr, "sending reply\n");
+  MHD_destroy_response (response);
+  if (ret == MHD_NO)
+    abort ();
+  return ret;
+}
+
+static int
+testExternalGet ()
+{
+  struct MHD_Daemon *d;
+  CURL *c;
+  char buf[2048];
+  struct CBC cbc;
+  CURLM *multi;
+  CURLMcode mret;
+  fd_set rs;
+  fd_set ws;
+  fd_set es;
+  int max;
+  int running;
+  struct CURLMsg *msg;
+  time_t start;
+  struct timeval tv;
+
+  multi = NULL;
+  cbc.buf = buf;
+  cbc.size = 2048;
+  cbc.pos = 0;
+  d = MHD_start_daemon (MHD_USE_DEBUG | MHD_USE_SSL,
+                        1082, NULL, NULL, &ahc_echo, "GET", 
+                        MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
+                        MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
+                       MHD_OPTION_END);
+  if (d == NULL)
+    return 256;
+  c = curl_easy_init ();
+  curl_easy_setopt (c, CURLOPT_URL, "https://localhost:1082/hello_world";);
+  curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer);
+  curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc);
+  curl_easy_setopt (c, CURLOPT_SSL_VERIFYPEER, 0);
+  curl_easy_setopt (c, CURLOPT_SSL_VERIFYHOST, 0);
+  curl_easy_setopt (c, CURLOPT_FAILONERROR, 1);
+  if (oneone)
+    curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+  else
+    curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
+  curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L);
+  curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L);
+  /* NOTE: use of CONNECTTIMEOUT without also
+     setting NOSIGNAL results in really weird
+     crashes on my system! */
+  curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1);
+
+
+  multi = curl_multi_init ();
+  if (multi == NULL)
+    {
+      curl_easy_cleanup (c);
+      MHD_stop_daemon (d);
+      return 512;
+    }
+  mret = curl_multi_add_handle (multi, c);
+  if (mret != CURLM_OK)
+    {
+      curl_multi_cleanup (multi);
+      curl_easy_cleanup (c);
+      MHD_stop_daemon (d);
+      return 1024;
+    }
+  start = time (NULL);
+  while ((time (NULL) - start < 5) && (multi != NULL))
+    {
+      max = 0;
+      FD_ZERO (&rs);
+      FD_ZERO (&ws);
+      FD_ZERO (&es);
+      curl_multi_perform (multi, &running);
+      mret = curl_multi_fdset (multi, &rs, &ws, &es, &max);
+      if (mret != CURLM_OK)
+        {
+          curl_multi_remove_handle (multi, c);
+          curl_multi_cleanup (multi);
+          curl_easy_cleanup (c);
+          MHD_stop_daemon (d);
+          return 2048;
+        }
+      if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max))
+        {
+          curl_multi_remove_handle (multi, c);
+          curl_multi_cleanup (multi);
+          curl_easy_cleanup (c);
+          MHD_stop_daemon (d);
+          return 4096;
+        }
+      tv.tv_sec = 0;
+      tv.tv_usec = 1000;
+      select (max + 1, &rs, &ws, &es, &tv);
+      curl_multi_perform (multi, &running);
+      if (running == 0)
+        {
+          msg = curl_multi_info_read (multi, &running);
+          if (msg == NULL)
+            break;
+          if (msg->msg == CURLMSG_DONE)
+            {
+              if (msg->data.result != CURLE_OK)
+                printf ("%s failed at %s:%d: `%s'\n",
+                        "curl_multi_perform",
+                        __FILE__,
+                        __LINE__, curl_easy_strerror (msg->data.result));
+              curl_multi_remove_handle (multi, c);
+              curl_multi_cleanup (multi);
+              curl_easy_cleanup (c);
+              c = NULL;
+              multi = NULL;
+            }
+        }
+      MHD_run (d);
+    }
+  if (multi != NULL)
+    {
+      curl_multi_remove_handle (multi, c);
+      curl_easy_cleanup (c);
+      curl_multi_cleanup (multi);
+    }
+  MHD_stop_daemon (d);
+  if (cbc.pos != strlen ("/hello_world"))
+    return 8192;
+  if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world")))
+    return 16384;
+  return 0;
+}
+
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+
+int
+main (int argc, char *const *argv)
+{
+  FILE *test_fd;
+  unsigned int errorCount = 0;
+
+  /* gnutls_global_set_log_level(11); */
+  if (curl_check_version (MHD_REQ_CURL_VERSION, MHD_REQ_CURL_OPENSSL_VERSION))
+    {
+      return -1;
+    }
+  gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+
+  if (!gcry_check_version (GCRYPT_VERSION))
+    abort ();
+
+  if ((test_fd = setup_test_file ()) == NULL)
+    {
+      fprintf (stderr, MHD_E_TEST_FILE_CREAT);
+      return -1;
+    }
+
+  if (0 != curl_global_init (CURL_GLOBAL_ALL))
+    {
+      fprintf (stderr, "Error: %s\n", strerror (errno));
+      fclose (test_fd);
+      return -1;
+    }
+
+  if (0 != (errorCount = testExternalGet ()))
+    fprintf (stderr, "Fail: %d\n", errorCount);
+
+
+  curl_global_cleanup ();
+  fclose (test_fd);
+  remove (TEST_FILE_NAME);
+
+  return errorCount != 0;
+}

Modified: libmicrohttpd/src/testcurl/https/tls_daemon_options_test.c
===================================================================
--- libmicrohttpd/src/testcurl/https/tls_daemon_options_test.c  2010-07-24 
15:24:50 UTC (rev 12333)
+++ libmicrohttpd/src/testcurl/https/tls_daemon_options_test.c  2010-07-25 
07:17:26 UTC (rev 12334)
@@ -104,12 +104,6 @@
       return -1;
     }
 
-  int p_ssl3[] = { GNUTLS_SSL3, 0 };
-  int p_tls[] = { GNUTLS_TLS1_2,
-    GNUTLS_TLS1_1,
-    GNUTLS_TLS1_0, 0
-  };
-
   struct CipherDef ciphers[] = {
     {{GNUTLS_CIPHER_AES_128_CBC, 0}, "AES128-SHA"},
     {{GNUTLS_CIPHER_ARCFOUR_128, 0}, "RC4-SHA"},
@@ -129,8 +123,7 @@
                    CURL_SSLVERSION_TLSv1,
                    MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
                    MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
-                   MHD_OPTION_PROTOCOL_VERSION, p_tls,
-                   MHD_OPTION_CIPHER_ALGORITHM, ciphers[cpos].options,
+                   MHD_OPTION_CIPHER_ALGORITHM, "NORMAL",
                    MHD_OPTION_END);
       cpos++;
     }
@@ -146,8 +139,7 @@
                    CURL_SSLVERSION_SSLv3,
                    MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
                    MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
-                   MHD_OPTION_PROTOCOL_VERSION, p_ssl3,
-                   MHD_OPTION_CIPHER_ALGORITHM, ciphers[cpos].options,
+                   MHD_OPTION_CIPHER_ALGORITHM, "NORMAL",
                    MHD_OPTION_END);
       cpos++;
     }
@@ -164,14 +156,14 @@
                test_fd, daemon_flags, "AES256-SHA", CURL_SSLVERSION_TLSv1,
                MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
                MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
-               MHD_OPTION_PROTOCOL_VERSION, p_ssl3, MHD_OPTION_END);
+               MHD_OPTION_CIPHER_ALGORITHM, "SSL3", MHD_OPTION_END);
 #endif
   errorCount +=
     test_wrap ("unmatching version: TLS vs. SSL3", 
&test_unmatching_ssl_version,
                test_fd, daemon_flags, "AES256-SHA", CURL_SSLVERSION_SSLv3,
                MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
                MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
-               MHD_OPTION_PROTOCOL_VERSION, p_tls, MHD_OPTION_END);
+               MHD_OPTION_CIPHER_ALGORITHM, "SSL3", MHD_OPTION_END);
   curl_global_cleanup ();
   fclose (test_fd);
   remove (TEST_FILE_NAME);

Modified: libmicrohttpd/src/testcurl/https/tls_thread_mode_test.c
===================================================================
--- libmicrohttpd/src/testcurl/https/tls_thread_mode_test.c     2010-07-24 
15:24:50 UTC (rev 12333)
+++ libmicrohttpd/src/testcurl/https/tls_thread_mode_test.c     2010-07-25 
07:17:26 UTC (rev 12334)
@@ -32,6 +32,7 @@
 #include <sys/stat.h>
 #include <limits.h>
 #include <curl/curl.h>
+#include <gcrypt.h>
 #include "tls_test_common.h"
 
 extern const char srv_key_pem[];
@@ -119,6 +120,8 @@
   return 0;
 }
 
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+
 int
 main (int argc, char *const *argv)
 {
@@ -128,7 +131,7 @@
   /* initialize random seed used by curl clients */
   unsigned int iseed = (unsigned int) time (NULL);
   srand (iseed);
-
+  gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
   if (curl_check_version (MHD_REQ_CURL_VERSION))
     return -1;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]