annotate src/http/modules/ngx_http_autoindex_module.c @ 4377:726a1ca9b52b

Proxy: made proxy_pass with variables more consistent. If proxy_pass was used with variables and there was no URI component, nginx always used unparsed URI. This isn't consistent with "no variables" case, where e.g. rewrites are applied even if there is no URI component. Fix is to use the same logic in both cases, i.e. only use unparsed URI if it's valid and request is the main one.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 23 Dec 2011 16:04:09 +0000
parents 63aa6ab94630
children d620f497c50f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 #if 0
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 typedef struct {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 ngx_buf_t *buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 size_t size;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 ngx_pool_t *pool;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 size_t alloc_size;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 ngx_chain_t **last_out;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 } ngx_http_autoindex_ctx_t;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 #endif
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 typedef struct {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 ngx_str_t name;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
27 size_t utf_len;
2849
6a62bed048cd fix colon in file name for ngx_http_autoindex_module
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
28 size_t escape;
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
29 size_t escape_html;
2849
6a62bed048cd fix colon in file name for ngx_http_autoindex_module
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
30
6a62bed048cd fix colon in file name for ngx_http_autoindex_module
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
31 unsigned dir:1;
6a62bed048cd fix colon in file name for ngx_http_autoindex_module
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
32
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 time_t mtime;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 off_t size;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 } ngx_http_autoindex_entry_t;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 typedef struct {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 ngx_flag_t enable;
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
40 ngx_flag_t localtime;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
41 ngx_flag_t exact_size;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 } ngx_http_autoindex_loc_conf_t;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
45 #define NGX_HTTP_AUTOINDEX_PREALLOCATE 50
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
46
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
47 #define NGX_HTTP_AUTOINDEX_NAME_LEN 50
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
50 static int ngx_libc_cdecl ngx_http_autoindex_cmp_entries(const void *one,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
51 const void *two);
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
52 static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r,
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
53 ngx_dir_t *dir, ngx_str_t *name);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
54 static ngx_int_t ngx_http_autoindex_init(ngx_conf_t *cf);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf,
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
57 void *parent, void *child);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 static ngx_command_t ngx_http_autoindex_commands[] = {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 { ngx_string("autoindex"),
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 ngx_conf_set_flag_slot,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 NGX_HTTP_LOC_CONF_OFFSET,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 offsetof(ngx_http_autoindex_loc_conf_t, enable),
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 NULL },
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
69 { ngx_string("autoindex_localtime"),
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
70 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
71 ngx_conf_set_flag_slot,
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
72 NGX_HTTP_LOC_CONF_OFFSET,
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
73 offsetof(ngx_http_autoindex_loc_conf_t, localtime),
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
74 NULL },
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
75
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
76 { ngx_string("autoindex_exact_size"),
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
77 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
78 ngx_conf_set_flag_slot,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
79 NGX_HTTP_LOC_CONF_OFFSET,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
80 offsetof(ngx_http_autoindex_loc_conf_t, exact_size),
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
81 NULL },
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
82
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 ngx_null_command
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 };
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
87 static ngx_http_module_t ngx_http_autoindex_module_ctx = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
88 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
89 ngx_http_autoindex_init, /* postconfiguration */
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 NULL, /* create main configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 NULL, /* init main configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 NULL, /* create server configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 NULL, /* merge server configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 ngx_http_autoindex_create_loc_conf, /* create location configration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_http_autoindex_merge_loc_conf /* merge location configration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 };
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 ngx_module_t ngx_http_autoindex_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
103 NGX_MODULE_V1,
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
104 &ngx_http_autoindex_module_ctx, /* module context */
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 ngx_http_autoindex_commands, /* module directives */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
107 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
108 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
109 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
110 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
111 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
112 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
113 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
114 NGX_MODULE_V1_PADDING
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 };
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 static u_char title[] =
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 "<html>" CRLF
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 "<head><title>Index of "
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 ;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 static u_char header[] =
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 "</title></head>" CRLF
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 "<body bgcolor=\"white\">" CRLF
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 "<h1>Index of "
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 ;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 static u_char tail[] =
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 "</body>" CRLF
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 "</html>" CRLF
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 ;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
136 static ngx_int_t
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
137 ngx_http_autoindex_handler(ngx_http_request_t *r)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
139 u_char *last, *filename, scale;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
140 off_t length;
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
141 size_t len, char_len, escape_html, allocated, root;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 ngx_tm_t tm;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ngx_err_t err;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 ngx_buf_t *b;
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
145 ngx_int_t rc, size;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
146 ngx_str_t path;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 ngx_dir_t dir;
2889
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
148 ngx_uint_t i, level, utf8;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 ngx_pool_t *pool;
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
150 ngx_time_t *tp;
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
151 ngx_chain_t out;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 ngx_array_t entries;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 ngx_http_autoindex_entry_t *entry;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 ngx_http_autoindex_loc_conf_t *alcf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 if (r->uri.data[r->uri.len - 1] != '/') {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 return NGX_DECLINED;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
645
4946078f0a79 nginx-0.3.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
163 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
164 return NGX_DECLINED;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
165 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
166
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 if (!alcf->enable) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 return NGX_DECLINED;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
173 /* NGX_DIR_MASK_LEN is lesser than NGX_HTTP_AUTOINDEX_PREALLOCATE */
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174
773
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
175 last = ngx_http_map_uri_to_path(r, &path, &root,
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
176 NGX_HTTP_AUTOINDEX_PREALLOCATE);
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
177 if (last == NULL) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
178 return NGX_HTTP_INTERNAL_SERVER_ERROR;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
181 allocated = path.len;
1627
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
182 path.len = last - path.data;
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
183 if (path.len > 1) {
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
184 path.len--;
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
185 }
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
186 path.data[path.len] = '\0';
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
189 "http autoindex: \"%s\"", path.data);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
191 if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 err = ngx_errno;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
194 if (err == NGX_ENOENT
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
195 || err == NGX_ENOTDIR
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
196 || err == NGX_ENAMETOOLONG)
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
197 {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 level = NGX_LOG_ERR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 rc = NGX_HTTP_NOT_FOUND;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 } else if (err == NGX_EACCES) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 level = NGX_LOG_ERR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 rc = NGX_HTTP_FORBIDDEN;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 } else {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 level = NGX_LOG_CRIT;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210 ngx_log_error(level, r->connection->log, err,
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
211 ngx_open_dir_n " \"%s\" failed", path.data);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 return rc;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 #if (NGX_SUPPRESS_WARN)
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
217
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 /* MSVC thinks 'entries' may be used without having been initialized */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 ngx_memzero(&entries, sizeof(ngx_array_t));
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
220
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 #endif
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
223 /* TODO: pool should be temporary pool */
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
224 pool = r->pool;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
225
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
226 if (ngx_array_init(&entries, pool, 40, sizeof(ngx_http_autoindex_entry_t))
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
227 != NGX_OK)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
229 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
232 r->headers_out.status = NGX_HTTP_OK;
842
d8e2613a2b55 charset could not be set for ngx_http_autoindex_module responses
Igor Sysoev <igor@sysoev.ru>
parents: 773
diff changeset
233 r->headers_out.content_type_len = sizeof("text/html") - 1;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
234 ngx_str_set(&r->headers_out.content_type, "text/html");
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
235
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
236 rc = ngx_http_send_header(r);
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
237
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
238 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
1499
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
239 if (ngx_close_dir(&dir) == NGX_ERROR) {
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
240 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
241 ngx_close_dir_n " \"%V\" failed", &path);
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
242 }
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
243
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
244 return rc;
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
245 }
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
246
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
247 filename = path.data;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
248 filename[path.len] = '/';
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249
2889
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
250 if (r->headers_out.charset.len == 5
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
251 && ngx_strncasecmp(r->headers_out.charset.data, (u_char *) "utf-8", 5)
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
252 == 0)
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
253 {
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
254 utf8 = 1;
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
255
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
256 } else {
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
257 utf8 = 0;
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
258 }
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
259
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 for ( ;; ) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 ngx_set_errno(0);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 if (ngx_read_dir(&dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 err = ngx_errno;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
266 if (err != NGX_ENOMOREFILES) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
268 ngx_read_dir_n " \"%V\" failed", &path);
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
269 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
272 break;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 "http autoindex file: \"%s\"", ngx_de_name(&dir));
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 len = ngx_de_namelen(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
280 if (ngx_de_name(&dir)[0] == '.') {
459
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
281 continue;
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
282 }
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
283
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 if (!dir.valid_info) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
286 /* 1 byte for '/' and 1 byte for terminating '\0' */
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
288 if (path.len + 1 + len + 1 > allocated) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
289 allocated = path.len + 1 + len + 1
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
290 + NGX_HTTP_AUTOINDEX_PREALLOCATE;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
291
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1627
diff changeset
292 filename = ngx_pnalloc(pool, allocated);
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
293 if (filename == NULL) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
294 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
297 last = ngx_cpystrn(filename, path.data, path.len + 1);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 *last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
303 if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {
497
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
304 err = ngx_errno;
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
305
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
306 if (err != NGX_ENOENT) {
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
307 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
308 ngx_de_info_n " \"%s\" failed", filename);
2371
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
309
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
310 if (err == NGX_EACCES) {
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
311 continue;
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
312 }
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
313
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
314 return ngx_http_autoindex_error(r, &dir, &path);
497
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
315 }
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
316
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
317 if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {
497
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
318 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
319 ngx_de_link_info_n " \"%s\" failed",
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
320 filename);
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
321 return ngx_http_autoindex_error(r, &dir, &path);
497
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
322 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
326 entry = ngx_array_push(&entries);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
327 if (entry == NULL) {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
328 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
331 entry->name.len = len;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
332
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1627
diff changeset
333 entry->name.data = ngx_pnalloc(pool, len + 1);
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
334 if (entry->name.data == NULL) {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
335 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 }
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
337
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
340 entry->escape = 2 * ngx_escape_uri(NULL, ngx_de_name(&dir), len,
4192
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3527
diff changeset
341 NGX_ESCAPE_URI_COMPONENT);
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
342
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
343 entry->escape_html = ngx_escape_html(NULL, entry->name.data,
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
344 entry->name.len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
345
2889
0bb8c54f4c45 refactor ngx_http_charset_header_filter()
Igor Sysoev <igor@sysoev.ru>
parents: 2849
diff changeset
346 if (utf8) {
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
347 entry->utf_len = ngx_utf8_length(entry->name.data, entry->name.len);
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
348 } else {
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
349 entry->utf_len = len;
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
350 }
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
351
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352 entry->dir = ngx_de_is_dir(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 entry->mtime = ngx_de_mtime(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 entry->size = ngx_de_size(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 if (ngx_close_dir(&dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
359 ngx_close_dir_n " \"%s\" failed", &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
362 escape_html = ngx_escape_html(NULL, r->uri.data, r->uri.len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
363
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 len = sizeof(title) - 1
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
365 + r->uri.len + escape_html
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 + sizeof(header) - 1
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
367 + r->uri.len + escape_html
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368 + sizeof("</h1>") - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 + sizeof("</pre><hr>") - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 + sizeof(tail) - 1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 entry = entries.elts;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 for (i = 0; i < entries.nelts; i++) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 len += sizeof("<a href=\"") - 1
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
376 + entry[i].name.len + entry[i].escape
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
377 + 1 /* 1 is for "/" */
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
378 + sizeof("\">") - 1
4192
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3527
diff changeset
379 + entry[i].name.len - entry[i].utf_len
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
380 + entry[i].escape_html
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
381 + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
382 + sizeof("</a>") - 1
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
383 + sizeof(" 28-Sep-1970 12:00 ") - 1
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
384 + 20 /* the file size */
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
385 + 2;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
388 b = ngx_create_temp_buf(r->pool, len);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
389 if (b == NULL) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 return NGX_HTTP_INTERNAL_SERVER_ERROR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 if (entries.nelts > 1) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 ngx_qsort(entry, (size_t) entries.nelts,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 sizeof(ngx_http_autoindex_entry_t),
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 ngx_http_autoindex_cmp_entries);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 b->last = ngx_cpymem(b->last, title, sizeof(title) - 1);
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
400
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
401 if (escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
402 b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
403 b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
404 b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
405
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
406 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
407 b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
408 b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
409 b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
410 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
411
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 b->last = ngx_cpymem(b->last, "</h1>", sizeof("</h1>") - 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 b->last = ngx_cpymem(b->last, "<hr><pre><a href=\"../\">../</a>" CRLF,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
417 tp = ngx_timeofday();
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
418
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 for (i = 0; i < entries.nelts; i++) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 b->last = ngx_cpymem(b->last, "<a href=\"", sizeof("<a href=\"") - 1);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
421
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
422 if (entry[i].escape) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
423 ngx_escape_uri(b->last, entry[i].name.data, entry[i].name.len,
4192
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3527
diff changeset
424 NGX_ESCAPE_URI_COMPONENT);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
425
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
426 b->last += entry[i].name.len + entry[i].escape;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
427
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
428 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
429 b->last = ngx_cpymem(b->last, entry[i].name.data,
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
430 entry[i].name.len);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
431 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 if (entry[i].dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 *b->last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 *b->last++ = '"';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 *b->last++ = '>';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
440 len = entry[i].utf_len;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
442 if (entry[i].name.len != len) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
443 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
444 char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3 + 1;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
445
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
446 } else {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
447 char_len = NGX_HTTP_AUTOINDEX_NAME_LEN + 1;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
448 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
449
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
450 last = b->last;
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
451 b->last = ngx_utf8_cpystrn(b->last, entry[i].name.data,
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
452 char_len, entry[i].name.len + 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
453
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
454 if (entry[i].escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
455 b->last = (u_char *) ngx_escape_html(last, entry[i].name.data,
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
456 b->last - last);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
457 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
458
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
459 last = b->last;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
460
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
461 } else {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
462 if (entry[i].escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
463 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
464 char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
465
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
466 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
467 char_len = len;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
468 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
469
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
470 b->last = (u_char *) ngx_escape_html(b->last,
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
471 entry[i].name.data, char_len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
472 last = b->last;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
473
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
474 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
475 b->last = ngx_cpystrn(b->last, entry[i].name.data,
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
476 NGX_HTTP_AUTOINDEX_NAME_LEN + 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
477 last = b->last - 3;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
478 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
479 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
480
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
482 b->last = ngx_cpymem(last, "..&gt;</a>", sizeof("..&gt;</a>") - 1);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 } else {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 if (entry[i].dir && NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486 *b->last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487 len++;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 b->last = ngx_cpymem(b->last, "</a>", sizeof("</a>") - 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 *b->last++ = ' ';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
497 ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 tm.ngx_tm_mday,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 months[tm.ngx_tm_mon - 1],
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 tm.ngx_tm_year,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 tm.ngx_tm_hour,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504 tm.ngx_tm_min);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
506 if (alcf->exact_size) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
507 if (entry[i].dir) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
508 b->last = ngx_cpymem(b->last, " -",
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
509 sizeof(" -") - 1);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
510 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
511 b->last = ngx_sprintf(b->last, "%19O", entry[i].size);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
512 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 } else {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
515 if (entry[i].dir) {
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
516 b->last = ngx_cpymem(b->last, " -",
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
517 sizeof(" -") - 1);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
518
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
519 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
520 length = entry[i].size;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
521
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
522 if (length > 1024 * 1024 * 1024 - 1) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
523 size = (ngx_int_t) (length / (1024 * 1024 * 1024));
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
524 if ((length % (1024 * 1024 * 1024))
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
525 > (1024 * 1024 * 1024 / 2 - 1))
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
526 {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
527 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
528 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
529 scale = 'G';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
530
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
531 } else if (length > 1024 * 1024 - 1) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
532 size = (ngx_int_t) (length / (1024 * 1024));
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
533 if ((length % (1024 * 1024)) > (1024 * 1024 / 2 - 1)) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
534 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
535 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
536 scale = 'M';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
537
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
538 } else if (length > 9999) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
539 size = (ngx_int_t) (length / 1024);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
540 if (length % 1024 > 511) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
541 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
542 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
543 scale = 'K';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
544
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
545 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
546 size = (ngx_int_t) length;
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
547 scale = '\0';
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
548 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
549
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
550 if (scale) {
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
551 b->last = ngx_sprintf(b->last, "%6i%c", size, scale);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
552
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
553 } else {
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
554 b->last = ngx_sprintf(b->last, " %6i", size);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
555 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
556 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559 *b->last++ = CR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560 *b->last++ = LF;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562
459
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
563 /* TODO: free temporary pool */
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
564
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
569 if (r == r->main) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570 b->last_buf = 1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
573 b->last_in_chain = 1;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
574
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575 out.buf = b;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
576 out.next = NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 return ngx_http_output_filter(r, &out);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
582 static int ngx_libc_cdecl
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
583 ngx_http_autoindex_cmp_entries(const void *one, const void *two)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 ngx_http_autoindex_entry_t *first = (ngx_http_autoindex_entry_t *) one;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586 ngx_http_autoindex_entry_t *second = (ngx_http_autoindex_entry_t *) two;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
587
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
588 if (first->dir && !second->dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589 /* move the directories to the start */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590 return -1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 if (!first->dir && second->dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594 /* move the directories to the start */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 return 1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598 return (int) ngx_strcmp(first->name.data, second->name.data);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
601
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602 #if 0
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
604 static ngx_buf_t *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
605 ngx_http_autoindex_alloc(ngx_http_autoindex_ctx_t *ctx, size_t size)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607 ngx_chain_t *cl;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 if (ctx->buf) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611 if ((size_t) (ctx->buf->end - ctx->buf->last) >= size) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 return ctx->buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 ctx->size += ctx->buf->last - ctx->buf->pos;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
618 ctx->buf = ngx_create_temp_buf(ctx->pool, ctx->alloc_size);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
619 if (ctx->buf == NULL) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
620 return NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
623 cl = ngx_alloc_chain_link(ctx->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
624 if (cl == NULL) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 return NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 cl->buf = ctx->buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629 cl->next = NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631 *ctx->last_out = cl;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 ctx->last_out = &cl->next;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 return ctx->buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637 #endif
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
639
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
640 static ngx_int_t
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
641 ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643 if (ngx_close_dir(dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
645 ngx_close_dir_n " \"%V\" failed", name);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 return NGX_HTTP_INTERNAL_SERVER_ERROR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
652 static void *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
653 ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655 ngx_http_autoindex_loc_conf_t *conf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 conf = ngx_palloc(cf->pool, sizeof(ngx_http_autoindex_loc_conf_t));
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2889
diff changeset
659 return NULL;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662 conf->enable = NGX_CONF_UNSET;
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
663 conf->localtime = NGX_CONF_UNSET;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
664 conf->exact_size = NGX_CONF_UNSET;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666 return conf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
667 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
670 static char *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
671 ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
672 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673 ngx_http_autoindex_loc_conf_t *prev = parent;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674 ngx_http_autoindex_loc_conf_t *conf = child;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
675
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
676 ngx_conf_merge_value(conf->enable, prev->enable, 0);
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
677 ngx_conf_merge_value(conf->localtime, prev->localtime, 0);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
678 ngx_conf_merge_value(conf->exact_size, prev->exact_size, 1);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680 return NGX_CONF_OK;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
681 }
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
682
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
683
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
684 static ngx_int_t
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
685 ngx_http_autoindex_init(ngx_conf_t *cf)
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
686 {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
687 ngx_http_handler_pt *h;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
688 ngx_http_core_main_conf_t *cmcf;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
689
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
690 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
691
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
692 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
693 if (h == NULL) {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
694 return NGX_ERROR;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
695 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
696
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
697 *h = ngx_http_autoindex_handler;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
698
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
699 return NGX_OK;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
700 }