annotate src/http/modules/ngx_http_autoindex_module.c @ 6059:c81d79a7befd

SPDY: always push pending data. This helps to avoid suboptimal behavior when a client waits for a control frame or more data to increase window size, but the frames have been delayed in the socket buffer. The delays can be caused by bad interaction between Nagle's algorithm on nginx side and delayed ACK on the client side or by TCP_CORK/TCP_NOPUSH if SPDY was working without SSL and sendfile() was used. The pushing code is now very similar to ngx_http_set_keepalive().
author Valentin Bartenev <vbart@nginx.com>
date Mon, 23 Mar 2015 21:04:13 +0300
parents 99751fe3bc3b
children 044cb349fd3c
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
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
183 /* NGX_DIR_MASK_LEN is lesser than NGX_HTTP_AUTOINDEX_PREALLOCATE */
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184
773
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
185 last = ngx_http_map_uri_to_path(r, &path, &root,
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
186 NGX_HTTP_AUTOINDEX_PREALLOCATE);
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
187 if (last == NULL) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
188 return NGX_HTTP_INTERNAL_SERVER_ERROR;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
191 allocated = path.len;
1627
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
192 path.len = last - path.data;
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
193 if (path.len > 1) {
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
194 path.len--;
bf5521329069 fix autoindex for "alias /"
Igor Sysoev <igor@sysoev.ru>
parents: 1499
diff changeset
195 }
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
196 path.data[path.len] = '\0';
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 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
199 "http autoindex: \"%s\"", path.data);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
201 format = alcf->format;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
202
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
203 if (format == NGX_HTTP_AUTOINDEX_JSONP) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
204 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
205 return NGX_HTTP_BAD_REQUEST;
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
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
208 if (callback.len == 0) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
209 format = NGX_HTTP_AUTOINDEX_JSON;
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
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
213 if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 err = ngx_errno;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
216 if (err == NGX_ENOENT
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
217 || err == NGX_ENOTDIR
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
218 || err == NGX_ENAMETOOLONG)
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
219 {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 level = NGX_LOG_ERR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 rc = NGX_HTTP_NOT_FOUND;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 } else if (err == NGX_EACCES) {
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_FORBIDDEN;
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 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 level = NGX_LOG_CRIT;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 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
233 ngx_open_dir_n " \"%s\" failed", path.data);
457
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 return rc;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 #if (NGX_SUPPRESS_WARN)
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
239
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 /* 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
241 ngx_memzero(&entries, sizeof(ngx_array_t));
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
242
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 #endif
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
245 /* TODO: pool should be temporary pool */
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
246 pool = r->pool;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
247
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
248 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
249 != NGX_OK)
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
251 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
254 r->headers_out.status = NGX_HTTP_OK;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
255
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
256 switch (format) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
257
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
258 case NGX_HTTP_AUTOINDEX_JSON:
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
259 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
260 break;
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_JSONP:
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/javascript");
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
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
266 case NGX_HTTP_AUTOINDEX_XML:
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
267 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
268 ngx_str_set(&r->headers_out.charset, "utf-8");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
269 break;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
270
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
271 default: /* NGX_HTTP_AUTOINDEX_HTML */
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
272 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
273 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
274 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
275
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
276 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
277 r->headers_out.content_type_lowcase = NULL;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
278
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
279 rc = ngx_http_send_header(r);
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
280
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
281 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
282 if (ngx_close_dir(&dir) == NGX_ERROR) {
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
283 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
284 ngx_close_dir_n " \"%V\" failed", &path);
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
285 }
090e391f53db fix file leak for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 842
diff changeset
286
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
287 return rc;
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
288 }
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
289
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
290 filename = path.data;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
291 filename[path.len] = '/';
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 for ( ;; ) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 ngx_set_errno(0);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 if (ngx_read_dir(&dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 err = ngx_errno;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
299 if (err != NGX_ENOMOREFILES) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 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
301 ngx_read_dir_n " \"%V\" failed", &path);
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
302 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
305 break;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 }
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 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
309 "http autoindex file: \"%s\"", ngx_de_name(&dir));
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 len = ngx_de_namelen(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
313 if (ngx_de_name(&dir)[0] == '.') {
459
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
314 continue;
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
315 }
0491b909ef76 nginx-0.1.4-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
316
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 if (!dir.valid_info) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
319 /* 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
320
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
321 if (path.len + 1 + len + 1 > allocated) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
322 allocated = path.len + 1 + len + 1
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
323 + NGX_HTTP_AUTOINDEX_PREALLOCATE;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
324
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1627
diff changeset
325 filename = ngx_pnalloc(pool, allocated);
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
326 if (filename == NULL) {
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
327 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
330 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
331 *last++ = '/';
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
336 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
337 err = ngx_errno;
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
338
5333
e8bca8397625 Autoindex: improved ngx_de_info() error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5332
diff changeset
339 if (err != NGX_ENOENT && err != NGX_ELOOP) {
497
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
340 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
341 ngx_de_info_n " \"%s\" failed", filename);
2371
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
342
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
343 if (err == NGX_EACCES) {
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
344 continue;
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
345 }
b438ffe54e34 skip protected symlinks in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
346
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
347 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
348 }
d7c90bb5ce83 nginx-0.1.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
349
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
350 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
351 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
352 ngx_de_link_info_n " \"%s\" failed",
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
353 filename);
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
354 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
355 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
359 entry = ngx_array_push(&entries);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
360 if (entry == NULL) {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
361 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
364 entry->name.len = len;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
365
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1627
diff changeset
366 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
367 if (entry->name.data == NULL) {
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
368 return ngx_http_autoindex_error(r, &dir, &path);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 }
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
370
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 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
372
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 entry->dir = ngx_de_is_dir(&dir);
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
374 entry->file = ngx_de_is_file(&dir);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 entry->mtime = ngx_de_mtime(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 entry->size = ngx_de_size(&dir);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 if (ngx_close_dir(&dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 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
381 ngx_close_dir_n " \"%V\" failed", &path);
457
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
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
384 if (entries.nelts > 1) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
385 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
386 sizeof(ngx_http_autoindex_entry_t),
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
387 ngx_http_autoindex_cmp_entries);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
388 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
389
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
390 switch (format) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
391
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
392 case NGX_HTTP_AUTOINDEX_JSON:
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
393 b = ngx_http_autoindex_json(r, &entries, NULL);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
394 break;
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_JSONP:
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
397 b = ngx_http_autoindex_json(r, &entries, &callback);
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
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
400 case NGX_HTTP_AUTOINDEX_XML:
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
401 b = ngx_http_autoindex_xml(r, &entries);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
402 break;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
403
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
404 default: /* NGX_HTTP_AUTOINDEX_HTML */
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
405 b = ngx_http_autoindex_html(r, &entries);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
406 break;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
407 }
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
408
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
409 if (b == NULL) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
410 return NGX_ERROR;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
411 }
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 /* TODO: free temporary pool */
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
414
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
415 if (r == r->main) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
416 b->last_buf = 1;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
417 }
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 b->last_in_chain = 1;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
420
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
421 out.buf = b;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
422 out.next = NULL;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
423
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
424 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
425 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
426
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 static ngx_buf_t *
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
429 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
430 {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
431 u_char *last, scale;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
432 off_t length;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
433 size_t len, char_len, escape_html;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
434 ngx_tm_t tm;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
435 ngx_buf_t *b;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
436 ngx_int_t size;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
437 ngx_uint_t i, utf8;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
438 ngx_time_t *tp;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
439 ngx_http_autoindex_entry_t *entry;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
440 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
441
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
442 static u_char title[] =
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
443 "<html>" CRLF
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
444 "<head><title>Index of "
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
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
447 static u_char header[] =
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
448 "</title></head>" CRLF
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
449 "<body bgcolor=\"white\">" CRLF
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
450 "<h1>Index of "
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
451 ;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
452
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
453 static u_char tail[] =
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
454 "</body>" CRLF
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
455 "</html>" CRLF
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
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
458 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
459 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
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 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
462 && 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
463 == 0)
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 utf8 = 1;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
466
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
467 } else {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
468 utf8 = 0;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
469 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
470
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
471 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
472
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 len = sizeof(title) - 1
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
474 + r->uri.len + escape_html
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 + sizeof(header) - 1
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
476 + r->uri.len + escape_html
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 + sizeof("</h1>") - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 + sizeof("</pre><hr>") - 1
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480 + sizeof(tail) - 1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
482 entry = entries->elts;
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
483 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
484 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
485 entry[i].name.len,
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
486 NGX_ESCAPE_URI_COMPONENT);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
487
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
488 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
489 entry[i].name.len);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
490
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
491 if (utf8) {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
492 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
493 entry[i].name.len);
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
494 } else {
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
495 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
496 }
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
497
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 len += sizeof("<a href=\"") - 1
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
499 + entry[i].name.len + entry[i].escape
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
500 + 1 /* 1 is for "/" */
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
501 + sizeof("\">") - 1
4192
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3527
diff changeset
502 + entry[i].name.len - entry[i].utf_len
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
503 + entry[i].escape_html
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
504 + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
505 + sizeof("</a>") - 1
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
506 + sizeof(" 28-Sep-1970 12:00 ") - 1
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
507 + 20 /* the file size */
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
508 + 2;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
511 b = ngx_create_temp_buf(r->pool, len);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
512 if (b == NULL) {
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
513 return NULL;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 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
517
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
518 if (escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
519 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
520 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
521 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
522
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
523 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
524 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
525 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
526 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
527 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
528
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 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
530
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 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
532 sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
534 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
535 tp = ngx_timeofday();
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
536
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
537 for (i = 0; i < entries->nelts; i++) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 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
539
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
540 if (entry[i].escape) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
541 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
542 NGX_ESCAPE_URI_COMPONENT);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
543
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
544 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
545
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
546 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
547 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
548 entry[i].name.len);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 459
diff changeset
549 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551 if (entry[i].dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 *b->last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555 *b->last++ = '"';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556 *b->last++ = '>';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
558 len = entry[i].utf_len;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
560 if (entry[i].name.len != len) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
561 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
562 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
563
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
564 } else {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
565 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
566 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
567
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
568 last = b->last;
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
569 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
570 char_len, entry[i].name.len + 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
571
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
572 if (entry[i].escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
573 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
574 b->last - last);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
575 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
576
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
577 last = b->last;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
578
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
579 } else {
4193
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
580 if (entry[i].escape_html) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
581 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
582 char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
583
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
584 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
585 char_len = len;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
586 }
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
587
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
588 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
589 entry[i].name.data, char_len);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
590 last = b->last;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
591
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
592 } else {
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
593 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
594 NGX_HTTP_AUTOINDEX_NAME_LEN + 1);
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
595 last = b->last - 3;
63aa6ab94630 Autoindex: escape html in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
596 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
597 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
598
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
600 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
601
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602 } else {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603 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
604 *b->last++ = '/';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605 len++;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608 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
609
e9d188e295cf Fixed false memset warning on Linux with -O3 (ticket #275).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
610 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
611 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
612 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
613 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 *b->last++ = ' ';
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
618 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
619
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
620 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
621 tm.ngx_tm_mday,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622 months[tm.ngx_tm_mon - 1],
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
623 tm.ngx_tm_year,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624 tm.ngx_tm_hour,
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 tm.ngx_tm_min);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
627 if (alcf->exact_size) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
628 if (entry[i].dir) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
629 b->last = ngx_cpymem(b->last, " -",
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
630 sizeof(" -") - 1);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
631 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
632 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
633 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 } else {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
636 if (entry[i].dir) {
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
637 b->last = ngx_cpymem(b->last, " -",
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
638 sizeof(" -") - 1);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
639
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
640 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
641 length = entry[i].size;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
642
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
643 if (length > 1024 * 1024 * 1024 - 1) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
644 size = (ngx_int_t) (length / (1024 * 1024 * 1024));
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
645 if ((length % (1024 * 1024 * 1024))
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
646 > (1024 * 1024 * 1024 / 2 - 1))
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
647 {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
648 size++;
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 scale = 'G';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
651
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
652 } else if (length > 1024 * 1024 - 1) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
653 size = (ngx_int_t) (length / (1024 * 1024));
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
654 if ((length % (1024 * 1024)) > (1024 * 1024 / 2 - 1)) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
655 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
656 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
657 scale = 'M';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
658
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
659 } else if (length > 9999) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
660 size = (ngx_int_t) (length / 1024);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
661 if (length % 1024 > 511) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
662 size++;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
663 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
664 scale = 'K';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
665
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
666 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
667 size = (ngx_int_t) length;
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
668 scale = '\0';
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
669 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
670
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
671 if (scale) {
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
672 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
673
547
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
674 } else {
818fbd4750b9 nginx-0.2.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
675 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
676 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
677 }
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
678 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680 *b->last++ = CR;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
681 *b->last++ = LF;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
682 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
684 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
685
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
686 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
687
5943
631dee7bfd4e Autoindex: rendering code moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5497
diff changeset
688 return b;
457
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
692 static ngx_buf_t *
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
693 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
694 ngx_str_t *callback)
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
695 {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
696 size_t len;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
697 ngx_buf_t *b;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
698 ngx_uint_t i;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
699 ngx_http_autoindex_entry_t *entry;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
700
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
701 len = sizeof("[" CRLF CRLF "]") - 1;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
702
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
703 if (callback) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
704 len += sizeof("/* callback */" CRLF "();") - 1 + callback->len;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
705 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
706
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
707 entry = entries->elts;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
708
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
709 for (i = 0; i < entries->nelts; i++) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
710 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
711 entry[i].name.len);
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 len += sizeof("{ }," CRLF) - 1
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
714 + sizeof("\"name\":\"\"") - 1
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
715 + entry[i].name.len + entry[i].escape
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
716 + sizeof(", \"type\":\"directory\"") - 1
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
717 + sizeof(", \"mtime\":\"Wed, 31 Dec 1986 10:00:00 GMT\"") - 1;
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 if (entry[i].file) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
720 len += sizeof(", \"size\":") - 1 + NGX_OFF_T_LEN;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
721 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
722 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
723
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
724 b = ngx_create_temp_buf(r->pool, len);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
725 if (b == NULL) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
726 return NULL;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
727 }
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 (callback) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
730 b->last = ngx_cpymem(b->last, "/* callback */" CRLF,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
731 sizeof("/* callback */" CRLF) - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
732
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
733 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
734
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
735 *b->last++ = '(';
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
736 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
737
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
738 *b->last++ = '[';
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 for (i = 0; i < entries->nelts; i++) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
741 b->last = ngx_cpymem(b->last, CRLF "{ \"name\":\"",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
742 sizeof(CRLF "{ \"name\":\"") - 1);
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 if (entry[i].escape) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
745 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
746 entry[i].name.len);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
747 } else {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
748 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
749 entry[i].name.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
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
752 b->last = ngx_cpymem(b->last, "\", \"type\":\"",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
753 sizeof("\", \"type\":\"") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
754
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
755 if (entry[i].dir) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
756 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
757
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
758 } else if (entry[i].file) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
759 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
760
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
761 } else {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
762 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
763 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
764
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
765 b->last = ngx_cpymem(b->last, "\", \"mtime\":\"",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
766 sizeof("\", \"mtime\":\"") - 1);
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_http_time(b->last, entry[i].mtime);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
769
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
770 if (entry[i].file) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
771 b->last = ngx_cpymem(b->last, "\", \"size\":",
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
772 sizeof("\", \"size\":") - 1);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
773 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
774
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
775 } else {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
776 *b->last++ = '"';
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
777 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
778
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
779 b->last = ngx_cpymem(b->last, " },", sizeof(" },") - 1);
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
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
782 if (i > 0) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
783 b->last--; /* strip last comma */
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
784 }
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 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
787
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
788 if (callback) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
789 *b->last++ = ')'; *b->last++ = ';';
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
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
792 return b;
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
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
796 static ngx_int_t
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
797 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
798 {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
799 u_char *p, c, ch;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
800 ngx_uint_t i;
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 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
803 callback->len = 0;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
804 return NGX_OK;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
805 }
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 if (callback->len > 128) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
808 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
809 "client sent too long callback name: \"%V\"", callback);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
810 return NGX_DECLINED;
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
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
813 p = callback->data;
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 for (i = 0; i < callback->len; i++) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
816 ch = p[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 c = (u_char) (ch | 0x20);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
819 if (c >= 'a' && c <= 'z') {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
820 continue;
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 ((ch >= '0' && ch <= '9') || ch == '_' || ch == '.') {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
824 continue;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
825 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
826
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
827 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
828 "client sent invalid callback name: \"%V\"", callback);
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
829
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
830 return NGX_DECLINED;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
831 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
832
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
833 return NGX_OK;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
834 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
835
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
836
5945
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
837 static ngx_buf_t *
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
838 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
839 {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
840 size_t len;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
841 ngx_tm_t tm;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
842 ngx_buf_t *b;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
843 ngx_str_t type;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
844 ngx_uint_t i;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
845 ngx_http_autoindex_entry_t *entry;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
846
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
847 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
848 static u_char tail[] = "</list>" CRLF;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
849
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
850 len = sizeof(head) - 1 + sizeof(tail) - 1;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
851
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
852 entry = entries->elts;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
853
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
854 for (i = 0; i < entries->nelts; i++) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
855 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
856 entry[i].name.len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
857
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
858 len += sizeof("<directory></directory>" CRLF) - 1
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
859 + entry[i].name.len + entry[i].escape
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
860 + sizeof(" mtime=\"1986-12-31T10:00:00Z\"") - 1;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
861
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
862 if (entry[i].file) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
863 len += sizeof(" size=\"\"") - 1 + NGX_OFF_T_LEN;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
864 }
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
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
867 b = ngx_create_temp_buf(r->pool, len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
868 if (b == NULL) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
869 return NULL;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
870 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
871
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
872 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
873
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
874 for (i = 0; i < entries->nelts; i++) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
875 *b->last++ = '<';
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
876
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
877 if (entry[i].dir) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
878 ngx_str_set(&type, "directory");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
879
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
880 } else if (entry[i].file) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
881 ngx_str_set(&type, "file");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
882
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
883 } else {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
884 ngx_str_set(&type, "other");
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
885 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
886
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
887 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
888
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
889 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
890
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
891 ngx_gmtime(entry[i].mtime, &tm);
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 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
894 tm.ngx_tm_year, tm.ngx_tm_mon,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
895 tm.ngx_tm_mday, tm.ngx_tm_hour,
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
896 tm.ngx_tm_min, tm.ngx_tm_sec);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
897
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
898 if (entry[i].file) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
899 b->last = ngx_cpymem(b->last, "\" size=\"",
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
900 sizeof("\" size=\"") - 1);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
901 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
902 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
903
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
904 *b->last++ = '"'; *b->last++ = '>';
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
905
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
906 if (entry[i].escape) {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
907 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
908 entry[i].name.len);
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
909 } else {
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
910 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
911 entry[i].name.len);
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
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
914 *b->last++ = '<'; *b->last++ = '/';
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
915
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
916 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
917
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
918 *b->last++ = '>';
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 *b->last++ = CR; *b->last++ = LF;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
921 }
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
922
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
923 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
924
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
925 return b;
99751fe3bc3b Autoindex: implemented XML output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5944
diff changeset
926 }
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
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
929 static int ngx_libc_cdecl
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
930 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
931 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
932 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
933 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
934
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
935 if (first->dir && !second->dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
936 /* move the directories to the start */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
937 return -1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
938 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
939
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
940 if (!first->dir && second->dir) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
941 /* move the directories to the start */
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
942 return 1;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
943 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
944
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
945 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
946 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
947
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
948
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
949 #if 0
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
950
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
951 static ngx_buf_t *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
952 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
953 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
954 ngx_chain_t *cl;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
955
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
956 if (ctx->buf) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
957
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
958 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
959 return ctx->buf;
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 ctx->size += ctx->buf->last - ctx->buf->pos;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
963 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
964
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
965 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
966 if (ctx->buf == NULL) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
967 return NULL;
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
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
970 cl = ngx_alloc_chain_link(ctx->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
971 if (cl == NULL) {
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
972 return NULL;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
973 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
974
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
975 cl->buf = ctx->buf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
976 cl->next = NULL;
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 *ctx->last_out = cl;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
979 ctx->last_out = &cl->next;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
980
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 #endif
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
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
987 static ngx_int_t
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 553
diff changeset
988 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
989 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
990 if (ngx_close_dir(dir) == NGX_ERROR) {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
991 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
992 ngx_close_dir_n " \"%V\" failed", name);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
993 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
994
5332
1a9700ef9725 Autoindex: return NGX_ERROR on error if headers were sent.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5218
diff changeset
995 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
996 }
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
997
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
998
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
999 static void *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1000 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
1001 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1002 ngx_http_autoindex_loc_conf_t *conf;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1003
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1004 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
1005 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
1006 return NULL;
457
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1009 conf->enable = NGX_CONF_UNSET;
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
1010 conf->format = NGX_CONF_UNSET_UINT;
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1011 conf->localtime = NGX_CONF_UNSET;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1012 conf->exact_size = NGX_CONF_UNSET;
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1013
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1014 return conf;
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
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1017
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1018 static char *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 497
diff changeset
1019 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
1020 {
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1021 ngx_http_autoindex_loc_conf_t *prev = parent;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1022 ngx_http_autoindex_loc_conf_t *conf = child;
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_conf_merge_value(conf->enable, prev->enable, 0);
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
1025 ngx_conf_merge_uint_value(conf->format, prev->format,
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5943
diff changeset
1026 NGX_HTTP_AUTOINDEX_HTML);
519
12234c998d83 nginx-0.1.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1027 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
1028 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
1029
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1030 return NGX_CONF_OK;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 }
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1032
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1033
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1034 static ngx_int_t
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1035 ngx_http_autoindex_init(ngx_conf_t *cf)
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1036 {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1037 ngx_http_handler_pt *h;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1038 ngx_http_core_main_conf_t *cmcf;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1039
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1040 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
1041
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1042 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
1043 if (h == NULL) {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1044 return NGX_ERROR;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1045 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1046
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1047 *h = ngx_http_autoindex_handler;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1048
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1049 return NGX_OK;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1050 }