فهرست منبع

add ways for application to control corking for upgraded sockets

Christian Grothoff 6 سال پیش
والد
کامیت
26368ac8f1
4فایلهای تغییر یافته به همراه52 افزوده شده و 2 حذف شده
  1. 11 1
      src/include/microhttpd.h
  2. 1 1
      src/microhttpd/connection.c
  3. 38 0
      src/microhttpd/response.c
  4. 2 0
      src/microhttpd/test_upgrade.c

+ 11 - 1
src/include/microhttpd.h

@@ -3132,7 +3132,17 @@ enum MHD_UpgradeAction
    *
    * Takes no extra arguments.
    */
-  MHD_UPGRADE_ACTION_CLOSE = 0
+  MHD_UPGRADE_ACTION_CLOSE = 0,
+
+  /**
+   * Enable CORKing on the underlying socket.
+   */
+  MHD_UPGRADE_ACTION_CORK_ON = 1,
+
+  /**
+   * Disable CORKing on the underlying socket.
+   */
+  MHD_UPGRADE_ACTION_CORK_OFF = 2
 
 };
 

+ 1 - 1
src/microhttpd/connection.c

@@ -3181,7 +3181,7 @@ MHD_connection_handle_write (struct MHD_Connection *connection)
       return;
     case MHD_CONNECTION_HEADERS_SENDING:
       {
-        const size_t wb_ready  =connection->write_buffer_append_offset -
+        const size_t wb_ready = connection->write_buffer_append_offset -
           connection->write_buffer_send_offset;
 
         /* if the response body is not available, we use MHD_send_on_connection_() */

+ 38 - 0
src/microhttpd/response.c

@@ -825,6 +825,44 @@ MHD_upgrade_action (struct MHD_UpgradeResponseHandle *urh,
      * be moved to cleanup list by MHD_resume_connection(). */
     MHD_resume_connection (connection);
     return MHD_YES;
+  case MHD_UPGRADE_ACTION_CORK_ON:
+    if (connection->sk_cork_on)
+      return MHD_YES;
+#ifdef HTTPS_SUPPORT
+    if (0 != (daemon->options & MHD_USE_TLS) )
+      {
+        gnutls_record_cork (connection->tls_session);
+        connection->sk_cork_on = true;
+        return MHD_YES;
+      }
+    else
+#else
+      {
+        if (0 ==
+            MHD_socket_cork_ (connection->socket_fd,
+                              true))
+          connection->sk_cork_on = true;
+      }
+#endif
+  case MHD_UPGRADE_ACTION_CORK_OFF:
+    if (! connection->sk_cork_on)
+      return MHD_YES;
+#ifdef HTTPS_SUPPORT
+    if (0 != (daemon->options & MHD_USE_TLS) )
+      {
+        gnutls_record_uncork (connection->tls_session, 0);
+        connection->sk_cork_on = false;
+        return MHD_YES;
+      }
+    else
+#else
+      {
+        if (0 ==
+            MHD_socket_cork_ (connection->socket_fd,
+                              false))
+          connection->sk_cork_on = false;
+      }
+#endif
   default:
     /* we don't understand this one */
     return MHD_NO;

+ 2 - 0
src/microhttpd/test_upgrade.c

@@ -685,6 +685,8 @@ run_usock (void *cls)
 {
   struct MHD_UpgradeResponseHandle *urh = cls;
 
+  MHD_upgrade_action (urh,
+                      MHD_UPGRADE_ACTION_CORK_OFF);
   send_all (usock,
             "Hello");
   recv_all (usock,