libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 53e1e4864887512f39e964fc57c3b9f83d04a489
parent 80ecc6d37cfe0ba56566b63cd3f798cb2dc931a4
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Mon, 23 Oct 2023 20:52:01 +0300

test_upgrade: set TCP_NODELAY unconditionally on used sockets

Diffstat:
Msrc/microhttpd/test_upgrade.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 61 insertions(+), 27 deletions(-)

diff --git a/src/microhttpd/test_upgrade.c b/src/microhttpd/test_upgrade.c @@ -263,6 +263,62 @@ gnutlscli_connect (int *sock, /** + * Change socket to blocking. + * + * @param fd the socket to manipulate + */ +static void +make_blocking (MHD_socket fd) +{ +#if defined(MHD_POSIX_SOCKETS) + int flags; + + flags = fcntl (fd, F_GETFL); + if (-1 == flags) + externalErrorExitDesc ("fcntl() failed"); + if ((flags & ~O_NONBLOCK) != flags) + if (-1 == fcntl (fd, F_SETFL, flags & ~O_NONBLOCK)) + externalErrorExitDesc ("fcntl() failed"); +#elif defined(MHD_WINSOCK_SOCKETS) + unsigned long flags = 0; + + if (0 != ioctlsocket (fd, (int) FIONBIO, &flags)) + externalErrorExitDesc ("ioctlsocket() failed"); +#endif /* MHD_WINSOCK_SOCKETS */ +} + + +/** + * Enable TCP_NODELAY on TCP/IP socket. + * + * @param fd the socket to manipulate + */ +static void +make_nodelay (MHD_socket fd) +{ +#ifdef TCP_NODELAY + const MHD_SCKT_OPT_BOOL_ on_val = 1; + + if (0 == setsockopt (fd, + IPPROTO_TCP, + TCP_NODELAY, + (const void *) &on_val, + sizeof (on_val))) + return; /* Success exit point */ + +#ifndef MHD_WINSOCK_SOCKETS + fprintf (stderr, "Failed to enable TCP_NODELAY on socket (ignored). " + "errno: %d (%s)\n", (int) errno, strerror (errno)); +#else /* MHD_WINSOCK_SOCKETS */ + fprintf (stderr, "Failed to enable TCP_NODELAY on socket (ignored). " + "WSAGetLastError() value: %d\n", (int) WSAGetLastError ()); +#endif /* MHD_WINSOCK_SOCKETS */ + fflush (stderr); +#endif /* TCP_NODELAY */ +} + + +/** * Wrapper structure for plain&TLS sockets */ struct wr_socket @@ -323,7 +379,10 @@ wr_create_plain_sckt (void) s->t = wr_plain; s->fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); if (MHD_INVALID_SOCKET != s->fd) + { + make_nodelay (s->fd); return s; /* Success */ + } testErrorLogDesc ("socket() failed"); free (s); return NULL; @@ -349,6 +408,7 @@ wr_create_tls_sckt (void) s->fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); if (MHD_INVALID_SOCKET != s->fd) { + make_nodelay (s->fd); if (GNUTLS_E_SUCCESS == gnutls_init (&(s->tls_s), GNUTLS_CLIENT)) { if (GNUTLS_E_SUCCESS == gnutls_set_default_priority (s->tls_s)) @@ -409,6 +469,7 @@ wr_create_from_plain_sckt (MHD_socket plain_sk) } s->t = wr_plain; s->fd = plain_sk; + make_nodelay (s->fd); return s; } @@ -761,33 +822,6 @@ notify_connection_cb (void *cls, } -/** - * Change socket to blocking. - * - * @param fd the socket to manipulate - */ -static void -make_blocking (MHD_socket fd) -{ -#if defined(MHD_POSIX_SOCKETS) - int flags; - - flags = fcntl (fd, F_GETFL); - if (-1 == flags) - externalErrorExitDesc ("fcntl() failed"); - if ((flags & ~O_NONBLOCK) != flags) - if (-1 == fcntl (fd, F_SETFL, flags & ~O_NONBLOCK)) - externalErrorExitDesc ("fcntl() failed"); -#elif defined(MHD_WINSOCK_SOCKETS) - unsigned long flags = 0; - - if (0 != ioctlsocket (fd, (int) FIONBIO, &flags)) - externalErrorExitDesc ("ioctlsocket() failed"); -#endif /* MHD_WINSOCK_SOCKETS */ - -} - - static void send_all (struct wr_socket *sock, const void *data,