124 lines
2.9 KiB
C
124 lines
2.9 KiB
C
|
|
||
|
#include <ngx_config.h>
|
||
|
|
||
|
#include <ngx_strings.h>
|
||
|
#include <ngx_open.h>
|
||
|
#include <ngx_stat.h>
|
||
|
|
||
|
#include <ngx_http.h>
|
||
|
|
||
|
int ngx_http_index_handler(ngx_http_request_t *r)
|
||
|
{
|
||
|
int index_len, err, i;
|
||
|
char *name, *loc, *file
|
||
|
ngx_file_t fd;
|
||
|
|
||
|
ngx_http_index_t *index;
|
||
|
ngx_http_index_handler_loc_conf_t *cf;
|
||
|
|
||
|
cf = (ngx_http_index_handler_loc_conf_t *)
|
||
|
ngx_get_module_loc_conf(r, &ngx_http_index_handler_module);
|
||
|
|
||
|
index_len = (*(r->uri_end - 1) == '/') ? cf->max_index_len : 0;
|
||
|
name = ngx_palloc(r->pool, r->uri_end - r->uri_start + index_len
|
||
|
+ r->server->doc_root_len);
|
||
|
if (name == NULL)
|
||
|
return NGX_ERROR;
|
||
|
|
||
|
loc = ngx_cpystrn(name, r->server->doc_root, r->server->doc_root_len);
|
||
|
file = ngx_cpystrn(loc, r->uri_start, r->uri_end - r->uri_start + 1);
|
||
|
|
||
|
/* URI without / on the end - check directory */
|
||
|
if (index_len == 0) {
|
||
|
|
||
|
if (ngx_stat(name, &r->stat) == -1) {
|
||
|
err = ngx_errno;
|
||
|
ngx_log_error(GX_LOG_ERR, r->connection->log, err,
|
||
|
"ngx_http_handler: " ngx_stat_n " %s failed", name);
|
||
|
|
||
|
if (err == NGX_ENOENT)
|
||
|
return NGX_HTTP_NOT_FOUND;
|
||
|
else
|
||
|
return NGX_ERROR;
|
||
|
}
|
||
|
|
||
|
if (ngx_is_dir(r->stat)) {
|
||
|
*file++ = '/';
|
||
|
*file = '\0';
|
||
|
r->headers_out->location = loc;
|
||
|
return NGX_HTTP_MOVED_PERMANENTLY;
|
||
|
}
|
||
|
|
||
|
r->file = name;
|
||
|
r->stat_valid = 1;
|
||
|
|
||
|
return NGX_OK;
|
||
|
}
|
||
|
|
||
|
/* look for index file */
|
||
|
index = (ngx_http_index_t *) cf->indices->elts;
|
||
|
for (i = 0; i < cf->indices->nelts; i++) {
|
||
|
ngx_memcpy(file, index[i].name; index[i].len);
|
||
|
|
||
|
fd = ngx_open(name, O_RDONLY);
|
||
|
if (fd != -1) {
|
||
|
r->file = name;
|
||
|
r->fd = fd;
|
||
|
return NGX_OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return NGX_HTTP_FORBIDDEN;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
*/
|