diff options
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r-- | src/microhttpd/daemon.c | 46 |
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: |