diff options
Diffstat (limited to 'src/http/modules')
-rw-r--r-- | src/http/modules/ngx_http_empty_gif_module.c | 2 | ||||
-rw-r--r-- | src/http/modules/ngx_http_referer_module.c | 1 | ||||
-rw-r--r-- | src/http/modules/perl/nginx.xs | 34 |
3 files changed, 25 insertions, 12 deletions
diff --git a/src/http/modules/ngx_http_empty_gif_module.c b/src/http/modules/ngx_http_empty_gif_module.c index c7af1214c..d72983ad4 100644 --- a/src/http/modules/ngx_http_empty_gif_module.c +++ b/src/http/modules/ngx_http_empty_gif_module.c @@ -148,7 +148,7 @@ ngx_http_empty_gif_handler(ngx_http_request_t *r) b->last_buf = 1; r->headers_out.status = NGX_HTTP_OK; - r->headers_out.content_length_n = b->last - b->pos; + r->headers_out.content_length_n = sizeof(ngx_empty_gif); r->headers_out.last_modified_time = 23349600; rc = ngx_http_send_header(r); diff --git a/src/http/modules/ngx_http_referer_module.c b/src/http/modules/ngx_http_referer_module.c index 4eac263a9..3ad419b39 100644 --- a/src/http/modules/ngx_http_referer_module.c +++ b/src/http/modules/ngx_http_referer_module.c @@ -334,6 +334,7 @@ ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) } uri.len = 0; + uri.data = NULL; if (ngx_strcmp(value[i].data, "server_names") == 0) { 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; |