annotate src/http/modules/ngx_http_autoindex_module.c @ 9274:46ecad404a29 default tip

Mail: reset imap tag to empty after authentication attempt. We need to reset the imap tag to empty after an authentication attempt completes, otherwise if the next line parsed is incomplete with no tag (e.g. empty line) then we use the "tag" from the previous buffer which is now definitely wrong and has been partially overwritten with the most recently read data (e.g. CRLF). An example before this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: S: obar BAD invalid command Then with this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: * BAD invalid command
author Rob Mueller <robm@fastmailteam.com>
date Wed, 15 May 2024 10:06:00 +0300
parents a91b93f3f3e7
children
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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4193
diff changeset
4 * Copyright (C) Nginx, Inc.
457
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 #if 0
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 typedef struct {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 ngx_buf_t *buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 size_t size;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 ngx_pool_t *pool;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 size_t alloc_size;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 ngx_chain_t **last_out;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 } ngx_http_autoindex_ctx_t;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 #endif
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 typedef struct {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 ngx_str_t name;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
28 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
29 size_t escape;
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
30 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
31
6a62bed048cd fix colon in file name for ngx_http_autoindex_module
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
32 unsigned dir:1;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
33 unsigned file:1;
2849
6a62bed048cd fix colon in file name for ngx_http_autoindex_module
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
34
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 time_t mtime;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 off_t size;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 } ngx_http_autoindex_entry_t;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 typedef struct {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 ngx_flag_t enable;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
42 ngx_uint_t format;
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
43 ngx_flag_t localtime;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
44 ngx_flag_t exact_size;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 } ngx_http_autoindex_loc_conf_t;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
48 #define NGX_HTTP_AUTOINDEX_HTML 0
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
49 #define NGX_HTTP_AUTOINDEX_JSON 1
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
50 #define NGX_HTTP_AUTOINDEX_JSONP 2
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
51 #define NGX_HTTP_AUTOINDEX_XML 3
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
52
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
53 #define NGX_HTTP_AUTOINDEX_PREALLOCATE 50
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
54
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
55 #define NGX_HTTP_AUTOINDEX_NAME_LEN 50
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
58 static ngx_buf_t *ngx_http_autoindex_html(ngx_http_request_t *r,
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
59 ngx_array_t *entries);
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
60 static ngx_buf_t *ngx_http_autoindex_json(ngx_http_request_t *r,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
61 ngx_array_t *entries, ngx_str_t *callback);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
62 static ngx_int_t ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
63 ngx_str_t *callback);
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
64 static ngx_buf_t *ngx_http_autoindex_xml(ngx_http_request_t *r,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
65 ngx_array_t *entries);
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
66
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
67 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
68 const void *two);
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
69 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
70 ngx_dir_t *dir, ngx_str_t *name);
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
71
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
72 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
73 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
74 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
75 void *parent, void *child);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
78 static ngx_conf_enum_t ngx_http_autoindex_format[] = {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
79 { ngx_string("html"), NGX_HTTP_AUTOINDEX_HTML },
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
80 { ngx_string("json"), NGX_HTTP_AUTOINDEX_JSON },
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
81 { ngx_string("jsonp"), NGX_HTTP_AUTOINDEX_JSONP },
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
82 { ngx_string("xml"), NGX_HTTP_AUTOINDEX_XML },
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
83 { ngx_null_string, 0 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
84 };
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
85
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
86
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 static ngx_command_t ngx_http_autoindex_commands[] = {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 { ngx_string("autoindex"),
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 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
91 ngx_conf_set_flag_slot,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 NGX_HTTP_LOC_CONF_OFFSET,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 offsetof(ngx_http_autoindex_loc_conf_t, enable),
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 NULL },
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
96 { ngx_string("autoindex_format"),
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
97 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
98 ngx_conf_set_enum_slot,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
99 NGX_HTTP_LOC_CONF_OFFSET,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
100 offsetof(ngx_http_autoindex_loc_conf_t, format),
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
101 &ngx_http_autoindex_format },
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
102
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
103 { ngx_string("autoindex_localtime"),
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
104 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
105 ngx_conf_set_flag_slot,
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
106 NGX_HTTP_LOC_CONF_OFFSET,
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
107 offsetof(ngx_http_autoindex_loc_conf_t, localtime),
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
108 NULL },
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
109
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
110 { ngx_string("autoindex_exact_size"),
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
111 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
112 ngx_conf_set_flag_slot,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
113 NGX_HTTP_LOC_CONF_OFFSET,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
114 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
115 NULL },
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
116
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 ngx_null_command
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 };
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
121 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
122 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
123 ngx_http_autoindex_init, /* postconfiguration */
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 NULL, /* create main configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 NULL, /* init main configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 NULL, /* create server configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 NULL, /* merge server configuration */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
4499
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
131 ngx_http_autoindex_create_loc_conf, /* create location configuration */
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
132 ngx_http_autoindex_merge_loc_conf /* merge location configuration */
457
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 ngx_module_t ngx_http_autoindex_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
137 NGX_MODULE_V1,
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
138 &ngx_http_autoindex_module_ctx, /* module context */
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 ngx_http_autoindex_commands, /* module directives */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
141 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
142 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
143 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
144 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
145 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
146 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
147 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
148 NGX_MODULE_V1_PADDING
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 };
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
152 static ngx_int_t
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
153 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
154 {
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
155 u_char *last, *filename;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
156 size_t len, allocated, root;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 ngx_err_t err;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 ngx_buf_t *b;
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
159 ngx_int_t rc;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
160 ngx_str_t path, callback;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 ngx_dir_t dir;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
162 ngx_uint_t level, format;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 ngx_pool_t *pool;
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
164 ngx_chain_t out;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 ngx_array_t entries;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 ngx_http_autoindex_entry_t *entry;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 ngx_http_autoindex_loc_conf_t *alcf;
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 (r->uri.data[r->uri.len - 1] != '/') {
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
645
4946078f0a79 nginx-0.3.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
173 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
174 return NGX_DECLINED;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
175 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
176
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 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
178
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 if (!alcf->enable) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 return NGX_DECLINED;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182
7164
044cb349fd3c Autoindex: discard request body (ticket #1439).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5945
diff changeset
183 rc = ngx_http_discard_request_body(r);
044cb349fd3c Autoindex: discard request body (ticket #1439).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5945
diff changeset
184
044cb349fd3c Autoindex: discard request body (ticket #1439).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5945
diff changeset
185 if (rc != NGX_OK) {
044cb349fd3c Autoindex: discard request body (ticket #1439).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5945
diff changeset
186 return rc;
044cb349fd3c Autoindex: discard request body (ticket #1439).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5945
diff changeset
187 }
044cb349fd3c Autoindex: discard request body (ticket #1439).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5945
diff changeset
188
773
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
189 last = ngx_http_map_uri_to_path(r, &path, &root,
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
190 NGX_HTTP_AUTOINDEX_PREALLOCATE);
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
191 if (last == NULL) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
192 return NGX_HTTP_INTERNAL_SERVER_ERROR;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
195 allocated = path.len;
1627
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
196 path.len = last - path.data;
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
197 if (path.len > 1) {
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
198 path.len--;
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
199 }
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
200 path.data[path.len] = '\0';
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 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
203 "http autoindex: \"%s\"", path.data);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
205 format = alcf->format;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
206
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
207 if (format == NGX_HTTP_AUTOINDEX_JSONP) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
208 if (ngx_http_autoindex_jsonp_callback(r, &callback) != NGX_OK) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
209 return NGX_HTTP_BAD_REQUEST;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
210 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
211
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
212 if (callback.len == 0) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
213 format = NGX_HTTP_AUTOINDEX_JSON;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
214 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
215 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
216
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
217 if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 err = ngx_errno;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
220 if (err == NGX_ENOENT
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
221 || err == NGX_ENOTDIR
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
222 || err == NGX_ENAMETOOLONG)
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
223 {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 level = NGX_LOG_ERR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 rc = NGX_HTTP_NOT_FOUND;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 } else if (err == NGX_EACCES) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 level = NGX_LOG_ERR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 rc = NGX_HTTP_FORBIDDEN;
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 } else {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 level = NGX_LOG_CRIT;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 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
237 ngx_open_dir_n " \"%s\" failed", path.data);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 return rc;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 #if (NGX_SUPPRESS_WARN)
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
243
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 /* 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
245 ngx_memzero(&entries, sizeof(ngx_array_t));
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
246
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 #endif
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
249 /* TODO: pool should be temporary pool */
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
250 pool = r->pool;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
251
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
252 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
253 != NGX_OK)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
255 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
258 r->headers_out.status = NGX_HTTP_OK;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
259
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
260 switch (format) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
261
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
262 case NGX_HTTP_AUTOINDEX_JSON:
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
263 ngx_str_set(&r->headers_out.content_type, "application/json");
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
264 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
265
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
266 case NGX_HTTP_AUTOINDEX_JSONP:
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
267 ngx_str_set(&r->headers_out.content_type, "application/javascript");
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
268 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
269
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
270 case NGX_HTTP_AUTOINDEX_XML:
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
271 ngx_str_set(&r->headers_out.content_type, "text/xml");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
272 ngx_str_set(&r->headers_out.charset, "utf-8");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
273 break;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
274
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
275 default: /* NGX_HTTP_AUTOINDEX_HTML */
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
276 ngx_str_set(&r->headers_out.content_type, "text/html");
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
277 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
278 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
279
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
280 r->headers_out.content_type_len = r->headers_out.content_type.len;
5497
2cfc095a607a Fixed setting of content type in some cases.
Ruslan Ermilov <ru@nginx.com>
parents: 5333
diff changeset
281 r->headers_out.content_type_lowcase = NULL;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
282
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
283 rc = ngx_http_send_header(r);
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
284
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
285 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
286 if (ngx_close_dir(&dir) == NGX_ERROR) {
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
287 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
288 ngx_close_dir_n " \"%V\" failed", &path);
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
289 }
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
290
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
291 return rc;
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
292 }
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
293
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
294 filename = path.data;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
295 filename[path.len] = '/';
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 for ( ;; ) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 ngx_set_errno(0);
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 if (ngx_read_dir(&dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 err = ngx_errno;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
303 if (err != NGX_ENOMOREFILES) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 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
305 ngx_read_dir_n " \"%V\" failed", &path);
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
306 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
309 break;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 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
313 "http autoindex file: \"%s\"", ngx_de_name(&dir));
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 len = ngx_de_namelen(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
317 if (ngx_de_name(&dir)[0] == '.') {
459
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
318 continue;
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
319 }
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
320
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 if (!dir.valid_info) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
323 /* 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
324
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
325 if (path.len + 1 + len + 1 > allocated) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
326 allocated = path.len + 1 + len + 1
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
327 + NGX_HTTP_AUTOINDEX_PREALLOCATE;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
328
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1627
diff changeset
329 filename = ngx_pnalloc(pool, allocated);
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
330 if (filename == NULL) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
331 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
334 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
335 *last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
340 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
341 err = ngx_errno;
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
342
5333
e8bca8397625 Autoindex: improved ngx_de_info() error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5332
diff changeset
343 if (err != NGX_ENOENT && err != NGX_ELOOP) {
497
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
344 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
345 ngx_de_info_n " \"%s\" failed", filename);
2371
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
346
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
347 if (err == NGX_EACCES) {
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
348 continue;
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
349 }
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
350
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
351 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
352 }
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
353
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
354 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
355 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
356 ngx_de_link_info_n " \"%s\" failed",
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
357 filename);
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
358 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
359 }
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 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
363 entry = ngx_array_push(&entries);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
364 if (entry == NULL) {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
365 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
368 entry->name.len = len;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
369
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1627
diff changeset
370 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
371 if (entry->name.data == NULL) {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
372 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 }
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
374
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 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
376
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 entry->dir = ngx_de_is_dir(&dir);
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
378 entry->file = ngx_de_is_file(&dir);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 entry->mtime = ngx_de_mtime(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 entry->size = ngx_de_size(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 if (ngx_close_dir(&dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
5218
f026adb935ad Fixed error logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5069
diff changeset
385 ngx_close_dir_n " \"%V\" failed", &path);
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
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
388 if (entries.nelts > 1) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
389 ngx_qsort(entries.elts, (size_t) entries.nelts,
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
390 sizeof(ngx_http_autoindex_entry_t),
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
391 ngx_http_autoindex_cmp_entries);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
392 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
393
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
394 switch (format) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
395
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
396 case NGX_HTTP_AUTOINDEX_JSON:
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
397 b = ngx_http_autoindex_json(r, &entries, NULL);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
398 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
399
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
400 case NGX_HTTP_AUTOINDEX_JSONP:
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
401 b = ngx_http_autoindex_json(r, &entries, &callback);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
402 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
403
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
404 case NGX_HTTP_AUTOINDEX_XML:
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
405 b = ngx_http_autoindex_xml(r, &entries);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
406 break;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
407
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
408 default: /* NGX_HTTP_AUTOINDEX_HTML */
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
409 b = ngx_http_autoindex_html(r, &entries);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
410 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
411 }
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
412
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
413 if (b == NULL) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
414 return NGX_ERROR;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
415 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
416
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
417 /* TODO: free temporary pool */
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
418
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
419 if (r == r->main) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
420 b->last_buf = 1;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
421 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
422
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
423 b->last_in_chain = 1;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
424
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
425 out.buf = b;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
426 out.next = NULL;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
427
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
428 return ngx_http_output_filter(r, &out);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
429 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
430
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
431
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
432 static ngx_buf_t *
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
433 ngx_http_autoindex_html(ngx_http_request_t *r, ngx_array_t *entries)
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
434 {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
435 u_char *last, scale;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
436 off_t length;
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
437 size_t len, entry_len, char_len, escape_html;
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
438 ngx_tm_t tm;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
439 ngx_buf_t *b;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
440 ngx_int_t size;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
441 ngx_uint_t i, utf8;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
442 ngx_time_t *tp;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
443 ngx_http_autoindex_entry_t *entry;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
444 ngx_http_autoindex_loc_conf_t *alcf;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
445
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
446 static u_char title[] =
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
447 "<html>" CRLF
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
448 "<head><title>Index of "
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
449 ;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
450
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
451 static u_char header[] =
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
452 "</title></head>" CRLF
7358
170922952477 Removed bgcolor attribute on body in error pages and autoindex.
Nova DasSarma <nova@novalinium.com>
parents: 7164
diff changeset
453 "<body>" CRLF
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
454 "<h1>Index of "
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
455 ;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
456
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
457 static u_char tail[] =
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
458 "</body>" CRLF
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
459 "</html>" CRLF
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
460 ;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
461
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
462 static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
463 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
464
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
465 if (r->headers_out.charset.len == 5
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
466 && ngx_strncasecmp(r->headers_out.charset.data, (u_char *) "utf-8", 5)
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
467 == 0)
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
468 {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
469 utf8 = 1;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
470
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
471 } else {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
472 utf8 = 0;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
473 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
474
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
475 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
476
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 len = sizeof(title) - 1
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
478 + r->uri.len + escape_html
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 + sizeof(header) - 1
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
480 + r->uri.len + escape_html
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 + sizeof("</h1>") - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 + sizeof("</pre><hr>") - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 + sizeof(tail) - 1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
486 entry = entries->elts;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
487 for (i = 0; i < entries->nelts; i++) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
488 entry[i].escape = 2 * ngx_escape_uri(NULL, entry[i].name.data,
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
489 entry[i].name.len,
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
490 NGX_ESCAPE_URI_COMPONENT);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
491
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
492 entry[i].escape_html = ngx_escape_html(NULL, entry[i].name.data,
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
493 entry[i].name.len);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
494
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
495 if (utf8) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
496 entry[i].utf_len = ngx_utf8_length(entry[i].name.data,
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
497 entry[i].name.len);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
498 } else {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
499 entry[i].utf_len = entry[i].name.len;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
500 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
501
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
502 entry_len = sizeof("<a href=\"") - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
503 + entry[i].name.len + entry[i].escape
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
504 + 1 /* 1 is for "/" */
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
505 + sizeof("\">") - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
506 + entry[i].name.len - entry[i].utf_len
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
507 + entry[i].escape_html
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
508 + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
509 + sizeof("</a>") - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
510 + sizeof(" 28-Sep-1970 12:00 ") - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
511 + 20 /* the file size */
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
512 + 2;
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
513
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
514 if (len > NGX_MAX_SIZE_T_VALUE - entry_len) {
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
515 return NULL;
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
516 }
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
517
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
518 len += entry_len;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
521 b = ngx_create_temp_buf(r->pool, len);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
522 if (b == NULL) {
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
523 return NULL;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 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
527
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
528 if (escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
529 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
530 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
531 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
532
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
533 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
534 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
535 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
536 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
537 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
538
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539 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
540
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 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
542 sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
544 alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
545 tp = ngx_timeofday();
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
546
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
547 for (i = 0; i < entries->nelts; i++) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 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
549
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
550 if (entry[i].escape) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
551 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
552 NGX_ESCAPE_URI_COMPONENT);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
553
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
554 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
555
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
556 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
557 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
558 entry[i].name.len);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
559 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 if (entry[i].dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 *b->last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 *b->last++ = '"';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566 *b->last++ = '>';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
568 len = entry[i].utf_len;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
569
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
570 if (entry[i].name.len != len) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
571 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
572 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
573
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
574 } else {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
575 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
576 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
577
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
578 last = b->last;
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
579 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
580 char_len, entry[i].name.len + 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
581
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
582 if (entry[i].escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
583 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
584 b->last - last);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
585 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
586
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
587 last = b->last;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
588
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
589 } else {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
590 if (entry[i].escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
591 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
592 char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
593
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
594 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
595 char_len = len;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
596 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
597
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
598 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
599 entry[i].name.data, char_len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
600 last = b->last;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
601
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
602 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
603 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
604 NGX_HTTP_AUTOINDEX_NAME_LEN + 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
605 last = b->last - 3;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
606 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
607 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
608
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
610 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
611
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 } else {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 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
614 *b->last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 len++;
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618 b->last = ngx_cpymem(b->last, "</a>", sizeof("</a>") - 1);
5069
e9d188e295cf Fixed false memset warning on Linux with -O3 (ticket #275).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
619
e9d188e295cf Fixed false memset warning on Linux with -O3 (ticket #275).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
620 if (NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {
e9d188e295cf Fixed false memset warning on Linux with -O3 (ticket #275).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
621 ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);
e9d188e295cf Fixed false memset warning on Linux with -O3 (ticket #275).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
622 b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;
e9d188e295cf Fixed false memset warning on Linux with -O3 (ticket #275).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
623 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 *b->last++ = ' ';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
628 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
629
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630 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
631 tm.ngx_tm_mday,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 months[tm.ngx_tm_mon - 1],
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633 tm.ngx_tm_year,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 tm.ngx_tm_hour,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 tm.ngx_tm_min);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
637 if (alcf->exact_size) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
638 if (entry[i].dir) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
639 b->last = ngx_cpymem(b->last, " -",
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
640 sizeof(" -") - 1);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
641 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
642 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
643 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645 } else {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
646 if (entry[i].dir) {
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
647 b->last = ngx_cpymem(b->last, " -",
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
648 sizeof(" -") - 1);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
649
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
650 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
651 length = entry[i].size;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
652
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
653 if (length > 1024 * 1024 * 1024 - 1) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
654 size = (ngx_int_t) (length / (1024 * 1024 * 1024));
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
655 if ((length % (1024 * 1024 * 1024))
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
656 > (1024 * 1024 * 1024 / 2 - 1))
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
657 {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
658 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
659 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
660 scale = 'G';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
661
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
662 } else if (length > 1024 * 1024 - 1) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
663 size = (ngx_int_t) (length / (1024 * 1024));
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
664 if ((length % (1024 * 1024)) > (1024 * 1024 / 2 - 1)) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
665 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
666 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
667 scale = 'M';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
668
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
669 } else if (length > 9999) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
670 size = (ngx_int_t) (length / 1024);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
671 if (length % 1024 > 511) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
672 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
673 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
674 scale = 'K';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
675
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
676 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
677 size = (ngx_int_t) length;
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
678 scale = '\0';
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
679 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
680
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
681 if (scale) {
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
682 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
683
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
684 } else {
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
685 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
686 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
687 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
689
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690 *b->last++ = CR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691 *b->last++ = LF;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
692 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
694 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
695
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
696 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
697
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
698 return b;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
699 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
700
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
701
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
702 static ngx_buf_t *
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
703 ngx_http_autoindex_json(ngx_http_request_t *r, ngx_array_t *entries,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
704 ngx_str_t *callback)
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
705 {
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
706 size_t len, entry_len;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
707 ngx_buf_t *b;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
708 ngx_uint_t i;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
709 ngx_http_autoindex_entry_t *entry;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
710
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
711 len = sizeof("[" CRLF CRLF "]") - 1;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
712
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
713 if (callback) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
714 len += sizeof("/* callback */" CRLF "();") - 1 + callback->len;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
715 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
716
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
717 entry = entries->elts;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
718
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
719 for (i = 0; i < entries->nelts; i++) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
720 entry[i].escape = ngx_escape_json(NULL, entry[i].name.data,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
721 entry[i].name.len);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
722
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
723 entry_len = sizeof("{ }," CRLF) - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
724 + sizeof("\"name\":\"\"") - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
725 + entry[i].name.len + entry[i].escape
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
726 + sizeof(", \"type\":\"directory\"") - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
727 + sizeof(", \"mtime\":\"Wed, 31 Dec 1986 10:00:00 GMT\"") - 1;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
728
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
729 if (entry[i].file) {
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
730 entry_len += sizeof(", \"size\":") - 1 + NGX_OFF_T_LEN;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
731 }
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
732
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
733 if (len > NGX_MAX_SIZE_T_VALUE - entry_len) {
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
734 return NULL;
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
735 }
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
736
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
737 len += entry_len;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
738 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
739
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
740 b = ngx_create_temp_buf(r->pool, len);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
741 if (b == NULL) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
742 return NULL;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
743 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
744
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
745 if (callback) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
746 b->last = ngx_cpymem(b->last, "/* callback */" CRLF,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
747 sizeof("/* callback */" CRLF) - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
748
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
749 b->last = ngx_cpymem(b->last, callback->data, callback->len);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
750
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
751 *b->last++ = '(';
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
752 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
753
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
754 *b->last++ = '[';
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
755
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
756 for (i = 0; i < entries->nelts; i++) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
757 b->last = ngx_cpymem(b->last, CRLF "{ \"name\":\"",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
758 sizeof(CRLF "{ \"name\":\"") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
759
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
760 if (entry[i].escape) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
761 b->last = (u_char *) ngx_escape_json(b->last, entry[i].name.data,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
762 entry[i].name.len);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
763 } else {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
764 b->last = ngx_cpymem(b->last, entry[i].name.data,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
765 entry[i].name.len);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
766 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
767
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
768 b->last = ngx_cpymem(b->last, "\", \"type\":\"",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
769 sizeof("\", \"type\":\"") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
770
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
771 if (entry[i].dir) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
772 b->last = ngx_cpymem(b->last, "directory", sizeof("directory") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
773
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
774 } else if (entry[i].file) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
775 b->last = ngx_cpymem(b->last, "file", sizeof("file") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
776
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
777 } else {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
778 b->last = ngx_cpymem(b->last, "other", sizeof("other") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
779 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
780
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
781 b->last = ngx_cpymem(b->last, "\", \"mtime\":\"",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
782 sizeof("\", \"mtime\":\"") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
783
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
784 b->last = ngx_http_time(b->last, entry[i].mtime);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
785
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
786 if (entry[i].file) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
787 b->last = ngx_cpymem(b->last, "\", \"size\":",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
788 sizeof("\", \"size\":") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
789 b->last = ngx_sprintf(b->last, "%O", entry[i].size);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
790
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
791 } else {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
792 *b->last++ = '"';
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
793 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
794
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
795 b->last = ngx_cpymem(b->last, " },", sizeof(" },") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
796 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
797
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
798 if (i > 0) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
799 b->last--; /* strip last comma */
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
800 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
801
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
802 b->last = ngx_cpymem(b->last, CRLF "]", sizeof(CRLF "]") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
803
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
804 if (callback) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
805 *b->last++ = ')'; *b->last++ = ';';
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
806 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
807
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
808 return b;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
809 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
810
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
811
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
812 static ngx_int_t
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
813 ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r, ngx_str_t *callback)
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
814 {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
815 u_char *p, c, ch;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
816 ngx_uint_t i;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
817
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
818 if (ngx_http_arg(r, (u_char *) "callback", 8, callback) != NGX_OK) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
819 callback->len = 0;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
820 return NGX_OK;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
821 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
822
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
823 if (callback->len > 128) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
824 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
825 "client sent too long callback name: \"%V\"", callback);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
826 return NGX_DECLINED;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
827 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
828
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
829 p = callback->data;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
830
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
831 for (i = 0; i < callback->len; i++) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
832 ch = p[i];
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
833
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
834 c = (u_char) (ch | 0x20);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
835 if (c >= 'a' && c <= 'z') {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
836 continue;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
837 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
838
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
839 if ((ch >= '0' && ch <= '9') || ch == '_' || ch == '.') {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
840 continue;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
841 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
842
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
843 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
844 "client sent invalid callback name: \"%V\"", callback);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
845
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
846 return NGX_DECLINED;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
847 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
848
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
849 return NGX_OK;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
850 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
851
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
852
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
853 static ngx_buf_t *
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
854 ngx_http_autoindex_xml(ngx_http_request_t *r, ngx_array_t *entries)
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
855 {
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
856 size_t len, entry_len;
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
857 ngx_tm_t tm;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
858 ngx_buf_t *b;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
859 ngx_str_t type;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
860 ngx_uint_t i;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
861 ngx_http_autoindex_entry_t *entry;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
862
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
863 static u_char head[] = "<?xml version=\"1.0\"?>" CRLF "<list>" CRLF;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
864 static u_char tail[] = "</list>" CRLF;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
865
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
866 len = sizeof(head) - 1 + sizeof(tail) - 1;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
867
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
868 entry = entries->elts;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
869
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
870 for (i = 0; i < entries->nelts; i++) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
871 entry[i].escape = ngx_escape_html(NULL, entry[i].name.data,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
872 entry[i].name.len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
873
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
874 entry_len = sizeof("<directory></directory>" CRLF) - 1
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
875 + entry[i].name.len + entry[i].escape
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
876 + sizeof(" mtime=\"1986-12-31T10:00:00Z\"") - 1;
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
877
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
878 if (entry[i].file) {
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
879 entry_len += sizeof(" size=\"\"") - 1 + NGX_OFF_T_LEN;
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
880 }
7435
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
881
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
882 if (len > NGX_MAX_SIZE_T_VALUE - entry_len) {
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
883 return NULL;
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
884 }
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
885
a91b93f3f3e7 Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov <vl@nginx.com>
parents: 7433
diff changeset
886 len += entry_len;
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
887 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
888
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
889 b = ngx_create_temp_buf(r->pool, len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
890 if (b == NULL) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
891 return NULL;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
892 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
893
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
894 b->last = ngx_cpymem(b->last, head, sizeof(head) - 1);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
895
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
896 for (i = 0; i < entries->nelts; i++) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
897 *b->last++ = '<';
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
898
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
899 if (entry[i].dir) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
900 ngx_str_set(&type, "directory");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
901
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
902 } else if (entry[i].file) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
903 ngx_str_set(&type, "file");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
904
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
905 } else {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
906 ngx_str_set(&type, "other");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
907 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
908
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
909 b->last = ngx_cpymem(b->last, type.data, type.len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
910
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
911 b->last = ngx_cpymem(b->last, " mtime=\"", sizeof(" mtime=\"") - 1);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
912
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
913 ngx_gmtime(entry[i].mtime, &tm);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
914
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
915 b->last = ngx_sprintf(b->last, "%4d-%02d-%02dT%02d:%02d:%02dZ",
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
916 tm.ngx_tm_year, tm.ngx_tm_mon,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
917 tm.ngx_tm_mday, tm.ngx_tm_hour,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
918 tm.ngx_tm_min, tm.ngx_tm_sec);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
919
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
920 if (entry[i].file) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
921 b->last = ngx_cpymem(b->last, "\" size=\"",
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
922 sizeof("\" size=\"") - 1);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
923 b->last = ngx_sprintf(b->last, "%O", entry[i].size);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
924 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
925
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
926 *b->last++ = '"'; *b->last++ = '>';
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
927
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
928 if (entry[i].escape) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
929 b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
930 entry[i].name.len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
931 } else {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
932 b->last = ngx_cpymem(b->last, entry[i].name.data,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
933 entry[i].name.len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
934 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
935
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
936 *b->last++ = '<'; *b->last++ = '/';
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
937
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
938 b->last = ngx_cpymem(b->last, type.data, type.len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
939
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
940 *b->last++ = '>';
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
941
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
942 *b->last++ = CR; *b->last++ = LF;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
943 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
944
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
945 b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
946
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
947 return b;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
948 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
949
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
950
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
951 static int ngx_libc_cdecl
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
952 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
953 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
954 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
955 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
956
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
957 if (first->dir && !second->dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
958 /* move the directories to the start */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
959 return -1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
960 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
961
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
962 if (!first->dir && second->dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
963 /* move the directories to the start */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
964 return 1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
965 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
966
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
967 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
968 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
969
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
970
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
971 #if 0
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
972
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
973 static ngx_buf_t *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
974 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
975 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
976 ngx_chain_t *cl;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
977
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
978 if (ctx->buf) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
979
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
980 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
981 return ctx->buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
982 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
983
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
984 ctx->size += ctx->buf->last - ctx->buf->pos;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
985 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
986
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
987 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
988 if (ctx->buf == NULL) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
989 return NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
990 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
991
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
992 cl = ngx_alloc_chain_link(ctx->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
993 if (cl == NULL) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
994 return NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
995 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
996
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
997 cl->buf = ctx->buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
998 cl->next = NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
999
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1000 *ctx->last_out = cl;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1001 ctx->last_out = &cl->next;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1002
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1003 return ctx->buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1004 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1005
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1006 #endif
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1007
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1008
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1009 static ngx_int_t
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
1010 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
1011 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1012 if (ngx_close_dir(dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1013 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
1014 ngx_close_dir_n " \"%V\" failed", name);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1015 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1016
5332
1a9700ef9725 Autoindex: return NGX_ERROR on error if headers were sent.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5218
diff changeset
1017 return r->header_sent ? NGX_ERROR : NGX_HTTP_INTERNAL_SERVER_ERROR;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1018 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1019
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1020
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1021 static void *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1022 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
1023 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1024 ngx_http_autoindex_loc_conf_t *conf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1025
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1026 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
1027 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
1028 return NULL;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1029 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1030
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 conf->enable = NGX_CONF_UNSET;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
1032 conf->format = NGX_CONF_UNSET_UINT;
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1033 conf->localtime = NGX_CONF_UNSET;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1034 conf->exact_size = NGX_CONF_UNSET;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1035
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1036 return conf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1037 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1038
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1040 static char *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1041 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
1042 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1043 ngx_http_autoindex_loc_conf_t *prev = parent;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1044 ngx_http_autoindex_loc_conf_t *conf = child;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1045
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1046 ngx_conf_merge_value(conf->enable, prev->enable, 0);
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
1047 ngx_conf_merge_uint_value(conf->format, prev->format,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
1048 NGX_HTTP_AUTOINDEX_HTML);
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1049 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
1050 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
1051
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1052 return NGX_CONF_OK;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1053 }
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1054
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1055
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1056 static ngx_int_t
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1057 ngx_http_autoindex_init(ngx_conf_t *cf)
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1058 {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1059 ngx_http_handler_pt *h;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1060 ngx_http_core_main_conf_t *cmcf;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1061
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1062 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
1063
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1064 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
1065 if (h == NULL) {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1066 return NGX_ERROR;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1067 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1068
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1069 *h = ngx_http_autoindex_handler;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1070
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1071 return NGX_OK;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1072 }