summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2019-08-01 21:40:47 +0200
committerChristian Grothoff <christian@grothoff.org>2019-08-01 21:40:47 +0200
commit26368ac8f1a32f49eaffae77abcfc595c62802bd (patch)
tree0e444c75bb66730ea96929fda487fbee4e26c41f
parent97fd0a6557b98166f9617370e1497d47e80e9a04 (diff)
add ways for application to control corking for upgraded sockets
-rw-r--r--src/include/microhttpd.h12
-rw-r--r--src/microhttpd/connection.c2
-rw-r--r--src/microhttpd/response.c38
-rw-r--r--src/microhttpd/test_upgrade.c2
4 files changed, 52 insertions, 2 deletions
diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h
index c2fc90a4..00288696 100644
--- a/src/include/microhttpd.h
+++ b/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
};
diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index 67ff6017..c2add01a 100644
--- a/src/microhttpd/connection.c
+++ b/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_() */
diff --git a/src/microhttpd/response.c b/src/microhttpd/response.c
index 7b98a45c..65ea7b09 100644
--- a/src/microhttpd/response.c
+++ b/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;
diff --git a/src/microhttpd/test_upgrade.c b/src/microhttpd/test_upgrade.c
index caf12e61..9135187c 100644
--- a/src/microhttpd/test_upgrade.c
+++ b/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,