replace connection->send_cls()

This commit is contained in:
ng0
2019-07-19 20:39:19 +00:00
parent 23a7502ef4
commit b854bbba20
2 changed files with 55 additions and 56 deletions
+32 -26
View File
@@ -53,7 +53,7 @@
/* For FreeBSD version identification */
#include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */
#include "mhd_send.h"
/**
* Message to transmit when http 1.1 request is received
@@ -3303,11 +3303,12 @@ MHD_connection_handle_write (struct MHD_Connection *connection)
case MHD_CONNECTION_HEADERS_PROCESSED:
return;
case MHD_CONNECTION_CONTINUE_SENDING:
ret = connection->send_cls (connection,
&HTTP_100_CONTINUE
[connection->continue_message_write_offset],
MHD_STATICSTR_LEN_ (HTTP_100_CONTINUE) -
connection->continue_message_write_offset);
ret = MHD_send_on_connection_ (connection,
&HTTP_100_CONTINUE
[connection->continue_message_write_offset],
MHD_STATICSTR_LEN_ (HTTP_100_CONTINUE) -
connection->continue_message_write_offset,
MHD_SSO_NO_CORK);
if (ret < 0)
{
if (MHD_ERR_AGAIN_ == ret)
@@ -3337,11 +3338,13 @@ MHD_connection_handle_write (struct MHD_Connection *connection)
mhd_assert (0);
return;
case MHD_CONNECTION_HEADERS_SENDING:
ret = connection->send_cls (connection,
&connection->write_buffer
[connection->write_buffer_send_offset],
connection->write_buffer_append_offset -
connection->write_buffer_send_offset);
/* TODO: Maybe use MHD_send_on_connection2_()? */
ret = MHD_send_on_connection_ (connection,
&connection->write_buffer
[connection->write_buffer_send_offset],
connection->write_buffer_append_offset -
connection->write_buffer_send_offset,
MHD_SSO_MAY_CORK);
if (ret < 0)
{
if (MHD_ERR_AGAIN_ == ret)
@@ -3389,11 +3392,12 @@ MHD_connection_handle_write (struct MHD_Connection *connection)
- response->data_start;
if (data_write_offset > (uint64_t)SIZE_MAX)
MHD_PANIC (_("Data offset exceeds limit"));
ret = connection->send_cls (connection,
&response->data
[(size_t)data_write_offset],
response->data_size -
(size_t)data_write_offset);
ret = MHD_send_on_connection_ (connection,
&response->data
[(size_t)data_write_offset],
response->data_size -
(size_t)data_write_offset,
MHD_SSO_NO_CORK);
#if DEBUG_SEND_DATA
if (ret > 0)
fprintf (stderr,
@@ -3432,11 +3436,12 @@ MHD_connection_handle_write (struct MHD_Connection *connection)
mhd_assert (0);
return;
case MHD_CONNECTION_CHUNKED_BODY_READY:
ret = connection->send_cls (connection,
&connection->write_buffer
[connection->write_buffer_send_offset],
connection->write_buffer_append_offset -
connection->write_buffer_send_offset);
ret = MHD_send_on_connection_ (connection,
&connection->write_buffer
[connection->write_buffer_send_offset],
connection->write_buffer_append_offset -
connection->write_buffer_send_offset,
MHD_SSO_NO_CORK);
if (ret < 0)
{
if (MHD_ERR_AGAIN_ == ret)
@@ -3460,11 +3465,12 @@ MHD_connection_handle_write (struct MHD_Connection *connection)
mhd_assert (0);
return;
case MHD_CONNECTION_FOOTERS_SENDING:
ret = connection->send_cls (connection,
&connection->write_buffer
[connection->write_buffer_send_offset],
connection->write_buffer_append_offset -
connection->write_buffer_send_offset);
ret = MHD_send_on_connection_ (connection,
&connection->write_buffer
[connection->write_buffer_send_offset],
connection->write_buffer_append_offset -
connection->write_buffer_send_offset,
MHD_SSO_HDR_CORK);
if (ret < 0)
{
if (MHD_ERR_AGAIN_ == ret)
+23 -30
View File
@@ -24,37 +24,33 @@
* @author ng0 <ng0@n0.is>
*/
// to be used in: send_param_adapter, MHD_send_
// and every place where sendfile(), sendfile64(), setsockopt()
// are used.
// TODO: sendfile() wrappers.
/* TODO: sendfile() wrappers. */
#include "mhd_send.h"
// NOTE: TCP_CORK == TCP_NOPUSH in FreeBSD.
// TCP_CORK is Linux.
// TCP_CORK/TCP_NOPUSH: don't send out partial frames.
// TCP_NODELAY: disable Nagle (aggregate data based on
// buffer pressur).
// TODO: It is possible that Solaris/SunOS depending on
// the linked library needs a different setsockopt usage:
// https://stackoverflow.com/questions/48670299/setsockopt-usage-in-linux-and-solaris-invalid-argument-in-solaris
/*
* https://svnweb.freebsd.org/base/head/sys/netinet/tcp_usrreq.c?view=markup&pathrev=346360
* NOTE:
* It might be possible that Solaris/SunOS depending on the linked library needs a different setsockopt usage:
* https://stackoverflow.com/questions/48670299/setsockopt-usage-in-linux-and-solaris-invalid-argument-in-solaris
*
* Approximately in 2007 work began to make TCP_NOPUSH in FreeBSD
* behave like TCP_CORK in Linux. Thus we define them to be one and
* the same, which again could be platform dependent (NetBSD does
* (so far) only provide a FreeBSD compatibility here, for example).
* Since we only deal with IPPROTO_TCP flags in this file and nowhere
* else, we don't have to move this elsewhere for now.
*/
/*
#if ! defined(TCP_CORK) && defined(TCP_NOPUSH)
#define TCP_CORK TCP_NOPUSH
#endif
*/
/*
* https://svnweb.freebsd.org/base/head/sys/netinet/tcp_usrreq.c?view=markup&pathrev=346360
*
* verbose notes, remove when done:
* TCP_CORK == TCP_NOPUSH in FreeBSD.
* TCP_CORK is Linux.
* TCP_CORK/TCP_NOPUSH: don't send out partial frames.
* TCP_NODELAY: disable Nagle (aggregate data based on buffer pressur)
*
* to be used in: send_param_adapter, MHD_send_
* and every place where sendfile(), sendfile64(), setsockopt() are used.
*
* Fix this up in doxygen style:
* -- OBJECTIVE:
* connection: use member 'socket', and remember the
* current state of the socket-options (cork/nocork/nodelay/whatever)
@@ -152,17 +148,14 @@ MHD_send_on_connection_ (struct MHD_Connection *connection,
{
connection->sk_tcp_nodelay = true;
}
//setsockopt (cork-on); // or nodelay on // + update connection->sk_tcp_nodelay_on
// When we have CORK, we can have NODELAY on the same system,
// at least since Linux 2.2 and both can be combined since
// Linux 2.5.71. See tcp(7). No other system in 2019-06 has TCP_CORK.
/* When we have CORK, we can have NODELAY on the same system,
* at least since Linux 2.2 and both can be combined since
* Linux 2.5.71. See tcp(7). No other system in 2019-06 has TCP_CORK. */
}
#elif TCP_NOPUSH
/*
* TCP_NOPUSH on FreeBSD is equal to cork on Linux, with the
* exception that we know that TCP_NOPUSH will definitely
* exist and we can disregard TCP_NODELAY unless requested.
*/
/* TCP_NOPUSH on FreeBSD is equal to cork on Linux, with the
* exception that we know that TCP_NOPUSH will definitely
* exist and we can disregard TCP_NODELAY unless requested. */
if ((use_corknopush) && (have_cork && ! want_cork))
{
if (0 == setsockopt (connection->socket_fd,