annotate src/http/modules/ngx_http_random_index_module.c @ 3440:88741ec7731a stable-0.7

merge r3294, r3305: Fix a bug introduced in r2032: After a child process has read a terminate message from a channel, the process tries to read the channel again. The kernel (at least FreeBSD) may preempt the process and sends a SIGIO signal to a master process. The master process sends a new terminate message, the kernel switches again to the the child process, and the child process reads the messages instead of an EAGAIN error. And this may repeat over and over. Being that the child process can not exit the cycle and test the termination flag set by the message handler. The fix disallow the master process to send a new terminate message on SIGIO signal reception. It may send the message only on SIGALARM signal.
author Igor Sysoev <igor@sysoev.ru>
date Mon, 01 Feb 2010 15:49:36 +0000
parents 6b8284fc958d
children 8152369f7037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 typedef struct {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 ngx_flag_t enable;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 } ngx_http_random_index_loc_conf_t;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 #define NGX_HTTP_RANDOM_INDEX_PREALLOCATE 50
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 static ngx_int_t ngx_http_random_index_error(ngx_http_request_t *r,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 ngx_dir_t *dir, ngx_str_t *name);
2266
6223d5a9e87f back out $random_index variable
Igor Sysoev <igor@sysoev.ru>
parents: 2258
diff changeset
22 static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf);
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 static void *ngx_http_random_index_create_loc_conf(ngx_conf_t *cf);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 static char *ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 void *parent, void *child);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 static ngx_command_t ngx_http_random_index_commands[] = {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 { ngx_string("random_index"),
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_conf_set_flag_slot,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 NGX_HTTP_LOC_CONF_OFFSET,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 offsetof(ngx_http_random_index_loc_conf_t, enable),
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 NULL },
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 ngx_null_command
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 };
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 static ngx_http_module_t ngx_http_random_index_module_ctx = {
2266
6223d5a9e87f back out $random_index variable
Igor Sysoev <igor@sysoev.ru>
parents: 2258
diff changeset
42 NULL, /* preconfiguration */
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 ngx_http_random_index_init, /* postconfiguration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 NULL, /* create main configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 NULL, /* init main configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 NULL, /* create server configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 NULL, /* merge server configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 ngx_http_random_index_create_loc_conf, /* create location configration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 ngx_http_random_index_merge_loc_conf /* merge location configration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 };
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 ngx_module_t ngx_http_random_index_module = {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 NGX_MODULE_V1,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 &ngx_http_random_index_module_ctx, /* module context */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 ngx_http_random_index_commands, /* module directives */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 NGX_HTTP_MODULE, /* module type */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 NULL, /* init master */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 NULL, /* init module */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 NULL, /* init process */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 NULL, /* init thread */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 NULL, /* exit thread */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 NULL, /* exit process */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 NULL, /* exit master */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 NGX_MODULE_V1_PADDING
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 };
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 static ngx_int_t
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 ngx_http_random_index_handler(ngx_http_request_t *r)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 u_char *last, *filename;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 size_t len, allocated, root;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 ngx_err_t err;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 ngx_int_t rc;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 ngx_str_t path, uri, *name;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 ngx_dir_t dir;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 ngx_uint_t n, level;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 ngx_array_t names;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 ngx_http_random_index_loc_conf_t *rlcf;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 if (r->uri.data[r->uri.len - 1] != '/') {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 return NGX_DECLINED;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 if (r->zero_in_uri) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 return NGX_DECLINED;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 return NGX_DECLINED;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 rlcf = ngx_http_get_module_loc_conf(r, ngx_http_random_index_module);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 if (!rlcf->enable) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 return NGX_DECLINED;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 #if (NGX_HAVE_D_TYPE)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 len = NGX_DIR_MASK_LEN;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 #else
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 len = NGX_HTTP_RANDOM_INDEX_PREALLOCATE;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 #endif
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 last = ngx_http_map_uri_to_path(r, &path, &root, len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 if (last == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 return NGX_HTTP_INTERNAL_SERVER_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 allocated = path.len;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 path.len = last - path.data - 1;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 path.data[path.len] = '\0';
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 "http random index: \"%s\"", path.data);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 err = ngx_errno;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 if (err == NGX_ENOENT
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 || err == NGX_ENOTDIR
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 || err == NGX_ENAMETOOLONG)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 level = NGX_LOG_ERR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 rc = NGX_HTTP_NOT_FOUND;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 } else if (err == NGX_EACCES) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 level = NGX_LOG_ERR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 rc = NGX_HTTP_FORBIDDEN;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 } else {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 level = NGX_LOG_CRIT;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 ngx_log_error(level, r->connection->log, err,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 ngx_open_dir_n " \"%s\" failed", path.data);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 return rc;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 if (ngx_array_init(&names, r->pool, 32, sizeof(ngx_str_t)) != NGX_OK) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 filename = path.data;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 filename[path.len] = '/';
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 for ( ;; ) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 ngx_set_errno(0);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 if (ngx_read_dir(&dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 err = ngx_errno;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 if (err != NGX_ENOMOREFILES) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 ngx_read_dir_n " \"%V\" failed", &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 break;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 "http random index file: \"%s\"", ngx_de_name(&dir));
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 if (ngx_de_name(&dir)[0] == '.') {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 continue;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 len = ngx_de_namelen(&dir);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177
3433
6b8284fc958d merge r3201, r3204, r3411:
Igor Sysoev <igor@sysoev.ru>
parents: 3237
diff changeset
178 if (dir.type == 0 || ngx_de_is_link(&dir)) {
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 /* 1 byte for '/' and 1 byte for terminating '\0' */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 if (path.len + 1 + len + 1 > allocated) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 allocated = path.len + 1 + len + 1
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 + NGX_HTTP_RANDOM_INDEX_PREALLOCATE;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 filename = ngx_pnalloc(r->pool, allocated);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 if (filename == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 last = ngx_cpystrn(filename, path.data, path.len + 1);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 *last++ = '/';
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 err = ngx_errno;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 if (err != NGX_ENOENT) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 ngx_de_info_n " \"%s\" failed", filename);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 ngx_de_link_info_n " \"%s\" failed",
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 filename);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 if (!ngx_de_is_file(&dir)) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 continue;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 name = ngx_array_push(&names);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 if (name == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 name->len = len;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 name->data = ngx_pnalloc(r->pool, len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 if (name->data == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 ngx_memcpy(name->data, ngx_de_name(&dir), len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 if (ngx_close_dir(&dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 ngx_close_dir_n " \"%s\" failed", &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 n = names.nelts;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 if (n == 0) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 return NGX_DECLINED;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 name = names.elts;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 n = (ngx_uint_t) (((uint64_t) ngx_random() * n) / 0x80000000);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 uri.len = r->uri.len + name[n].len;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 uri.data = ngx_pnalloc(r->pool, uri.len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 if (uri.data == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 return NGX_HTTP_INTERNAL_SERVER_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 last = ngx_copy(uri.data, r->uri.data, r->uri.len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 ngx_memcpy(last, name[n].data, name[n].len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 return ngx_http_internal_redirect(r, &uri, &r->args);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 static ngx_int_t
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 ngx_http_random_index_error(ngx_http_request_t *r, ngx_dir_t *dir,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 ngx_str_t *name)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 if (ngx_close_dir(dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 ngx_close_dir_n " \"%V\" failed", name);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272 return NGX_HTTP_INTERNAL_SERVER_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 static void *
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 ngx_http_random_index_create_loc_conf(ngx_conf_t *cf)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 ngx_http_random_index_loc_conf_t *conf;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 conf = ngx_palloc(cf->pool, sizeof(ngx_http_random_index_loc_conf_t));
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 if (conf == NULL) {
3237
2efa8d2fcde1 merge r2903, r2911, r2912, r3002:
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
283 return NULL;
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 conf->enable = NGX_CONF_UNSET;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 return conf;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 static char *
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 ngx_http_random_index_loc_conf_t *prev = parent;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 ngx_http_random_index_loc_conf_t *conf = child;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 ngx_conf_merge_value(conf->enable, prev->enable, 0);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 return NGX_CONF_OK;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 static ngx_int_t
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 ngx_http_random_index_init(ngx_conf_t *cf)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 ngx_http_handler_pt *h;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 ngx_http_core_main_conf_t *cmcf;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 if (h == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 return NGX_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 *h = ngx_http_random_index_handler;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 return NGX_OK;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 }