comparison src/os/unix/ngx_freebsd_sendfile_chain.c @ 28:7ca9bdc82b3f NGINX_0_1_14

nginx 0.1.14 *) Feature: the autoconfiguration directives: --http-client-body-temp-path=PATH, --http-proxy-temp-path=PATH, and --http-fastcgi-temp-path=PATH *) Change: the directory name for the temporary files with the client request body is specified by directive client_body_temp_path, by default it is <prefix>/client_body_temp. *) Feature: the ngx_http_fastcgi_module and the directives: fastcgi_pass, fastcgi_root, fastcgi_index, fastcgi_params, fastcgi_connect_timeout, fastcgi_send_timeout, fastcgi_read_timeout, fastcgi_send_lowat, fastcgi_header_buffer_size, fastcgi_buffers, fastcgi_busy_buffers_size, fastcgi_temp_path, fastcgi_max_temp_file_size, fastcgi_temp_file_write_size, fastcgi_next_upstream, and fastcgi_x_powered_by. *) Bugfix: the "[alert] zero size buf" error; bug appeared in 0.1.3. *) Change: the URI must be specified after the host name in the proxy_pass directive. *) Change: the %3F symbol in the URI was considered as the argument string start. *) Feature: the unix domain sockets support in the ngx_http_proxy_module. *) Feature: the ssl_engine and ssl_ciphers directives. Thanks to Sergey Skvortsov for SSL-accelerator.
author Igor Sysoev <http://sysoev.ru>
date Tue, 18 Jan 2005 00:00:00 +0300
parents 45fe5b98a9de
children da8c190bdaba
comparison
equal deleted inserted replaced
27:66901c2556fd 28:7ca9bdc82b3f
8 #include <ngx_core.h> 8 #include <ngx_core.h>
9 #include <ngx_event.h> 9 #include <ngx_event.h>
10 10
11 11
12 /* 12 /*
13 * Although FreeBSD sendfile() allows to pass a header and a trailer 13 * Although FreeBSD sendfile() allows to pass a header and a trailer,
14 * it can not send a header with a part of the file in one packet until 14 * it can not send a header with a part of the file in one packet until
15 * FreeBSD 5.3. Besides over the fast ethernet connection sendfile() 15 * FreeBSD 5.3. Besides, over the fast ethernet connection sendfile()
16 * may send the partially filled packets, i.e. the 8 file pages may be sent 16 * may send the partially filled packets, i.e. the 8 file pages may be sent
17 * as the 11 full 1460-bytes packets, then one incomplete 324-bytes packet, 17 * as the 11 full 1460-bytes packets, then one incomplete 324-bytes packet,
18 * and then again the 11 full 1460-bytes packets. 18 * and then again the 11 full 1460-bytes packets.
19 * 19 *
20 * So we use the TCP_NOPUSH option (similar to Linux's TCP_CORK) 20 * Threfore we use the TCP_NOPUSH option (similar to Linux's TCP_CORK)
21 * to postpone the sending - it not only sends a header and the first part 21 * to postpone the sending - it not only sends a header and the first part of
22 * of the file in one packet but also sends the file pages in the full packets. 22 * the file in one packet, but also sends the file pages in the full packets.
23 * 23 *
24 * But until FreeBSD 4.5 the turning TCP_NOPUSH off does not flush a pending 24 * But until FreeBSD 4.5 the turning TCP_NOPUSH off does not flush a pending
25 * data that less than MSS so that data may be sent with 5 second delay. 25 * data that less than MSS so that data may be sent with 5 second delay.
26 * So we do not use TCP_NOPUSH on FreeBSD prior to 4.5 although it can be used 26 * So we do not use TCP_NOPUSH on FreeBSD prior to 4.5 although it can be used
27 * for non-keepalive HTTP connections. 27 * for non-keepalive HTTP connections.
218 { 218 {
219 if (ngx_tcp_nopush(c->fd) == NGX_ERROR) { 219 if (ngx_tcp_nopush(c->fd) == NGX_ERROR) {
220 err = ngx_errno; 220 err = ngx_errno;
221 221
222 /* 222 /*
223 * there is a tiny chance to be interrupted, however 223 * there is a tiny chance to be interrupted, however,
224 * we continue a processing without the TCP_NOPUSH 224 * we continue a processing without the TCP_NOPUSH
225 */ 225 */
226 226
227 if (err != NGX_EINTR) { 227 if (err != NGX_EINTR) {
228 wev->error = 1; 228 wev->error = 1;
247 /* 247 /*
248 * the "nbytes bug" of the old sendfile() syscall: 248 * the "nbytes bug" of the old sendfile() syscall:
249 * http://www.freebsd.org/cgi/query-pr.cgi?pr=33771 249 * http://www.freebsd.org/cgi/query-pr.cgi?pr=33771
250 */ 250 */
251 251
252 if (ngx_freebsd_sendfile_nbytes_bug == 0) { 252 if (!ngx_freebsd_sendfile_nbytes_bug) {
253 header_size = 0; 253 header_size = 0;
254 } 254 }
255 255
256 sent = 0; 256 sent = 0;
257 257
280 } 280 }
281 281
282 if (rc == 0 && sent == 0) { 282 if (rc == 0 && sent == 0) {
283 283
284 /* 284 /*
285 * rc and sent are equals to zero when someone has truncated 285 * rc and sent equal to zero when someone has truncated
286 * the file, so the offset became beyond the end of the file 286 * the file, so the offset became beyond the end of the file
287 */ 287 */
288 288
289 ngx_log_error(NGX_LOG_ALERT, c->log, 0, 289 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
290 "sendfile() reported that \"%s\" was truncated", 290 "sendfile() reported that \"%s\" was truncated",
368 } 368 }
369 369
370 if (eagain) { 370 if (eagain) {
371 371
372 /* 372 /*
373 * sendfile() can return EAGAIN even if it has sent 373 * sendfile() may return EAGAIN, even if it has sent a whole file
374 * a whole file part but the successive sendfile() call would 374 * part, it indicates that the successive sendfile() call would
375 * return EAGAIN right away and would not send anything. 375 * return EAGAIN right away and would not send anything.
376 * We use it as a hint. 376 * We use it as a hint.
377 */ 377 */
378 378
379 wev->ready = 0; 379 wev->ready = 0;