This commit is contained in:
Christian Grothoff
2009-03-19 04:49:16 +00:00
parent 2ef99ee6e9
commit c8a1be0f87
8 changed files with 41 additions and 71 deletions
+6
View File
@@ -1,3 +1,9 @@
Wed Mar 18 17:46:58 MDT 2009
Always RECV/SEND with MSG_DONTWAIT to (possibly) address
strange deadlock reported by Erik on the mailinglist ---
and/or issues with blocking read after select on GNU/Linux
(see select man page under bugs). -CG
Tue Mar 17 01:19:50 MDT 2009 Tue Mar 17 01:19:50 MDT 2009
Added support for thread-pools. -CG/RA Added support for thread-pools. -CG/RA
+5 -1
View File
@@ -73,7 +73,11 @@ reasonably complete.
Missing features: Missing features:
================= =================
- MHD_get_daemon_info is not implemented - MHD_get_daemon_info is not implemented (always returns NULL)
- SSL support does not work with SELECT-based threading modes
(issue is that the gnutls state machine does not like EAGAIN/EINTR
return values from send/recv, despite having tons of
branches on those values).
- SSL code is still too large: - SSL code is still too large:
* libgcrypt is used, and is also bloated * libgcrypt is used, and is also bloated
=> integrate required portions of libgcrypt into our tree => integrate required portions of libgcrypt into our tree
+2 -2
View File
@@ -21,8 +21,8 @@
# #
# #
AC_PREREQ(2.57) AC_PREREQ(2.57)
AC_INIT([libmicrohttpd], [0.4.0a],[libmicrohttpd@gnunet.org]) AC_INIT([libmicrohttpd], [0.4.1],[libmicrohttpd@gnunet.org])
AM_INIT_AUTOMAKE([libmicrohttpd], [0.4.0a]) AM_INIT_AUTOMAKE([libmicrohttpd], [0.4.1])
AM_CONFIG_HEADER([MHD_config.h]) AM_CONFIG_HEADER([MHD_config.h])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AH_TOP([#define _GNU_SOURCE 1]) AH_TOP([#define _GNU_SOURCE 1])
+1 -1
View File
@@ -5,7 +5,7 @@
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8 DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "GNU libmicrohttpd" PROJECT_NAME = "GNU libmicrohttpd"
PROJECT_NUMBER = 0.4.0 PROJECT_NUMBER = 0.4.1
OUTPUT_DIRECTORY = doc/doxygen/ OUTPUT_DIRECTORY = doc/doxygen/
CREATE_SUBDIRS = YES CREATE_SUBDIRS = YES
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
+9 -2
View File
@@ -522,7 +522,10 @@ recv_param_adapter (struct MHD_Connection *connection, void *other, size_t i)
{ {
if (connection->socket_fd == -1) if (connection->socket_fd == -1)
return -1; return -1;
return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL); if (0 != (connection->daemon->options & MHD_USE_SSL))
return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL);
else
return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL | MSG_DONTWAIT);
} }
/** /**
@@ -539,7 +542,10 @@ send_param_adapter (struct MHD_Connection *connection,
{ {
if (connection->socket_fd == -1) if (connection->socket_fd == -1)
return -1; return -1;
return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL); if (0 != (connection->daemon->options & MHD_USE_SSL))
return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL);
else
return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL | MSG_DONTWAIT);
} }
/** /**
@@ -991,6 +997,7 @@ MHD_start_daemon (unsigned int options,
return ret; return ret;
} }
/** /**
* Start a webserver on the given port. * Start a webserver on the given port.
* *
+11 -64
View File
@@ -222,7 +222,6 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr,
size_t left; size_t left;
ssize_t i = 0; ssize_t i = 0;
char *ptr = iptr; char *ptr = iptr;
unsigned j, x, sum = 0;
MHD_gnutls_transport_ptr_t fd = session->internals.transport_recv_ptr; MHD_gnutls_transport_ptr_t fd = session->internals.transport_recv_ptr;
session->internals.direction = 0; session->internals.direction = 0;
@@ -259,31 +258,18 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr,
#endif #endif
} }
else else
i = session->internals.MHD__gnutls_pull_func (fd, i = session->internals.MHD__gnutls_pull_func (fd,
&ptr[sizeOfPtr - left], &ptr[sizeOfPtr - left],
left); left);
if (i < 0) if (i < 0)
{ {
int err = session->internals.errnum ? session->internals.errnum int err = session->internals.errnum ? session->internals.errnum
: errno; : errno;
if ( (err == EAGAIN) || (err == EINTR) )
MHD__gnutls_read_log
("READ: %d returned from %d, errno=%d gerrno=%d\n", i, fd, errno,
session->internals.errnum);
if (err == EAGAIN || err == EINTR)
{ {
if (sizeOfPtr - left > 0) if (sizeOfPtr - left > 0)
{ goto finish;
MHD_gnutls_assert ();
MHD__gnutls_read_log ("READ: returning %d bytes from %d\n",
sizeOfPtr - left, fd);
goto finish;
}
MHD_gnutls_assert ();
if (err == EAGAIN) if (err == EAGAIN)
return GNUTLS_E_AGAIN; return GNUTLS_E_AGAIN;
return GNUTLS_E_INTERRUPTED; return GNUTLS_E_INTERRUPTED;
@@ -296,46 +282,13 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr,
} }
else else
{ {
MHD__gnutls_read_log ("READ: Got %d bytes from %d\n", i, fd);
if (i == 0) if (i == 0)
break; /* EOF */ break; /* EOF */
} }
left -= i; left -= i;
} }
finish: finish:
if (MHD__gnutls_log_level >= 7)
{
char line[128];
char tmp[16];
MHD__gnutls_read_log ("READ: read %d bytes from %d\n",
(sizeOfPtr - left), fd);
for (x = 0; x < ((sizeOfPtr - left) / 16) + 1; x++)
{
line[0] = 0;
sprintf (tmp, "%.4x - ", x);
MHD_gtls_str_cat (line, sizeof (line), tmp);
for (j = 0; j < 16; j++)
{
if (sum < (sizeOfPtr - left))
{
sprintf (tmp, "%.2x ", ((unsigned char *) ptr)[sum++]);
MHD_gtls_str_cat (line, sizeof (line), tmp);
}
}
MHD__gnutls_read_log ("%s\n", line);
}
}
return (sizeOfPtr - left); return (sizeOfPtr - left);
} }
@@ -368,8 +321,9 @@ MHD_gtls_io_clear_peeked_data (MHD_gtls_session_t session)
if (ret > 0) if (ret > 0)
sum += ret; sum += ret;
} }
while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN || sum while ( (ret == GNUTLS_E_INTERRUPTED) ||
< RCVLOWAT); (ret == GNUTLS_E_AGAIN) ||
(sum < RCVLOWAT) );
MHD_gnutls_afree (peekdata); MHD_gnutls_afree (peekdata);
@@ -721,15 +675,13 @@ MHD_gtls_io_write_buffered (MHD_gtls_session_t session,
#endif #endif
} }
else else
i = i = session->internals.MHD__gnutls_push_func (fd, &ptr[n - left], left);
session->internals.MHD__gnutls_push_func (fd, &ptr[n - left], left);
if (i == -1) if (i == -1)
{ {
int err = session->internals.errnum ? session->internals.errnum int err = session->internals.errnum ? session->internals.errnum
: errno; : errno;
if (err == EAGAIN || err == EINTR) if ( (err == EAGAIN) || (err == EINTR) )
{ {
session->internals.record_send_buffer_prev_size += n - left; session->internals.record_send_buffer_prev_size += n - left;
@@ -742,11 +694,6 @@ MHD_gtls_io_write_buffered (MHD_gtls_session_t session,
MHD_gnutls_assert (); MHD_gnutls_assert ();
return retval; return retval;
} }
MHD__gnutls_write_log
("WRITE: Interrupted. Stored %d bytes to buffer. Already sent %d bytes.\n",
left, n - left);
if (err == EAGAIN) if (err == EAGAIN)
return GNUTLS_E_AGAIN; return GNUTLS_E_AGAIN;
return GNUTLS_E_INTERRUPTED; return GNUTLS_E_INTERRUPTED;
+1 -1
View File
@@ -309,7 +309,7 @@ enum MHD_CONNECTION_STATE
MHD_TLS_HANDSHAKE_FAILED, MHD_TLS_HANDSHAKE_FAILED,
MHD_TLS_HANDSHAKE_COMPLETE, MHD_TLS_HANDSHAKE_COMPLETE
}; };
+6
View File
@@ -242,6 +242,11 @@ main (int argc, char *const *argv)
return -1; return -1;
} }
i = 0;
setup_session (&session, &key, &cert, &xcred);
errorCount += test_hello_extension (session, ext_arr[i], 1, 16);
teardown_session (session, &key, &cert, xcred);
#if 0
i = 0; i = 0;
while (ext_arr[i] != -1) while (ext_arr[i] != -1)
{ {
@@ -259,6 +264,7 @@ main (int argc, char *const *argv)
teardown_session (session, &key, &cert, xcred); teardown_session (session, &key, &cert, xcred);
i++; i++;
} }
#endif
print_test_result (errorCount, argv[0]); print_test_result (errorCount, argv[0]);