diff options
Diffstat (limited to 'src/microhttpd/mhd_send.c')
-rw-r--r-- | src/microhttpd/mhd_send.c | 76 |
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 | } |