annotate src/http/modules/ngx_http_autoindex_handler.c @ 34:aab2ea7c0458 NGINX_0_1_17

nginx 0.1.17 *) Change: the ngx_http_rewrite_module was rewritten from the scratch. Now it is possible to redirect, to return the error codes, to check the variables and referrers. The directives can be used inside locations. The redirect directive was canceled. *) Feature: the ngx_http_geo_module. *) Feature: the proxy_set_x_var and fastcgi_set_var directives. *) Bugfix: the location configuration with "=" modifier may be used in another location. *) Bugfix: the correct content type was set only for requests that use small caps letters in extension. *) Bugfix: if the proxy_pass or fastcgi_pass directives were set in the location, and access was denied, and the error was redirected to a static page, then the segmentation fault occurred. *) Bugfix: if in a proxied "Location" header was a relative URL, then a host name and a slash were added to them; bug appeared in 0.1.14. *) Bugfix: the system error message was not logged on Linux.
author Igor Sysoev <http://sysoev.ru>
date Thu, 03 Feb 2005 00:00:00 +0300
parents 8b6db3bda591
children 2879cd3a40cb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12 #if 0
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 typedef struct {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 ngx_buf_t *buf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 size_t size;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 ngx_pool_t *pool;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 size_t alloc_size;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 ngx_chain_t **last_out;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 } ngx_http_autoindex_ctx_t;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 #endif
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 typedef struct {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 ngx_str_t name;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
27 ngx_uint_t escape;
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 ngx_uint_t dir;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 time_t mtime;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 off_t size;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 } ngx_http_autoindex_entry_t;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 typedef struct {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 ngx_flag_t enable;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 } ngx_http_autoindex_loc_conf_t;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 #define NGX_HTTP_AUTOINDEX_NAME_LEN 50
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 static int ngx_http_autoindex_cmp_entries(const void *one, const void *two);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 u_char *name);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 static ngx_int_t ngx_http_autoindex_init(ngx_cycle_t *cycle);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 void *parent, void *child);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 static ngx_command_t ngx_http_autoindex_commands[] = {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 { ngx_string("autoindex"),
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 ngx_conf_set_flag_slot,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 NGX_HTTP_LOC_CONF_OFFSET,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 offsetof(ngx_http_autoindex_loc_conf_t, enable),
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 NULL },
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 ngx_null_command
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 };
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 ngx_http_module_t ngx_http_autoindex_module_ctx = {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 NULL, /* pre conf */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 NULL, /* create main configuration */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 NULL, /* init main configuration */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 NULL, /* create server configuration */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 NULL, /* merge server configuration */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 ngx_http_autoindex_create_loc_conf, /* create location configration */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 ngx_http_autoindex_merge_loc_conf /* merge location configration */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 };
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 ngx_module_t ngx_http_autoindex_module = {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 NGX_MODULE,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 &ngx_http_autoindex_module_ctx, /* module context */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 ngx_http_autoindex_commands, /* module directives */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 NGX_HTTP_MODULE, /* module type */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 ngx_http_autoindex_init, /* init module */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 NULL /* init child */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 };
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 static u_char title[] =
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 "<html>" CRLF
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 "<head><title>Index of "
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 ;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 static u_char header[] =
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 "</title></head>" CRLF
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 "<body bgcolor=\"white\">" CRLF
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 "<h1>Index of "
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 ;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 static u_char tail[] =
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 "</body>" CRLF
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 "</html>" CRLF
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 ;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 static ngx_int_t ngx_http_autoindex_handler(ngx_http_request_t *r)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 {
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 16
diff changeset
108 u_char *last;
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 size_t len;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 ngx_tm_t tm;
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 16
diff changeset
111 ngx_int_t rc;
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 ngx_uint_t i, level;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 ngx_err_t err;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 ngx_buf_t *b;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 ngx_chain_t out;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 ngx_str_t dname, fname;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 ngx_dir_t dir;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 ngx_pool_t *pool;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 ngx_array_t entries;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 ngx_http_core_loc_conf_t *clcf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 ngx_http_autoindex_entry_t *entry;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 ngx_http_autoindex_loc_conf_t *alcf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 if (r->uri.data[r->uri.len - 1] != '/') {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 return NGX_DECLINED;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 if (!alcf->enable) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 return NGX_DECLINED;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 /* TODO: pool should be temporary pool */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 pool = r->pool;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 if (clcf->alias) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143 dname.data = ngx_palloc(pool, clcf->root.len + r->uri.len
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 + NGX_DIR_MASK_LEN
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 - clcf->name.len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 if (dname.data == NULL) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 return NGX_HTTP_INTERNAL_SERVER_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150 last = ngx_cpymem(dname.data, clcf->root.data, clcf->root.len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 last = ngx_cpystrn(last, r->uri.data + clcf->name.len,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 r->uri.len - clcf->name.len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154 } else {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 dname.data = ngx_palloc(pool, clcf->root.len + r->uri.len
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 + NGX_DIR_MASK_LEN);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 if (dname.data == NULL) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 return NGX_HTTP_INTERNAL_SERVER_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 last = ngx_cpymem(dname.data, clcf->root.data, clcf->root.len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162 last = ngx_cpystrn(last, r->uri.data, r->uri.len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 dname.len = last - dname.data;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 "http autoindex: \"%s\"", dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 if (ngx_open_dir(&dname, &dir) == NGX_ERROR) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 err = ngx_errno;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 level = NGX_LOG_ERR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 rc = NGX_HTTP_NOT_FOUND;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 } else if (err == NGX_EACCES) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 level = NGX_LOG_ERR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 rc = NGX_HTTP_FORBIDDEN;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 } else {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 level = NGX_LOG_CRIT;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 ngx_log_error(level, r->connection->log, err,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 ngx_open_dir_n " \"%s\" failed", dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 return rc;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 #if (NGX_SUPPRESS_WARN)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 /* MSVC thinks 'entries' may be used without having been initialized */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 ngx_memzero(&entries, sizeof(ngx_array_t));
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 #endif
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 if (ngx_array_init(&entries, pool, 50, sizeof(ngx_http_autoindex_entry_t))
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 == NGX_ERROR)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 return ngx_http_autoindex_error(r, &dir, dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 fname.len = 0;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 #if (NGX_SUPPRESS_WARN)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 fname.data = NULL;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 #endif
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 for ( ;; ) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 ngx_set_errno(0);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213 if (ngx_read_dir(&dir) == NGX_ERROR) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214 err = ngx_errno;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 if (err == NGX_ENOMOREFILES) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 rc = NGX_OK;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 } else {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 ngx_read_dir_n " \"%s\" failed", dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 return ngx_http_autoindex_error(r, &dir, dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 break;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 "http autoindex file: \"%s\"", ngx_de_name(&dir));
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 len = ngx_de_namelen(&dir);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232
8
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
233 if (len == 1 && ngx_de_name(&dir)[0] == '.') {
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
234 continue;
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
235 }
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
236
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
237 if (len == 2
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
238 && ngx_de_name(&dir)[0] == '.'
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
239 && ngx_de_name(&dir)[0] == '.')
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
240 {
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
241 continue;
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
242 }
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
243
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 if (!dir.valid_info) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 if (dname.len + 1 + len > fname.len) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 fname.len = dname.len + 1 + len + 32;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 if (!(fname.data = ngx_palloc(pool, fname.len))) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 return ngx_http_autoindex_error(r, &dir, dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 last = ngx_cpystrn(fname.data, dname.data,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 dname.len + 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 *last++ = '/';
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 if (ngx_de_info(fname.data, &dir) == NGX_FILE_ERROR) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 ngx_de_info_n " \"%s\" failed", fname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 return ngx_http_autoindex_error(r, &dir, dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 if (!(entry = ngx_array_push(&entries))) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 return ngx_http_autoindex_error(r, &dir, dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 entry->name.len = len;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
272 entry->escape = 2 * ngx_escape_uri(NULL, ngx_de_name(&dir), len,
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
273 NGX_ESCAPE_HTML);
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
275 if (!(entry->name.data = ngx_palloc(pool, len + entry->escape + 1))) {
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 return ngx_http_autoindex_error(r, &dir, dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 }
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
278
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 entry->dir = ngx_de_is_dir(&dir);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 entry->mtime = ngx_de_mtime(&dir);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 entry->size = ngx_de_size(&dir);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 if (ngx_close_dir(&dir) == NGX_ERROR) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288 ngx_close_dir_n " \"%s\" failed", dname.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 len = sizeof(title) - 1
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 + r->uri.len
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 + sizeof(header) - 1
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 + r->uri.len
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 + sizeof("</h1>") - 1
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 + sizeof("</pre><hr>") - 1
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298 + sizeof(tail) - 1;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 entry = entries.elts;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 for (i = 0; i < entries.nelts; i++) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 len += sizeof("<a href=\"") - 1
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 + 1 /* 1 is for "/" */
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
304 + entry[i].name.len + entry[i].escape
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 + sizeof("\">") - 1
16
74b1868dd3cd nginx 0.1.8
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
306 + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 + sizeof("</a>") - 1
16
74b1868dd3cd nginx 0.1.8
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
308 + sizeof(" 28-Sep-1970 12:00 ") - 1
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 16
diff changeset
309 + 19
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 + 2;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 if (!(b = ngx_create_temp_buf(r->pool, len))) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 return NGX_HTTP_INTERNAL_SERVER_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317 if (entries.nelts > 1) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 ngx_qsort(entry, (size_t) entries.nelts,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 sizeof(ngx_http_autoindex_entry_t),
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 ngx_http_autoindex_cmp_entries);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 b->last = ngx_cpymem(b->last, title, sizeof(title) - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324 b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326 b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327 b->last = ngx_cpymem(b->last, "</h1>", sizeof("</h1>") - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 b->last = ngx_cpymem(b->last, "<hr><pre><a href=\"../\">../</a>" CRLF,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 for (i = 0; i < entries.nelts; i++) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 b->last = ngx_cpymem(b->last, "<a href=\"", sizeof("<a href=\"") - 1);
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
334
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
335 if (entry[i].escape) {
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
336 ngx_escape_uri(b->last, entry[i].name.data, entry[i].name.len,
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
337 NGX_ESCAPE_HTML);
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
338
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
339 b->last += entry[i].name.len + entry[i].escape;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
340
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
341 } else {
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
342 b->last = ngx_cpymem(b->last, entry[i].name.data,
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
343 entry[i].name.len);
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 8
diff changeset
344 }
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346 if (entry[i].dir) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 *b->last++ = '/';
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 *b->last++ = '"';
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351 *b->last++ = '>';
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 b->last = ngx_cpystrn(b->last, entry[i].name.data,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
354 NGX_HTTP_AUTOINDEX_NAME_LEN + 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 len = entry[i].name.len;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 b->last = ngx_cpymem(b->last - 3, "..&gt;</a>",
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 sizeof("..&gt;</a>") - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362 } else {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 if (entry[i].dir && NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364 *b->last++ = '/';
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365 len++;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 b->last = ngx_cpymem(b->last, "</a>", sizeof("</a>") - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370 b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 *b->last++ = ' ';
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375 ngx_gmtime(entry[i].mtime, &tm);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 tm.ngx_tm_mday,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 months[tm.ngx_tm_mon - 1],
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 tm.ngx_tm_year,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 tm.ngx_tm_hour,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 tm.ngx_tm_min);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 if (entry[i].dir) {
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 16
diff changeset
385 b->last = ngx_cpymem(b->last, " -",
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 16
diff changeset
386 sizeof(" -") - 1);
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388 } else {
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 16
diff changeset
389 b->last = ngx_sprintf(b->last, "%19O", entry[i].size);
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 *b->last++ = CR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393 *b->last++ = LF;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395
8
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
396 /* TODO: free temporary pool */
983306b77348 nginx 0.1.4
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
397
6
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400 b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 r->headers_out.status = NGX_HTTP_OK;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 r->headers_out.content_length_n = b->last - b->pos;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405 r->headers_out.content_type = ngx_list_push(&r->headers_out.headers);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406 if (r->headers_out.content_type == NULL) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407 return NGX_HTTP_INTERNAL_SERVER_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 r->headers_out.content_type->key.len = 0;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 r->headers_out.content_type->key.data = NULL;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412 r->headers_out.content_type->value.len = sizeof("text/html") - 1;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 r->headers_out.content_type->value.data = (u_char *) "text/html";
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415 rc = ngx_http_send_header(r);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418 return rc;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421 if (!r->main) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 b->last_buf = 1;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 out.buf = b;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 out.next = NULL;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428 return ngx_http_output_filter(r, &out);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432 static int ngx_http_autoindex_cmp_entries(const void *one, const void *two)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433 {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434 ngx_http_autoindex_entry_t *first = (ngx_http_autoindex_entry_t *) one;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435 ngx_http_autoindex_entry_t *second = (ngx_http_autoindex_entry_t *) two;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 if (first->dir && !second->dir) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438 /* move the directories to the start */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439 return -1;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442 if (!first->dir && second->dir) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 /* move the directories to the start */
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 return 1;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 return (int) ngx_strcmp(first->name.data, second->name.data);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451 #if 0
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453 static ngx_buf_t *ngx_http_autoindex_alloc(ngx_http_autoindex_ctx_t *ctx,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 size_t size)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 ngx_chain_t *cl;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 if (ctx->buf) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460 if ((size_t) (ctx->buf->end - ctx->buf->last) >= size) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461 return ctx->buf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464 ctx->size += ctx->buf->last - ctx->buf->pos;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 if (!(ctx->buf = ngx_create_temp_buf(ctx->pool, ctx->alloc_size))) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 return NULL;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 if (!(cl = ngx_alloc_chain_link(ctx->pool))) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 return NULL;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 cl->buf = ctx->buf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476 cl->next = NULL;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
477
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
478 *ctx->last_out = cl;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
479 ctx->last_out = &cl->next;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481 return ctx->buf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
483
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
484 #endif
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488 u_char *name)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490 if (ngx_close_dir(dir) == NGX_ERROR) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492 ngx_close_dir_n " \"%s\" failed", name);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495 return NGX_HTTP_INTERNAL_SERVER_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499 static ngx_int_t ngx_http_autoindex_init(ngx_cycle_t *cycle)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
500 {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
501 ngx_http_handler_pt *h;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
502 ngx_http_core_main_conf_t *cmcf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
503
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
504 cmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_core_module);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
505
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
506 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507 if (h == NULL) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508 return NGX_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
509 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
510
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
511 *h = ngx_http_autoindex_handler;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
512
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
513 return NGX_OK;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
514 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
515
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517 static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518 {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 ngx_http_autoindex_loc_conf_t *conf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
520
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
521 conf = ngx_palloc(cf->pool, sizeof(ngx_http_autoindex_loc_conf_t));
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522 if (conf == NULL) {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
523 return NGX_CONF_ERROR;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
524 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
525
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
526 conf->enable = NGX_CONF_UNSET;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
527
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
528 return conf;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
529 }
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
530
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
531
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
532 static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf,
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
533 void *parent, void *child)
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
534 {
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
535 ngx_http_autoindex_loc_conf_t *prev = parent;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
536 ngx_http_autoindex_loc_conf_t *conf = child;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
537
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
538 ngx_conf_merge_value(conf->enable, prev->enable, 0);
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
539
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 return NGX_CONF_OK;
80ba094c6b3e nginx 0.1.3
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 }