Преглед изворни кода

restructure a bit to reuse existing send function

Christian Grothoff пре 6 година
родитељ
комит
35d532bdc9
1 измењених фајлова са 34 додато и 42 уклоњено
  1. 34 42
      src/microhttpd/mhd_send.c

+ 34 - 42
src/microhttpd/mhd_send.c

@@ -218,6 +218,7 @@ MHD_send_on_connection_ (struct MHD_Connection *connection,
 #endif
   errno = eno;
   return ret;
+}
 
 
 // * Send header followed by buffer on connection;
@@ -233,38 +234,15 @@ MHD_send_on_connection2_ (struct MHD_Connection *connection,
                           const char *header,
                           size_t header_size,
                           const char *buffer,
-                          size_t buffer_size,
-                          enum MHD_SendSocketOptions options)
+                          size_t buffer_size)
 {
+#if HAVE_WRITEV
   MHD_socket s = connection->socket_fd;
-  bool want_cork, have_cork, have_more;
+  bool have_cork, have_more;
+  int iovcnt;
+  struct iovec vector[2];
 
-  switch (options)
-  {
-  /* No corking */
-  case MHD_SSO_NO_CORK:
-    want_cork = false;
-    break;
-  /* Do corking, do MSG_MORE instead if available */
-  case MHD_SSO_MAY_CORK:
-    want_cork = true;
-    break;
-    /* Cork the header */
-  case MHD_SSO_HDR_CORK:
-    want_cork = (buffer_size >= 1024) && (buffer_size <= 1220);
-    break;
-  }
-  // ! could be avoided by redefining the variable
   have_cork = ! connection->sk_tcp_nodelay_on;
-
-#ifdef MSG_MORE
-  have_more = true;
-#else
-  have_more = false;
-#endif
-
-  bool use_corknopush;
-
 #if HAVE_NODELAY
   use_corknopush = false;
 #elif HAVE_CORK
@@ -273,17 +251,29 @@ MHD_send_on_connection2_ (struct MHD_Connection *connection,
   use_corknopush = true;
 #endif
 
-#if HAVE_WRITEV
-  if ((options == MHD_SSO_HDR_CORK) && want_cork)
+#if HAVE_NODELAY
+  if (! use_corknopush)
+  {
+    if (! have_cork && want_cork)
+    {
+      // setsockopt (nodelay-off);
+      setsockopt (s, IPPROTO_TCP, TCP_NODELAY, 0, sizeof (int));
+      connection->sk_tcp_nodelay = false;
+    }
+    // ...
+  }
+#endif
+
+  vector[0].iov_base = header;
+  vector[0].iov_len = strlen (header);
+  vector[1].iov_base = buffer;
+  vector[1].iov_len = strlen (buffer);
+  iovcnt = sizeof (vector) / sizeof (struct iovec);
+  ret = writev (s, vector, iovcnt);
+#if HAVE_CORK
   {
-    int iovcnt;
-    struct iovec vector[2];
-    vector[0].iov_base = header;
-    vector[0].iov_len = strlen (header);
-    vector[1].iov_base = buffer;
-    vector[1].iov_len = strlen (buffer);
-    iovcnt = sizeof (vector) / sizeof (struct iovec);
-    ret = writev (s, vector, iovcnt);
+    int eno;
+
     eno = errno;
     if ((ret == header_len + buffer_len) && have_cork)
     {
@@ -293,10 +283,12 @@ MHD_send_on_connection2_ (struct MHD_Connection *connection,
       // connection->sk_tcp_cork_nopush_on = true;
     }
     errno = eno;
-    return ret;
   }
-#endif
-
-  errno = eno;
   return ret;
+#else
+  return MHD_send_on_connection_ (connection,
+                                  header,
+                                  header_size,
+                                  MHD_SSO_HDR_CORK);
+#endif
 }