aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r--src/microhttpd/daemon.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 39ea3e85..dd2234fd 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -796,6 +796,7 @@ MHD_handle_connection (void *data)
796 struct pollfd p[1]; 796 struct pollfd p[1];
797#endif 797#endif
798 798
799
799 timeout = con->daemon->connection_timeout; 800 timeout = con->daemon->connection_timeout;
800 while ( (MHD_YES != con->daemon->shutdown) && 801 while ( (MHD_YES != con->daemon->shutdown) &&
801 (MHD_CONNECTION_CLOSED != con->state) ) 802 (MHD_CONNECTION_CLOSED != con->state) )
@@ -958,6 +959,13 @@ exit:
958 MHD_destroy_response (con->response); 959 MHD_destroy_response (con->response);
959 con->response = NULL; 960 con->response = NULL;
960 } 961 }
962
963 if (NULL != con->daemon->notify_connection)
964 con->daemon->notify_connection (con->daemon->notify_connection_cls,
965 con,
966 &con->socket_context,
967 MHD_CONNECTION_NOTIFY_CLOSED);
968
961 return (MHD_THRD_RTRN_TYPE_)0; 969 return (MHD_THRD_RTRN_TYPE_)0;
962} 970}
963 971
@@ -1301,7 +1309,9 @@ internal_add_connection (struct MHD_Daemon *daemon,
1301 errno = eno; 1309 errno = eno;
1302 return MHD_NO; 1310 return MHD_NO;
1303 } 1311 }
1304 memset (connection, 0, sizeof (struct MHD_Connection)); 1312 memset (connection,
1313 0,
1314 sizeof (struct MHD_Connection));
1305 connection->pool = MHD_pool_create (daemon->pool_size); 1315 connection->pool = MHD_pool_create (daemon->pool_size);
1306 if (NULL == connection->pool) 1316 if (NULL == connection->pool)
1307 { 1317 {
@@ -1445,11 +1455,19 @@ internal_add_connection (struct MHD_Daemon *daemon,
1445 (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) ) 1455 (MHD_YES != MHD_mutex_unlock_ (&daemon->cleanup_connection_mutex)) )
1446 MHD_PANIC ("Failed to release cleanup mutex\n"); 1456 MHD_PANIC ("Failed to release cleanup mutex\n");
1447 1457
1458 if (NULL != daemon->notify_connection)
1459 daemon->notify_connection (daemon->notify_connection_cls,
1460 connection,
1461 &connection->socket_context,
1462 MHD_CONNECTION_NOTIFY_STARTED);
1463
1448 /* attempt to create handler thread */ 1464 /* attempt to create handler thread */
1449 if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) 1465 if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
1450 { 1466 {
1451 res_thread_create = create_thread (&connection->pid, daemon, 1467 res_thread_create = create_thread (&connection->pid,
1452 &MHD_handle_connection, connection); 1468 daemon,
1469 &MHD_handle_connection,
1470 connection);
1453 if (0 != res_thread_create) 1471 if (0 != res_thread_create)
1454 { 1472 {
1455 eno = errno; 1473 eno = errno;
@@ -1508,6 +1526,11 @@ internal_add_connection (struct MHD_Daemon *daemon,
1508 daemon->connections++; 1526 daemon->connections++;
1509 return MHD_YES; 1527 return MHD_YES;
1510 cleanup: 1528 cleanup:
1529 if (NULL != daemon->notify_connection)
1530 daemon->notify_connection (daemon->notify_connection_cls,
1531 connection,
1532 &connection->socket_context,
1533 MHD_CONNECTION_NOTIFY_CLOSED);
1511 if (0 != MHD_socket_close_ (client_socket)) 1534 if (0 != MHD_socket_close_ (client_socket))
1512 MHD_PANIC ("close failed\n"); 1535 MHD_PANIC ("close failed\n");
1513 MHD_ip_limit_del (daemon, addr, addrlen); 1536 MHD_ip_limit_del (daemon, addr, addrlen);
@@ -1921,12 +1944,15 @@ MHD_cleanup_connections (struct MHD_Daemon *daemon)
1921 } 1944 }
1922 MHD_pool_destroy (pos->pool); 1945 MHD_pool_destroy (pos->pool);
1923#if HTTPS_SUPPORT 1946#if HTTPS_SUPPORT
1924 if (pos->tls_session != NULL) 1947 if (NULL != pos->tls_session)
1925 gnutls_deinit (pos->tls_session); 1948 gnutls_deinit (pos->tls_session);
1926#endif 1949#endif
1927 MHD_ip_limit_del (daemon, 1950 if (NULL != daemon->notify_connection)
1928 (struct sockaddr *) pos->addr, 1951 daemon->notify_connection (daemon->notify_connection_cls,
1929 pos->addr_len); 1952 pos,
1953 &pos->socket_context,
1954 MHD_CONNECTION_NOTIFY_CLOSED);
1955 MHD_ip_limit_del (daemon, pos->addr, pos->addr_len);
1930#if EPOLL_SUPPORT 1956#if EPOLL_SUPPORT
1931 if (0 != (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL)) 1957 if (0 != (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL))
1932 { 1958 {
@@ -2993,6 +3019,11 @@ parse_options_va (struct MHD_Daemon *daemon,
2993 va_arg (ap, MHD_RequestCompletedCallback); 3019 va_arg (ap, MHD_RequestCompletedCallback);
2994 daemon->notify_completed_cls = va_arg (ap, void *); 3020 daemon->notify_completed_cls = va_arg (ap, void *);
2995 break; 3021 break;
3022 case MHD_OPTION_NOTIFY_CONNECTION:
3023 daemon->notify_connection =
3024 va_arg (ap, MHD_NotifyConnectionCallback);
3025 daemon->notify_connection_cls = va_arg (ap, void *);
3026 break;
2996 case MHD_OPTION_PER_IP_CONNECTION_LIMIT: 3027 case MHD_OPTION_PER_IP_CONNECTION_LIMIT:
2997 daemon->per_ip_connection_limit = va_arg (ap, unsigned int); 3028 daemon->per_ip_connection_limit = va_arg (ap, unsigned int);
2998 break; 3029 break;
@@ -3234,6 +3265,7 @@ parse_options_va (struct MHD_Daemon *daemon,
3234 break; 3265 break;
3235 /* all options taking two pointers */ 3266 /* all options taking two pointers */
3236 case MHD_OPTION_NOTIFY_COMPLETED: 3267 case MHD_OPTION_NOTIFY_COMPLETED:
3268 case MHD_OPTION_NOTIFY_CONNECTION:
3237 case MHD_OPTION_URI_LOG_CALLBACK: 3269 case MHD_OPTION_URI_LOG_CALLBACK:
3238 case MHD_OPTION_EXTERNAL_LOGGER: 3270 case MHD_OPTION_EXTERNAL_LOGGER:
3239 case MHD_OPTION_UNESCAPE_CALLBACK: 3271 case MHD_OPTION_UNESCAPE_CALLBACK: