gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] 03/03: mhd_send.c: added support for vector-send on W32


From: gnunet
Subject: [libmicrohttpd] 03/03: mhd_send.c: added support for vector-send on W32
Date: Wed, 16 Dec 2020 13:22:40 +0100

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit d1d9637605c27493bf3efc9ca772aa63c650cd96
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Wed Dec 16 15:21:12 2020 +0300

    mhd_send.c: added support for vector-send on W32
---
 src/microhttpd/mhd_send.c | 81 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 63 insertions(+), 18 deletions(-)

diff --git a/src/microhttpd/mhd_send.c b/src/microhttpd/mhd_send.c
index fbb65023..a7125708 100644
--- a/src/microhttpd/mhd_send.c
+++ b/src/microhttpd/mhd_send.c
@@ -781,6 +781,10 @@ MHD_send_data_ (struct MHD_Connection *connection,
 }
 
 
+#if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV) || defined(_WIN32)
+#define _MHD_USE_SEND_VEC          1
+#endif /* HAVE_SENDMSG || HAVE_WRITEV || _WIN32*/
+
 ssize_t
 MHD_send_hdr_and_body_ (struct MHD_Connection *connection,
                         const char *header,
@@ -794,17 +798,30 @@ MHD_send_hdr_and_body_ (struct MHD_Connection *connection,
   bool push_hdr;
   bool push_body;
   MHD_socket s = connection->socket_fd;
+#ifndef _WIN32
+#define _MHD_SEND_VEC_MAX   MHD_SCKT_SEND_MAX_SIZE_
+#else  /* ! _WIN32 */
+#define _MHD_SEND_VEC_MAX   UINT32_MAX
+#endif /* ! _WIN32 */
+#ifdef _MHD_USE_SEND_VEC
 #if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV)
   struct iovec vector[2];
 #ifdef HAVE_SENDMSG
   struct msghdr msg;
 #endif /* HAVE_SENDMSG */
+#endif /* HAVE_SENDMSG || HAVE_WRITEV */
+#ifdef _WIN32
+  WSABUF vector[2];
+  uint32_t vec_sent;
+  int err;
+#endif /* _WIN32 */
 #ifdef HTTPS_SUPPORT
   const bool no_vec = (connection->daemon->options & MHD_USE_TLS);
 #else  /* ! HTTPS_SUPPORT */
   const bool no_vec = false;
 #endif /* ! HTTPS_SUPPORT */
-#endif /* HAVE_SENDMSG || HAVE_WRITEV */
+#endif /* _MHD_USE_SEND_VEC */
+
   mhd_assert ( (NULL != body) || (0 == body_size) );
 
   if ( (MHD_INVALID_SOCKET == s) ||
@@ -840,13 +857,14 @@ MHD_send_hdr_and_body_ (struct MHD_Connection *connection,
     push_hdr = true; /* The header alone is equal to the whole response. */
 
   if (
-#if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV)
+#ifdef _MHD_USE_SEND_VEC
     (no_vec) ||
     (0 == body_size) ||
-    ((size_t) SSIZE_MAX <= header_size)
-#else  /* ! (HAVE_SENDMSG || HAVE_WRITEV) */
+    ((size_t) SSIZE_MAX < header_size) ||
+    ((size_t) _MHD_SEND_VEC_MAX < header_size)
+#else  /* ! _MHD_USE_SEND_VEC */
     true
-#endif /* ! (HAVE_SENDMSG || HAVE_WRITEV) */
+#endif /* ! _MHD_USE_SEND_VEC */
     )
   {
     ret = MHD_send_data_ (connection,
@@ -884,7 +902,7 @@ MHD_send_hdr_and_body_ (struct MHD_Connection *connection,
     }
     return ret;
   }
-#if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV)
+#ifdef _MHD_USE_SEND_VEC
 
   if ( ((size_t) SSIZE_MAX <= body_size) ||
        ((size_t) SSIZE_MAX < (header_size + body_size)) )
@@ -894,32 +912,59 @@ MHD_send_hdr_and_body_ (struct MHD_Connection *connection,
     complete_response = false;
     push_body = complete_response;
   }
+#if (SSIZE_MAX != _MHD_SEND_VEC_MAX) || (_MHD_SEND_VEC_MAX + 0 == 0)
+  if (((size_t) _MHD_SEND_VEC_MAX <= body_size) ||
+      ((size_t) _MHD_SEND_VEC_MAX < (header_size + body_size)))
+  {
+    /* Send value limit */
+    body_size = _MHD_SEND_VEC_MAX - header_size;
+    complete_response = false;
+    push_body = complete_response;
+  }
+#endif /* SSIZE_MAX != _MHD_SEND_VEC_MAX */
 
   pre_send_setopt (connection,
-#if HAVE_SENDMSG
+#ifdef HAVE_SENDMSG
                    true,
-#elif HAVE_WRITEV
+#else  /* ! HAVE_SENDMSG */
                    false,
-#endif /* HAVE_WRITEV */
+#endif /* ! HAVE_SENDMSG */
                    push_hdr || push_body);
-
+#if defined(HAVE_SENDMSG) || defined(HAVE_WRITEV)
   vector[0].iov_base = (void *) header;
   vector[0].iov_len = header_size;
   vector[1].iov_base = (void *) body;
   vector[1].iov_len = body_size;
 
-#if HAVE_SENDMSG
+#if define (HAVE_SENDMSG)
   memset (&msg, 0, sizeof(msg));
   msg.msg_iov = vector;
   msg.msg_iovlen = 2;
 
   ret = sendmsg (s, &msg, MSG_NOSIGNAL_OR_ZERO);
-#elif HAVE_WRITEV
+#elif defined (HAVE_WRITEV)
   ret = writev (s, vector, 2);
-#endif
+#endif /* HAVE_WRITEV */
+#endif /* HAVE_SENDMSG || HAVE_WRITEV */
+#ifdef _WIN32
+  vector[0].buf = (char *) header;
+  vector[0].len = (unsigned long) header_size;
+  vector[1].buf = (char *) body;
+  vector[1].len = (unsigned long) body_size;
+
+  err = WSASend (s, vector, 2, &vec_sent, 0, NULL, NULL);
+
+  if (0 == err)
+    ret = (ssize_t) vec_sent;
+  else
+    ret = -1;
+#endif /* _WIN32 */
+
   if (0 > ret)
   {
+#ifndef _WIN32
     const int err = MHD_socket_get_error_ ();
+#endif /* _WIN32 */
 
     if (MHD_SCKT_ERR_IS_EAGAIN_ (err))
     {
@@ -955,11 +1000,11 @@ MHD_send_hdr_and_body_ (struct MHD_Connection 
*connection,
      * sendfile() will be used so assume that next final send() will be
      * the same, like for this response. */
     post_send_setopt (connection,
-#if HAVE_SENDMSG
+#ifdef HAVE_SENDMSG
                       true,
-#elif HAVE_WRITEV
+#else  /* ! HAVE_SENDMSG */
                       false,
-#endif /* HAVE_WRITEV */
+#endif /* ! HAVE_SENDMSG */
                       true);
   }
   else if ( (push_hdr) &&
@@ -978,10 +1023,10 @@ MHD_send_hdr_and_body_ (struct MHD_Connection 
*connection,
   }
 
   return ret;
-#else  /* ! (HAVE_SENDMSG || HAVE_WRITEV) */
+#else  /* ! _MHD_USE_SEND_VEC */
   mhd_assert (false);
   return MHD_ERR_CONNRESET_; /* Unreachable. Mute warnings. */
-#endif /* ! (HAVE_SENDMSG || HAVE_WRITEV) */
+#endif /* ! _MHD_USE_SEND_VEC */
 }
 
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]