annotate src/http/modules/ngx_http_autoindex_module.c @ 4248:2fad4d19ea4b stable-1.0

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