| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /*
- This file is part of libmicrohttpd
- Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- /**
- * @file lib/connection_finish_forward.c
- * @brief complete upgrade socket forwarding operation in TLS mode
- * @author Christian Grothoff
- */
- #include "internal.h"
- #include "connection_finish_forward.h"
- #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
- /**
- * Stop TLS forwarding on upgraded connection and
- * reflect remote disconnect state to socketpair.
- * @remark In thread-per-connection mode this function
- * can be called from any thread, in other modes this
- * function must be called only from thread that process
- * daemon's select()/poll()/etc.
- *
- * @param connection the upgraded connection
- */
- void
- MHD_connection_finish_forward_ (struct MHD_Connection *connection)
- {
- struct MHD_Daemon *daemon = connection->daemon;
- struct MHD_UpgradeResponseHandle *urh = connection->request.urh;
- if (NULL == daemon->tls_api)
- return; /* Nothing to do with non-TLS connection. */
- if (MHD_TM_THREAD_PER_CONNECTION != daemon->threading_mode)
- DLL_remove (daemon->urh_head,
- daemon->urh_tail,
- urh);
- #if EPOLL_SUPPORT
- if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) &&
- (0 != epoll_ctl (daemon->epoll_upgrade_fd,
- EPOLL_CTL_DEL,
- connection->socket_fd,
- NULL)) )
- {
- MHD_PANIC (_ ("Failed to remove FD from epoll set\n"));
- }
- if (urh->in_eready_list)
- {
- EDLL_remove (daemon->eready_urh_head,
- daemon->eready_urh_tail,
- urh);
- urh->in_eready_list = false;
- }
- #endif /* EPOLL_SUPPORT */
- if (MHD_INVALID_SOCKET != urh->mhd.socket)
- {
- #if EPOLL_SUPPORT
- if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) &&
- (0 != epoll_ctl (daemon->epoll_upgrade_fd,
- EPOLL_CTL_DEL,
- urh->mhd.socket,
- NULL)) )
- {
- MHD_PANIC (_ ("Failed to remove FD from epoll set\n"));
- }
- #endif /* EPOLL_SUPPORT */
- /* Reflect remote disconnect to application by breaking
- * socketpair connection. */
- shutdown (urh->mhd.socket,
- SHUT_RDWR);
- }
- /* Socketpair sockets will remain open as they will be
- * used with MHD_UPGRADE_ACTION_CLOSE. They will be
- * closed by MHD_cleanup_upgraded_connection_() during
- * connection's final cleanup.
- */}
- #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT*/
- /* end of connection_finish_forward.c */
|