diff options
author | Igor Sysoev <igor@sysoev.ru> | 2006-02-16 15:26:46 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2006-02-16 15:26:46 +0000 |
commit | c2807ecf4522cbd23c18fe87e3d4c0f793026e7a (patch) | |
tree | d6c4d64689d7ec8dd8315988360e6c5b62b3c210 /src/http/modules/perl | |
parent | c07b968bebe0801836ee94753b28a7d227ff76cc (diff) | |
download | nginx-release-0.3.28.tar.gz nginx-release-0.3.28.zip |
nginx-0.3.28-RELEASE importrelease-0.3.28
*) 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.
Diffstat (limited to 'src/http/modules/perl')
-rw-r--r-- | src/http/modules/perl/nginx.xs | 34 |
1 files changed, 23 insertions, 11 deletions
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; |