diff options
author | Christian Grothoff <christian@grothoff.org> | 2009-03-19 04:49:16 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2009-03-19 04:49:16 +0000 |
commit | c8a1be0f871921a9dd5a55caa982ff3e0762d3bd (patch) | |
tree | f29e60fe7042c40ac059c93cb9dd40730875d733 | |
parent | 2ef99ee6e9f1b5515254bbdc75357b8832b977d7 (diff) | |
download | libmicrohttpd-c8a1be0f871921a9dd5a55caa982ff3e0762d3bd.tar.gz libmicrohttpd-c8a1be0f871921a9dd5a55caa982ff3e0762d3bd.zip |
release
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | README | 6 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | doc/Doxyfile | 2 | ||||
-rw-r--r-- | src/daemon/daemon.c | 11 | ||||
-rw-r--r-- | src/daemon/https/tls/gnutls_buffers.c | 75 | ||||
-rw-r--r-- | src/daemon/internal.h | 2 | ||||
-rw-r--r-- | src/testcurl/https/tls_extension_test.c | 6 |
8 files changed, 41 insertions, 71 deletions
@@ -1,3 +1,9 @@ | |||
1 | Wed Mar 18 17:46:58 MDT 2009 | ||
2 | Always RECV/SEND with MSG_DONTWAIT to (possibly) address | ||
3 | strange deadlock reported by Erik on the mailinglist --- | ||
4 | and/or issues with blocking read after select on GNU/Linux | ||
5 | (see select man page under bugs). -CG | ||
6 | |||
1 | Tue Mar 17 01:19:50 MDT 2009 | 7 | Tue Mar 17 01:19:50 MDT 2009 |
2 | Added support for thread-pools. -CG/RA | 8 | Added support for thread-pools. -CG/RA |
3 | 9 | ||
@@ -73,7 +73,11 @@ reasonably complete. | |||
73 | 73 | ||
74 | Missing features: | 74 | Missing features: |
75 | ================= | 75 | ================= |
76 | - MHD_get_daemon_info is not implemented | 76 | - MHD_get_daemon_info is not implemented (always returns NULL) |
77 | - SSL support does not work with SELECT-based threading modes | ||
78 | (issue is that the gnutls state machine does not like EAGAIN/EINTR | ||
79 | return values from send/recv, despite having tons of | ||
80 | branches on those values). | ||
77 | - SSL code is still too large: | 81 | - SSL code is still too large: |
78 | * libgcrypt is used, and is also bloated | 82 | * libgcrypt is used, and is also bloated |
79 | => integrate required portions of libgcrypt into our tree | 83 | => integrate required portions of libgcrypt into our tree |
diff --git a/configure.ac b/configure.ac index 27b19066..2cc7254f 100644 --- a/configure.ac +++ b/configure.ac | |||
@@ -21,8 +21,8 @@ | |||
21 | # | 21 | # |
22 | # | 22 | # |
23 | AC_PREREQ(2.57) | 23 | AC_PREREQ(2.57) |
24 | AC_INIT([libmicrohttpd], [0.4.0a],[libmicrohttpd@gnunet.org]) | 24 | AC_INIT([libmicrohttpd], [0.4.1],[libmicrohttpd@gnunet.org]) |
25 | AM_INIT_AUTOMAKE([libmicrohttpd], [0.4.0a]) | 25 | AM_INIT_AUTOMAKE([libmicrohttpd], [0.4.1]) |
26 | AM_CONFIG_HEADER([MHD_config.h]) | 26 | AM_CONFIG_HEADER([MHD_config.h]) |
27 | AC_CONFIG_MACRO_DIR([m4]) | 27 | AC_CONFIG_MACRO_DIR([m4]) |
28 | AH_TOP([#define _GNU_SOURCE 1]) | 28 | AH_TOP([#define _GNU_SOURCE 1]) |
diff --git a/doc/Doxyfile b/doc/Doxyfile index 22cfbe9c..727e7169 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile | |||
@@ -5,7 +5,7 @@ | |||
5 | #--------------------------------------------------------------------------- | 5 | #--------------------------------------------------------------------------- |
6 | DOXYFILE_ENCODING = UTF-8 | 6 | DOXYFILE_ENCODING = UTF-8 |
7 | PROJECT_NAME = "GNU libmicrohttpd" | 7 | PROJECT_NAME = "GNU libmicrohttpd" |
8 | PROJECT_NUMBER = 0.4.0 | 8 | PROJECT_NUMBER = 0.4.1 |
9 | OUTPUT_DIRECTORY = doc/doxygen/ | 9 | OUTPUT_DIRECTORY = doc/doxygen/ |
10 | CREATE_SUBDIRS = YES | 10 | CREATE_SUBDIRS = YES |
11 | OUTPUT_LANGUAGE = English | 11 | OUTPUT_LANGUAGE = English |
diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c index 7b3ff20c..67fe978a 100644 --- a/src/daemon/daemon.c +++ b/src/daemon/daemon.c | |||
@@ -522,7 +522,10 @@ recv_param_adapter (struct MHD_Connection *connection, void *other, size_t i) | |||
522 | { | 522 | { |
523 | if (connection->socket_fd == -1) | 523 | if (connection->socket_fd == -1) |
524 | return -1; | 524 | return -1; |
525 | return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL); | 525 | if (0 != (connection->daemon->options & MHD_USE_SSL)) |
526 | return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL); | ||
527 | else | ||
528 | return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL | MSG_DONTWAIT); | ||
526 | } | 529 | } |
527 | 530 | ||
528 | /** | 531 | /** |
@@ -539,7 +542,10 @@ send_param_adapter (struct MHD_Connection *connection, | |||
539 | { | 542 | { |
540 | if (connection->socket_fd == -1) | 543 | if (connection->socket_fd == -1) |
541 | return -1; | 544 | return -1; |
542 | return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL); | 545 | if (0 != (connection->daemon->options & MHD_USE_SSL)) |
546 | return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL); | ||
547 | else | ||
548 | return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL | MSG_DONTWAIT); | ||
543 | } | 549 | } |
544 | 550 | ||
545 | /** | 551 | /** |
@@ -991,6 +997,7 @@ MHD_start_daemon (unsigned int options, | |||
991 | return ret; | 997 | return ret; |
992 | } | 998 | } |
993 | 999 | ||
1000 | |||
994 | /** | 1001 | /** |
995 | * Start a webserver on the given port. | 1002 | * Start a webserver on the given port. |
996 | * | 1003 | * |
diff --git a/src/daemon/https/tls/gnutls_buffers.c b/src/daemon/https/tls/gnutls_buffers.c index fa41f28e..c687cb23 100644 --- a/src/daemon/https/tls/gnutls_buffers.c +++ b/src/daemon/https/tls/gnutls_buffers.c | |||
@@ -222,7 +222,6 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr, | |||
222 | size_t left; | 222 | size_t left; |
223 | ssize_t i = 0; | 223 | ssize_t i = 0; |
224 | char *ptr = iptr; | 224 | char *ptr = iptr; |
225 | unsigned j, x, sum = 0; | ||
226 | MHD_gnutls_transport_ptr_t fd = session->internals.transport_recv_ptr; | 225 | MHD_gnutls_transport_ptr_t fd = session->internals.transport_recv_ptr; |
227 | 226 | ||
228 | session->internals.direction = 0; | 227 | session->internals.direction = 0; |
@@ -259,31 +258,18 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr, | |||
259 | #endif | 258 | #endif |
260 | } | 259 | } |
261 | else | 260 | else |
262 | i = session->internals.MHD__gnutls_pull_func (fd, | 261 | i = session->internals.MHD__gnutls_pull_func (fd, |
263 | &ptr[sizeOfPtr - left], | 262 | &ptr[sizeOfPtr - left], |
264 | left); | 263 | left); |
265 | |||
266 | if (i < 0) | 264 | if (i < 0) |
267 | { | 265 | { |
268 | int err = session->internals.errnum ? session->internals.errnum | 266 | int err = session->internals.errnum ? session->internals.errnum |
269 | : errno; | 267 | : errno; |
270 | 268 | if ( (err == EAGAIN) || (err == EINTR) ) | |
271 | MHD__gnutls_read_log | ||
272 | ("READ: %d returned from %d, errno=%d gerrno=%d\n", i, fd, errno, | ||
273 | session->internals.errnum); | ||
274 | |||
275 | if (err == EAGAIN || err == EINTR) | ||
276 | { | 269 | { |
277 | if (sizeOfPtr - left > 0) | 270 | if (sizeOfPtr - left > 0) |
278 | { | 271 | goto finish; |
279 | 272 | MHD_gnutls_assert (); | |
280 | MHD__gnutls_read_log ("READ: returning %d bytes from %d\n", | ||
281 | sizeOfPtr - left, fd); | ||
282 | |||
283 | goto finish; | ||
284 | } | ||
285 | MHD_gnutls_assert (); | ||
286 | |||
287 | if (err == EAGAIN) | 273 | if (err == EAGAIN) |
288 | return GNUTLS_E_AGAIN; | 274 | return GNUTLS_E_AGAIN; |
289 | return GNUTLS_E_INTERRUPTED; | 275 | return GNUTLS_E_INTERRUPTED; |
@@ -296,46 +282,13 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr, | |||
296 | } | 282 | } |
297 | else | 283 | else |
298 | { | 284 | { |
299 | |||
300 | MHD__gnutls_read_log ("READ: Got %d bytes from %d\n", i, fd); | ||
301 | |||
302 | if (i == 0) | 285 | if (i == 0) |
303 | break; /* EOF */ | 286 | break; /* EOF */ |
304 | } | 287 | } |
305 | |||
306 | left -= i; | 288 | left -= i; |
307 | |||
308 | } | 289 | } |
309 | 290 | ||
310 | finish: | 291 | finish: |
311 | |||
312 | if (MHD__gnutls_log_level >= 7) | ||
313 | { | ||
314 | char line[128]; | ||
315 | char tmp[16]; | ||
316 | |||
317 | MHD__gnutls_read_log ("READ: read %d bytes from %d\n", | ||
318 | (sizeOfPtr - left), fd); | ||
319 | |||
320 | for (x = 0; x < ((sizeOfPtr - left) / 16) + 1; x++) | ||
321 | { | ||
322 | line[0] = 0; | ||
323 | |||
324 | sprintf (tmp, "%.4x - ", x); | ||
325 | MHD_gtls_str_cat (line, sizeof (line), tmp); | ||
326 | |||
327 | for (j = 0; j < 16; j++) | ||
328 | { | ||
329 | if (sum < (sizeOfPtr - left)) | ||
330 | { | ||
331 | sprintf (tmp, "%.2x ", ((unsigned char *) ptr)[sum++]); | ||
332 | MHD_gtls_str_cat (line, sizeof (line), tmp); | ||
333 | } | ||
334 | } | ||
335 | MHD__gnutls_read_log ("%s\n", line); | ||
336 | } | ||
337 | } | ||
338 | |||
339 | return (sizeOfPtr - left); | 292 | return (sizeOfPtr - left); |
340 | } | 293 | } |
341 | 294 | ||
@@ -368,8 +321,9 @@ MHD_gtls_io_clear_peeked_data (MHD_gtls_session_t session) | |||
368 | if (ret > 0) | 321 | if (ret > 0) |
369 | sum += ret; | 322 | sum += ret; |
370 | } | 323 | } |
371 | while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN || sum | 324 | while ( (ret == GNUTLS_E_INTERRUPTED) || |
372 | < RCVLOWAT); | 325 | (ret == GNUTLS_E_AGAIN) || |
326 | (sum < RCVLOWAT) ); | ||
373 | 327 | ||
374 | MHD_gnutls_afree (peekdata); | 328 | MHD_gnutls_afree (peekdata); |
375 | 329 | ||
@@ -721,15 +675,13 @@ MHD_gtls_io_write_buffered (MHD_gtls_session_t session, | |||
721 | #endif | 675 | #endif |
722 | } | 676 | } |
723 | else | 677 | else |
724 | i = | 678 | i = session->internals.MHD__gnutls_push_func (fd, &ptr[n - left], left); |
725 | session->internals.MHD__gnutls_push_func (fd, &ptr[n - left], left); | ||
726 | |||
727 | if (i == -1) | 679 | if (i == -1) |
728 | { | 680 | { |
729 | int err = session->internals.errnum ? session->internals.errnum | 681 | int err = session->internals.errnum ? session->internals.errnum |
730 | : errno; | 682 | : errno; |
731 | 683 | ||
732 | if (err == EAGAIN || err == EINTR) | 684 | if ( (err == EAGAIN) || (err == EINTR) ) |
733 | { | 685 | { |
734 | session->internals.record_send_buffer_prev_size += n - left; | 686 | session->internals.record_send_buffer_prev_size += n - left; |
735 | 687 | ||
@@ -742,11 +694,6 @@ MHD_gtls_io_write_buffered (MHD_gtls_session_t session, | |||
742 | MHD_gnutls_assert (); | 694 | MHD_gnutls_assert (); |
743 | return retval; | 695 | return retval; |
744 | } | 696 | } |
745 | |||
746 | MHD__gnutls_write_log | ||
747 | ("WRITE: Interrupted. Stored %d bytes to buffer. Already sent %d bytes.\n", | ||
748 | left, n - left); | ||
749 | |||
750 | if (err == EAGAIN) | 697 | if (err == EAGAIN) |
751 | return GNUTLS_E_AGAIN; | 698 | return GNUTLS_E_AGAIN; |
752 | return GNUTLS_E_INTERRUPTED; | 699 | return GNUTLS_E_INTERRUPTED; |
diff --git a/src/daemon/internal.h b/src/daemon/internal.h index 7b4a0e72..3af7b016 100644 --- a/src/daemon/internal.h +++ b/src/daemon/internal.h | |||
@@ -309,7 +309,7 @@ enum MHD_CONNECTION_STATE | |||
309 | 309 | ||
310 | MHD_TLS_HANDSHAKE_FAILED, | 310 | MHD_TLS_HANDSHAKE_FAILED, |
311 | 311 | ||
312 | MHD_TLS_HANDSHAKE_COMPLETE, | 312 | MHD_TLS_HANDSHAKE_COMPLETE |
313 | 313 | ||
314 | }; | 314 | }; |
315 | 315 | ||
diff --git a/src/testcurl/https/tls_extension_test.c b/src/testcurl/https/tls_extension_test.c index 31b57e55..062dec93 100644 --- a/src/testcurl/https/tls_extension_test.c +++ b/src/testcurl/https/tls_extension_test.c | |||
@@ -243,6 +243,11 @@ main (int argc, char *const *argv) | |||
243 | } | 243 | } |
244 | 244 | ||
245 | i = 0; | 245 | i = 0; |
246 | setup_session (&session, &key, &cert, &xcred); | ||
247 | errorCount += test_hello_extension (session, ext_arr[i], 1, 16); | ||
248 | teardown_session (session, &key, &cert, xcred); | ||
249 | #if 0 | ||
250 | i = 0; | ||
246 | while (ext_arr[i] != -1) | 251 | while (ext_arr[i] != -1) |
247 | { | 252 | { |
248 | setup_session (&session, &key, &cert, &xcred); | 253 | setup_session (&session, &key, &cert, &xcred); |
@@ -259,6 +264,7 @@ main (int argc, char *const *argv) | |||
259 | teardown_session (session, &key, &cert, xcred); | 264 | teardown_session (session, &key, &cert, xcred); |
260 | i++; | 265 | i++; |
261 | } | 266 | } |
267 | #endif | ||
262 | 268 | ||
263 | print_test_result (errorCount, argv[0]); | 269 | print_test_result (errorCount, argv[0]); |
264 | 270 | ||