diff src/http/modules/perl/nginx.xs @ 162:6be073125f2e NGINX_0_3_28

nginx 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.
author Igor Sysoev <http://sysoev.ru>
date Thu, 16 Feb 2006 00:00:00 +0300
parents 396dbbc06dd7
children fef68f68bcfd
line wrap: on
line diff
--- 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);
+            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;
+
         }
 
-        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;