aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/ngx_http_static_handler.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2002-12-15 06:25:09 +0000
committerIgor Sysoev <igor@sysoev.ru>2002-12-15 06:25:09 +0000
commit42feecbdb694e114e034f0be67d19bba4165c363 (patch)
treeaea7c9c7c12f3cfef321901ddf92846815f1b876 /src/http/modules/ngx_http_static_handler.c
parent3add464b545b5dd29d07873b84f90fb77021d0c4 (diff)
downloadnginx-42feecbdb694e114e034f0be67d19bba4165c363.tar.gz
nginx-42feecbdb694e114e034f0be67d19bba4165c363.zip
nginx-0.0.1-2002-12-15-09:25:09 import
Diffstat (limited to 'src/http/modules/ngx_http_static_handler.c')
-rw-r--r--src/http/modules/ngx_http_static_handler.c145
1 files changed, 62 insertions, 83 deletions
diff --git a/src/http/modules/ngx_http_static_handler.c b/src/http/modules/ngx_http_static_handler.c
index cded5f017..56f24cd07 100644
--- 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);
+
+ 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 (!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;
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ r->file.info_valid = 1;
}
- if (ngx_stat_fd(r->fd, &r->fileinfo) == -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);
+
+ 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);
- /* close fd */
- return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ 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_request_t *r)
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);
-*/
- if (r->header_only)
- return rc;
-
- /* TODO: NGX_HTTP_INTERNAL_SERVER_ERROR is too late */
-
- /* STUB */
+ /* 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);
- h->type = NGX_HUNK_FILE|NGX_HUNK_LAST;
- h->pos.file = 0;
- h->last.file = ngx_file_size(r->fileinfo);
-
- /* 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->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
+ rc = ngx_http_send_header(r);
+ if (r->header_only)
+ return rc;
- if (c->max_index_len < c->max_index_len)
- c->max_index_len < c->max_index_len);
- }
-}
+ h->type = NGX_HUNK_FILE|NGX_HUNK_LAST;
+ h->pos.file = 0;
+ h->last.file = ngx_file_size(r->file.info);
-static void *ngx_set_index()
-{
- if (*conf == NULL) {
- cf = ngx_create_index_conf();
- if (cf == NULL)
- return "can not create config";
- }
+ h->file->fd = r->file.fd;
+ h->file->log = r->connection->log;
- while (args) {
- index = ngx_push_array(cf->indices);
- index->name = arg;
- index->len = ngx_strlen(arg) + 1;
+ rc = ngx_http_output_filter(r, h);
- if (cf->max_index_len < index->len)
- cf->max_index_len = index->len;
- }
+ ngx_log_debug(r->connection->log, "0 output_filter: %d" _ rc);
- *conf = cf;
+ return rc;
}
-
-#endif