/** * This function handles a particular SSL/TLS connection when * it has been determined that there is data to be read off a * socket. Message processing is done by message type which is * determined by peeking into the first message type byte of the * stream. * * Error message handling: all fatal level messages cause the * connection to be terminated. * * Application data is forwarded to the underlying daemon for * processing. * * @param connection : the source connection * @return MHD_YES if we should continue to process the * connection (not dead yet), MHD_NO if it died */ static int MHD_tls_connection_handle_read (struct MHD_Connection *connection) { int ret; connection->last_activity = time (NULL); 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, "Error: received handshake message out of context\n"); #endif MHD_tls_connection_close (connection, MHD_REQUEST_TERMINATED_WITH_ERROR); return MHD_NO; } return MHD_connection_handle_read (connection); }
/** * This function handles a particular SSL/TLS connection when * it has been determined that there is data to be read off a * socket. Message processing is done by message type which is * determined by peeking into the first message type byte of the * stream. * * Error message handling: all fatal level messages cause the * connection to be terminated. * * Application data is forwarded to the underlying daemon for * processing. * * @param connection the source connection * @return always #MHD_YES (we should continue to process the connection) */ static int MHD_tls_connection_handle_read (struct MHD_Connection *connection) { if (MHD_YES == run_tls_handshake (connection)) return MHD_YES; return MHD_connection_handle_read (connection); }