From c2807ecf4522cbd23c18fe87e3d4c0f793026e7a Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Thu, 16 Feb 2006 15:26:46 +0000 Subject: nginx-0.3.28-RELEASE import *) Feature: the "restrict_host_names" directive was canceled. *) Feature: the --with-cpu-opt=ppc64 configuration parameter. *) Bugfix: on some condition the proxied connection with a client was terminated prematurely. Thanks to Vladimir Shutoff. *) Bugfix: the "X-Accel-Limit-Rate" header line was not taken into account if the request was redirected using the "X-Accel-Redirect" header line. *) Bugfix: the "post_action" directive ran only after a successful completion of a request. *) Bugfix: the proxied response body generated by the "post_action" directive was transferred to a client. --- src/http/modules/perl/nginx.xs | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'src/http/modules/perl/nginx.xs') diff --git a/src/http/modules/perl/nginx.xs b/src/http/modules/perl/nginx.xs index c24788c70..2d7ede031 100644 --- a/src/http/modules/perl/nginx.xs +++ b/src/http/modules/perl/nginx.xs @@ -415,9 +415,11 @@ print(r, ...) int -sendfile(r, filename) +sendfile(r, filename, offset = -1, bytes = 0) nginx r char *filename + int offset; + size_t bytes; PREINIT: @@ -460,17 +462,26 @@ sendfile(r, filename) goto done; } - if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_fd_info_n " \"%s\" failed", filename); + if (offset == -1) { + offset = 0; + } + + if (bytes == 0) { + if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, + ngx_fd_info_n " \"%s\" failed", filename); + + if (ngx_close_file(fd) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, + ngx_close_file_n " \"%s\" failed", filename); + } + + RETVAL = NGX_ERROR; + goto done; - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", filename); } - RETVAL = NGX_ERROR; - goto done; + bytes = ngx_file_size(&fi) - offset; } cln->handler = ngx_pool_cleanup_file; @@ -481,8 +492,9 @@ sendfile(r, filename) clnf->log = r->pool->log; b->in_file = 1; - b->file_pos = 0; - b->file_last = ngx_file_size(&fi); + + b->file_pos = offset; + b->file_last = offset + bytes; b->file->fd = fd; b->file->log = r->connection->log; -- cgit