38#ifdef MHD_LINUX_SOLARIS_SENDFILE
39#include <sys/sendfile.h>
41#if defined(HAVE_FREEBSD_SENDFILE) || defined(HAVE_DARWIN_SENDFILE)
43#include <sys/socket.h>
46#ifdef HAVE_SYS_PARAM_H
58#if (! defined(HAVE_SENDMSG) || ! defined(MSG_NOSIGNAL)) && \
59 defined(MHD_SEND_SPIPE_SUPPRESS_POSSIBLE) && \
60 defined(MHD_SEND_SPIPE_SUPPRESS_NEEDED)
61#define _MHD_VECT_SEND_NEEDS_SPIPE_SUPPRESSED 1
69#define MHD_SENFILE_CHUNK_ (0x20000)
74#define MHD_SENFILE_CHUNK_THR_P_C_ (0x200000)
76#ifdef HAVE_FREEBSD_SENDFILE
117#if defined(HAVE_SYSCONF) && defined(_SC_IOV_MAX)
143#define _MHD_IOV_MAX mhd_iov_max_
144#elif defined(IOV_MAX)
149#define _MHD_IOV_MAX IOV_MAX
159#ifdef HAVE_FREEBSD_SENDFILE
167#if defined(HAVE_SYSCONF) && defined(_SC_IOV_MAX)
206 _ (
"Setting %s option to %s state failed "
207 "for TCP/IP socket %d: %s\n"),
219 _ (
"Setting %s option to %s state failed: %s\n"),
247#if defined(MHD_TCP_CORK_NOPUSH)
275 _ (
"Setting %s option to %s state failed "
276 "for TCP/IP socket %d: %s\n"),
292 _ (
"Setting %s option to %s state failed: %s\n"),
339#ifdef MHD_USE_MSG_MORE
347#ifdef MHD_TCP_CORK_NOPUSH
374#ifdef MHD_TCP_CORK_NOPUSH
375#ifdef _MHD_CORK_RESET_PUSH_DATA
376#ifdef _MHD_CORK_RESET_PUSH_DATA_ALWAYS
390#ifdef _MHD_NODELAY_SET_PUSH_DATA_ALWAYS
399#ifdef _MHD_NODELAY_SET_PUSH_DATA
426#ifdef _MHD_NODELAY_SET_PUSH_DATA
454#ifdef _MHD_NODELAY_SET_PUSH_DATA
495#ifdef _MHD_NODELAY_SET_PUSH_DATA
536#ifndef _MHD_CORK_RESET_PUSH_DATA_ALWAYS
562 _ (
"Zero-send failed: %s\n"),
595#ifndef MHD_USE_MSG_MORE
600#ifdef MHD_TCP_CORK_NOPUSH
601#ifdef _MHD_CORK_RESET_PUSH_DATA_ALWAYS
602#ifdef _MHD_NODELAY_SET_PUSH_DATA_ALWAYS
603#ifdef MHD_USE_MSG_MORE
695#ifdef _MHD_CORK_RESET_PUSH_DATA
702#ifdef _MHD_CORK_RESET_PUSH_DATA
744 _ (
"Failed to push the data from buffers to the network. "
745 "Client may experience some delay "
746 "(usually in range 200ms - 5 sec).\n"));
788 connection->epoll_state &=
806#if defined(GNUTLS_E_PREMATURE_TERMINATION)
809#elif defined(GNUTLS_E_UNEXPECTED_PACKET_LENGTH)
839#ifdef MHD_USE_MSG_MORE
859 connection->epoll_state &=
884 else if (buffer_size > (
size_t)
ret)
885 connection->epoll_state &=
918#define _MHD_SEND_VEC_MAX MHD_SCKT_SEND_MAX_SIZE_
920#define _MHD_SEND_VEC_MAX UINT32_MAX
923#if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV)
939#if (! defined(HAVE_SENDMSG) || ! defined(MSG_NOSIGNAL) ) && \
940 defined(MHD_SEND_SPIPE_SEND_SUPPRESS_POSSIBLE) && \
941 defined(MHD_SEND_SPIPE_SUPPRESS_NEEDED)
990 || ((
size_t)
UINT_MAX < header_size)
1002 if ( (header_size == (
size_t)
ret) &&
1043#if (SSIZE_MAX != _MHD_SEND_VEC_MAX) || (_MHD_SEND_VEC_MAX + 0 == 0)
1061#if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV)
1063 vector[0].iov_len = header_size;
1067#if defined(HAVE_SENDMSG)
1073#elif defined(HAVE_WRITEV)
1105 connection->epoll_state &=
1131 connection->epoll_state &=
1155 (header_size <= (
size_t)
ret))
1177#if defined(_MHD_HAVE_SENDFILE)
1185#ifndef HAVE_SENDFILE64
1190#ifdef MHD_LINUX_SOLARIS_SENDFILE
1191#ifndef HAVE_SENDFILE64
1197#ifdef HAVE_FREEBSD_SENDFILE
1201#ifdef HAVE_DARWIN_SENDFILE
1241#ifdef MHD_LINUX_SOLARIS_SENDFILE
1242#ifndef HAVE_SENDFILE64
1262 connection->epoll_state &=
1269#ifdef HAVE_LINUX_SENDFILE
1298 connection->epoll_state &=
1301#elif defined(HAVE_FREEBSD_SENDFILE)
1333#elif defined(HAVE_DARWIN_SENDFILE)
1386#if defined(MHD_VECT_SEND)
1411#elif defined(MHD_WINSOCK_SOCKETS)
1441#ifdef MHD_USE_MSG_MORE
1447#elif defined(HAVE_WRITEV)
1451#elif defined(MHD_WINSOCK_SOCKETS)
1472#error No vector-send function available
1483 connection->epoll_state &=
1526 connection->epoll_state &=
1546#if ! defined(MHD_VECT_SEND) || defined(HTTPS_SUPPORT) || \
1547 defined(_MHD_VECT_SEND_NEEDS_SPIPE_SUPPRESSED)
1627#if defined(HTTPS_SUPPORT) || \
1628 defined(_MHD_VECT_SEND_NEEDS_SPIPE_SUPPRESSED)
1637#if defined(HTTPS_SUPPORT) || \
1638 defined(_MHD_VECT_SEND_NEEDS_SPIPE_SUPPRESSED)
1643#ifdef _MHD_VECT_SEND_NEEDS_SPIPE_SUPPRESSED
1652#if ! defined(MHD_VECT_SEND) || defined(HTTPS_SUPPORT) || \
1653 defined(_MHD_VECT_SEND_NEEDS_SPIPE_SUPPRESSED)
#define MHD_ERR_OPNOTSUPP_
#define MHD_ERR_CONNRESET_
@ MHD_EPOLL_STATE_WRITE_READY
#define MHD_SCKT_ERR_IS_(err, code)
#define MHD_SCKT_ERR_IS_EAGAIN_(err)
#define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err)
#define MHD_socket_strerr_(err)
#define MHD_socket_last_strerr_()
#define MHD_SCKT_EOPNOTSUPP_
#define MHD_socket_get_error_()
#define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err)
#define MHD_SCKT_ERR_IS_EINTR_(err)
#define MHD_SCKT_SEND_MAX_SIZE_
#define MHD_SCKT_ENOTCONN_
#define MHD_SCKT_ENOTSOCK_
#define MHD_send_(s, b, l)
#define MHD_SENFILE_CHUNK_THR_P_C_
ssize_t MHD_send_hdr_and_body_(struct MHD_Connection *connection, const char *header, size_t header_size, bool never_push_hdr, const char *body, size_t body_size, bool complete_response)
ssize_t MHD_send_iovec_(struct MHD_Connection *connection, struct MHD_iovec_track_ *const r_iov, bool push_data)
ssize_t MHD_send_data_(struct MHD_Connection *connection, const char *buffer, size_t buffer_size, bool push_data)
static bool zero_send_(struct MHD_Connection *connection)
bool MHD_connection_set_cork_state_(struct MHD_Connection *connection, bool cork_state)
#define _MHD_SEND_VEC_MAX
void MHD_send_init_static_vars_(void)
static void pre_send_setopt(struct MHD_Connection *connection, bool plain_send, bool push_data)
static void post_send_setopt(struct MHD_Connection *connection, bool plain_send_next, bool push_data)
static ssize_t send_iov_emu(struct MHD_Connection *connection, struct MHD_iovec_track_ *const r_iov, bool push_data)
bool MHD_connection_set_nodelay_state_(struct MHD_Connection *connection, bool nodelay_state)
#define MHD_SENFILE_CHUNK_
Declarations of send() wrappers.
#define _MHD_DROP_CONST(ptr)
#define MHD_D_IS_USING_THREAD_PER_CONN_(d)
limits values definitions
#define MHD_SCKT_ENOPROTOOPT_
#define MHD_send4_(s, b, l, f)
#define MSG_NOSIGNAL_OR_ZERO
#define MHD_INVALID_SOCKET
enum MHD_tristate sk_nodelay
enum MHD_tristate is_nonip
enum MHD_CONNECTION_STATE state
struct MHD_Daemon * daemon
enum MHD_tristate sk_corked
uint64_t rsp_write_position
struct MHD_iovec_track_ resp_iov
struct MHD_Response * response