aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/mhd_send.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/mhd_send.c')
-rw-r--r--src/microhttpd/mhd_send.c76
1 files changed, 34 insertions, 42 deletions
diff --git a/src/microhttpd/mhd_send.c b/src/microhttpd/mhd_send.c
index beb7b60a..6c080ccb 100644
--- a/src/microhttpd/mhd_send.c
+++ b/src/microhttpd/mhd_send.c
@@ -218,6 +218,7 @@ MHD_send_on_connection_ (struct MHD_Connection *connection,
218#endif 218#endif
219 errno = eno; 219 errno = eno;
220 return ret; 220 return ret;
221}
221 222
222 223
223// * Send header followed by buffer on connection; 224// * Send header followed by buffer on connection;
@@ -233,38 +234,15 @@ MHD_send_on_connection2_ (struct MHD_Connection *connection,
233 const char *header, 234 const char *header,
234 size_t header_size, 235 size_t header_size,
235 const char *buffer, 236 const char *buffer,
236 size_t buffer_size, 237 size_t buffer_size)
237 enum MHD_SendSocketOptions options)
238{ 238{
239#if HAVE_WRITEV
239 MHD_socket s = connection->socket_fd; 240 MHD_socket s = connection->socket_fd;
240 bool want_cork, have_cork, have_more; 241 bool have_cork, have_more;
242 int iovcnt;
243 struct iovec vector[2];
241 244
242 switch (options)
243 {
244 /* No corking */
245 case MHD_SSO_NO_CORK:
246 want_cork = false;
247 break;
248 /* Do corking, do MSG_MORE instead if available */
249 case MHD_SSO_MAY_CORK:
250 want_cork = true;
251 break;
252 /* Cork the header */
253 case MHD_SSO_HDR_CORK:
254 want_cork = (buffer_size >= 1024) && (buffer_size <= 1220);
255 break;
256 }
257 // ! could be avoided by redefining the variable
258 have_cork = ! connection->sk_tcp_nodelay_on; 245 have_cork = ! connection->sk_tcp_nodelay_on;
259
260#ifdef MSG_MORE
261 have_more = true;
262#else
263 have_more = false;
264#endif
265
266 bool use_corknopush;
267
268#if HAVE_NODELAY 246#if HAVE_NODELAY
269 use_corknopush = false; 247 use_corknopush = false;
270#elif HAVE_CORK 248#elif HAVE_CORK
@@ -273,17 +251,29 @@ MHD_send_on_connection2_ (struct MHD_Connection *connection,
273 use_corknopush = true; 251 use_corknopush = true;
274#endif 252#endif
275 253
276#if HAVE_WRITEV 254#if HAVE_NODELAY
277 if ((options == MHD_SSO_HDR_CORK) && want_cork) 255 if (! use_corknopush)
256 {
257 if (! have_cork && want_cork)
258 {
259 // setsockopt (nodelay-off);
260 setsockopt (s, IPPROTO_TCP, TCP_NODELAY, 0, sizeof (int));
261 connection->sk_tcp_nodelay = false;
262 }
263 // ...
264 }
265#endif
266
267 vector[0].iov_base = header;
268 vector[0].iov_len = strlen (header);
269 vector[1].iov_base = buffer;
270 vector[1].iov_len = strlen (buffer);
271 iovcnt = sizeof (vector) / sizeof (struct iovec);
272 ret = writev (s, vector, iovcnt);
273#if HAVE_CORK
278 { 274 {
279 int iovcnt; 275 int eno;
280 struct iovec vector[2]; 276
281 vector[0].iov_base = header;
282 vector[0].iov_len = strlen (header);
283 vector[1].iov_base = buffer;
284 vector[1].iov_len = strlen (buffer);
285 iovcnt = sizeof (vector) / sizeof (struct iovec);
286 ret = writev (s, vector, iovcnt);
287 eno = errno; 277 eno = errno;
288 if ((ret == header_len + buffer_len) && have_cork) 278 if ((ret == header_len + buffer_len) && have_cork)
289 { 279 {
@@ -293,10 +283,12 @@ MHD_send_on_connection2_ (struct MHD_Connection *connection,
293 // connection->sk_tcp_cork_nopush_on = true; 283 // connection->sk_tcp_cork_nopush_on = true;
294 } 284 }
295 errno = eno; 285 errno = eno;
296 return ret;
297 } 286 }
298#endif
299
300 errno = eno;
301 return ret; 287 return ret;
288#else
289 return MHD_send_on_connection_ (connection,
290 header,
291 header_size,
292 MHD_SSO_HDR_CORK);
293#endif
302} 294}