diff src/http/modules/ngx_http_static_handler.c @ 26:53cb81681040

nginx-0.0.1-2002-12-15-09:25:09 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 15 Dec 2002 06:25:09 +0000
parents 77c7629a2627
children 0e81ac0bb3e2
line wrap: on
line diff
--- a/src/http/modules/ngx_http_static_handler.c
+++ b/src/http/modules/ngx_http_static_handler.c
@@ -24,51 +24,84 @@ void ngx_http_static_init()
 
 int ngx_http_static_handler(ngx_http_request_t *r)
 {
-    int rc;
+    int  rc;
+    ngx_err_t    err;
     ngx_hunk_t  *h;
     ngx_http_log_ctx_t  *ctx;
 
-/*
+#if 0
     ngx_http_event_static_handler_loc_conf_t  *cf;
 
     cf = (ngx_http_event_static_handler_loc_conf_t *)
              ngx_get_module_loc_conf(r, &ngx_http_event_static_handler_module);
 
-*/
+#endif
 
     ngx_http_discard_body(r);
     ctx = r->connection->log->data;
     ctx->action = "sending response";
 
-    if (r->fd != -1)
-        r->fd = ngx_open_file(r->filename.data, NGX_FILE_RDONLY);
+    if (r->file.fd == NGX_INVALID_FILE)
+        r->file.fd = ngx_open_file(r->file.name.data, NGX_FILE_RDONLY);
 
-    if (r->fd == -1) {
+    if (r->file.fd == NGX_INVALID_FILE) {
+        err = ngx_errno;
         ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
                       "ngx_http_static_handler: "
-                      ngx_open_file_n " %s failed", r->filename.data);
+                      ngx_open_file_n " %s failed", r->file.name.data);
 
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        if (err == NGX_ENOENT)
+            return NGX_HTTP_NOT_FOUND;
+#if (WIN32)
+        else if (err == ERROR_PATH_NOT_FOUND)
+            return NGX_HTTP_NOT_FOUND;
+#endif
+        else
+            return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    if (ngx_stat_fd(r->fd, &r->fileinfo) == -1) {
+    if (!r->file.info_valid) {
+        if (ngx_stat_fd(r->file.fd, &r->file.info) == NGX_FILE_ERROR) {
+            ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
+                          "ngx_http_static_handler: "
+                          ngx_stat_fd_n " %s failed", r->file.name.data);
+
+            if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
+                ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
+                              "ngx_http_static_handler: "
+                              ngx_close_file_n " %s failed", r->file.name.data);
+
+            return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+
+        r->file.info_valid = 1;
+    }
+
+#if !(WIN32) /* it's probably Unix specific */
+
+    if (!ngx_is_file(r->file.info)) {
         ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
                       "ngx_http_static_handler: "
-                      ngx_stat_fd_n " %s failed", r->filename.data);
+                      "%s is not regular file", r->file.name.data);
 
-        /* close fd */
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
+            ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
+                          "ngx_http_static_handler: "
+                          ngx_close_file_n " %s failed", r->file.name.data);
+
+        return NGX_HTTP_NOT_FOUND;
     }
 
+#endif
+
     r->headers_out.status = NGX_HTTP_OK;
-    r->headers_out.content_length = ngx_file_size(r->fileinfo);
-/*
-    r->headers_out.last_modified = ngx_file_mtime(r->fileinfo);
-*/
+    r->headers_out.content_length = ngx_file_size(r->file.info);
+    r->headers_out.last_modified_time = ngx_file_mtime(r->file.info);
 
     ngx_test_null(r->headers_out.content_type,
                   ngx_push_table(r->headers_out.headers),
                   NGX_HTTP_INTERNAL_SERVER_ERROR);
+
     r->headers_out.content_type->key.len = 12;
     r->headers_out.content_type->key.data = "Content-Type";
 
@@ -90,83 +123,29 @@ int ngx_http_static_handler(ngx_http_req
         r->headers_out.content_type->value.len = 25;
         r->headers_out.content_type->value.data = "text/html; charset=koi8-r";
     }
+    /**/
 
-    /* STUB */
-    rc = ngx_http_header_filter(r);
-/*
-    rc = ngx_send_http_header(r);
-*/
+    /* we need to allocate them before header would be sent */
+    ngx_test_null(h, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
+                  NGX_HTTP_INTERNAL_SERVER_ERROR);
+
+    ngx_test_null(h->file, ngx_pcalloc(r->pool, sizeof(ngx_file_t)),
+                  NGX_HTTP_INTERNAL_SERVER_ERROR);
+
+    rc = ngx_http_send_header(r);
     if (r->header_only)
         return rc;
 
-    /* TODO: NGX_HTTP_INTERNAL_SERVER_ERROR is too late */
-
-    /* STUB */
-    ngx_test_null(h, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
-                  NGX_HTTP_INTERNAL_SERVER_ERROR);
-
     h->type = NGX_HUNK_FILE|NGX_HUNK_LAST;
     h->pos.file = 0;
-    h->last.file = ngx_file_size(r->fileinfo);
+    h->last.file = ngx_file_size(r->file.info);
 
-    /* STUB */
-    ngx_test_null(h->file, ngx_pcalloc(r->pool, sizeof(ngx_file_t)),
-                  NGX_HTTP_INTERNAL_SERVER_ERROR);
-    h->file->fd = r->fd;
+    h->file->fd = r->file.fd;
     h->file->log = r->connection->log;
 
     rc = ngx_http_output_filter(r, h);
+
     ngx_log_debug(r->connection->log, "0 output_filter: %d" _ rc);
+
     return rc;
 }
-
-#if 0
-
-static void *ngx_create_index_config()
-{
-    ngx_http_index_handler_loc_conf_t  *cf;
-
-    ngx_check_null(cf, ngx_alloc(p, sizeof(ngx_http_index_handler_loc_conf)),
-                   NULL);
-
-    cf->indices = ngx_create_array(p, sizeof(ngx_http_index_t), 5);
-    if (cf->indices == NULL)
-        return NULL;
-
-    cf->max_index_len = 0;
-
-    return cf;
-}
-
-static void *ngx_merge_index_config()
-{
-    if (p->indices->nelts > 0) {
-
-        copy and check dups
-
-        if (c->max_index_len < c->max_index_len)
-            c->max_index_len < c->max_index_len);
-    }
-}
-
-static void *ngx_set_index()
-{
-    if (*conf == NULL) {
-        cf = ngx_create_index_conf();
-        if (cf == NULL)
-            return "can not create config";
-    }
-
-    while (args) {
-       index = ngx_push_array(cf->indices);
-       index->name = arg;
-       index->len = ngx_strlen(arg) + 1;
-
-       if (cf->max_index_len < index->len)
-           cf->max_index_len = index->len;
-    }
-
-    *conf = cf;
-}
-
-#endif