Mercurial > hg > nginx
comparison src/http/modules/ngx_http_autoindex_module.c @ 525:09b42134ac0c release-0.1.37
nginx-0.1.37-RELEASE import
*) Change: now the "\n" is added to the end of the "nginx.pid" file.
*) Bugfix: the responses may be transferred not completely, if many
parts or the big parts were included by SSI.
*) Bugfix: if all backends had returned the 404 reponse and the
"http_404" parameter of the "proxy_next_upstream" or
"fastcgi_next_upstream" directives was used, then nginx started to
request all backends again.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 23 Jun 2005 13:41:06 +0000 |
parents | 2019117e6b38 |
children | 7fa11e5c6e96 |
comparison
equal
deleted
inserted
replaced
524:a55bc21dee27 | 525:09b42134ac0c |
---|---|
22 #endif | 22 #endif |
23 | 23 |
24 | 24 |
25 typedef struct { | 25 typedef struct { |
26 ngx_str_t name; | 26 ngx_str_t name; |
27 size_t utf_len; | |
27 ngx_uint_t escape; | 28 ngx_uint_t escape; |
28 ngx_uint_t dir; | 29 ngx_uint_t dir; |
29 time_t mtime; | 30 time_t mtime; |
30 off_t size; | 31 off_t size; |
31 } ngx_http_autoindex_entry_t; | 32 } ngx_http_autoindex_entry_t; |
210 /* MSVC thinks 'entries' may be used without having been initialized */ | 211 /* MSVC thinks 'entries' may be used without having been initialized */ |
211 ngx_memzero(&entries, sizeof(ngx_array_t)); | 212 ngx_memzero(&entries, sizeof(ngx_array_t)); |
212 #endif | 213 #endif |
213 | 214 |
214 if (ngx_array_init(&entries, pool, 50, sizeof(ngx_http_autoindex_entry_t)) | 215 if (ngx_array_init(&entries, pool, 50, sizeof(ngx_http_autoindex_entry_t)) |
215 == NGX_ERROR) | 216 == NGX_ERROR) |
216 { | 217 { |
217 return ngx_http_autoindex_error(r, &dir, dname.data); | 218 return ngx_http_autoindex_error(r, &dir, dname.data); |
218 } | 219 } |
219 | 220 |
220 r->headers_out.status = NGX_HTTP_OK; | 221 r->headers_out.status = NGX_HTTP_OK; |
302 if (entry == NULL) { | 303 if (entry == NULL) { |
303 return ngx_http_autoindex_error(r, &dir, dname.data); | 304 return ngx_http_autoindex_error(r, &dir, dname.data); |
304 } | 305 } |
305 | 306 |
306 entry->name.len = len; | 307 entry->name.len = len; |
308 | |
307 entry->escape = 2 * ngx_escape_uri(NULL, ngx_de_name(&dir), len, | 309 entry->escape = 2 * ngx_escape_uri(NULL, ngx_de_name(&dir), len, |
308 NGX_ESCAPE_HTML); | 310 NGX_ESCAPE_HTML); |
309 | 311 |
310 entry->name.data = ngx_palloc(pool, len + entry->escape + 1); | 312 entry->name.data = ngx_palloc(pool, len + entry->escape + 1); |
311 if (entry->name.data == NULL) { | 313 if (entry->name.data == NULL) { |
312 return ngx_http_autoindex_error(r, &dir, dname.data); | 314 return ngx_http_autoindex_error(r, &dir, dname.data); |
313 } | 315 } |
314 | 316 |
315 ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1); | 317 ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1); |
318 | |
319 if (r->utf8) { | |
320 entry->utf_len = ngx_utf_length(&entry->name); | |
321 } else { | |
322 entry->utf_len = len; | |
323 } | |
316 | 324 |
317 entry->dir = ngx_de_is_dir(&dir); | 325 entry->dir = ngx_de_is_dir(&dir); |
318 entry->mtime = ngx_de_mtime(&dir); | 326 entry->mtime = ngx_de_mtime(&dir); |
319 entry->size = ngx_de_size(&dir); | 327 entry->size = ngx_de_size(&dir); |
320 } | 328 } |
334 + sizeof(tail) - 1; | 342 + sizeof(tail) - 1; |
335 | 343 |
336 entry = entries.elts; | 344 entry = entries.elts; |
337 for (i = 0; i < entries.nelts; i++) { | 345 for (i = 0; i < entries.nelts; i++) { |
338 len += sizeof("<a href=\"") - 1 | 346 len += sizeof("<a href=\"") - 1 |
339 + 1 /* 1 is for "/" */ | 347 + 1 /* 1 is for "/" */ |
340 + entry[i].name.len + entry[i].escape | 348 + entry[i].name.len + entry[i].escape |
341 + sizeof("\">") - 1 | 349 + sizeof("\">") - 1 |
342 + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof(">") - 2 | 350 + entry[i].name.len - entry[i].utf_len |
343 + sizeof("</a>") - 1 | 351 + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof(">") - 2 |
344 + sizeof(" 28-Sep-1970 12:00 ") - 1 | 352 + sizeof("</a>") - 1 |
345 + 19 | 353 + sizeof(" 28-Sep-1970 12:00 ") - 1 |
346 + 2; | 354 + 19 |
347 | 355 + 2; |
348 if (r->utf8) { | |
349 len += entry[i].name.len - ngx_utf_length(&entry[i].name); | |
350 } | |
351 } | 356 } |
352 | 357 |
353 b = ngx_create_temp_buf(r->pool, len); | 358 b = ngx_create_temp_buf(r->pool, len); |
354 if (b == NULL) { | 359 if (b == NULL) { |
355 return NGX_HTTP_INTERNAL_SERVER_ERROR; | 360 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
392 *b->last++ = '>'; | 397 *b->last++ = '>'; |
393 | 398 |
394 b->last = ngx_cpystrn(b->last, entry[i].name.data, | 399 b->last = ngx_cpystrn(b->last, entry[i].name.data, |
395 NGX_HTTP_AUTOINDEX_NAME_LEN + 1); | 400 NGX_HTTP_AUTOINDEX_NAME_LEN + 1); |
396 | 401 |
397 if (r->utf8) { | 402 len = entry[i].utf_len; |
398 len = ngx_utf_length(&entry[i].name); | |
399 } else { | |
400 len = entry[i].name.len; | |
401 } | |
402 | 403 |
403 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) { | 404 if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) { |
404 b->last = ngx_cpymem(b->last - 3, "..></a>", | 405 b->last = ngx_cpymem(b->last - 3, "..></a>", |
405 sizeof("..></a>") - 1); | 406 sizeof("..></a>") - 1); |
406 | 407 |