annotate src/http/modules/ngx_http_random_index_module.c @ 7653:8409f9df6219

SSL: client certificate validation with OCSP (ticket #1534). OCSP validation for client certificates is enabled by the "ssl_ocsp" directive. OCSP responder can be optionally specified by "ssl_ocsp_responder". When session is reused, peer chain is not available for validation. If the verified chain contains certificates from the peer chain not available at the server, validation will fail.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 22 May 2020 17:30:12 +0300
parents 061ec464813f
children
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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3527
diff changeset
4 * Copyright (C) Nginx, Inc.
2235
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 typedef struct {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 ngx_flag_t enable;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 } ngx_http_random_index_loc_conf_t;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 #define NGX_HTTP_RANDOM_INDEX_PREALLOCATE 50
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 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
22 ngx_dir_t *dir, ngx_str_t *name);
2266
6223d5a9e87f back out $random_index variable
Igor Sysoev <igor@sysoev.ru>
parents: 2258
diff changeset
23 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
24 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
25 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
26 void *parent, void *child);
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 static ngx_command_t ngx_http_random_index_commands[] = {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 { ngx_string("random_index"),
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 ngx_conf_set_flag_slot,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 NGX_HTTP_LOC_CONF_OFFSET,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 offsetof(ngx_http_random_index_loc_conf_t, enable),
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 NULL },
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 ngx_null_command
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 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
43 NULL, /* preconfiguration */
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 ngx_http_random_index_init, /* postconfiguration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 NULL, /* create main configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 NULL, /* init main configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 NULL, /* create server configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 NULL, /* merge server configuration */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
4499
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
52 ngx_http_random_index_create_loc_conf, /* create location configuration */
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
53 ngx_http_random_index_merge_loc_conf /* merge location configuration */
2235
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 ngx_module_t ngx_http_random_index_module = {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 NGX_MODULE_V1,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 &ngx_http_random_index_module_ctx, /* module context */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 ngx_http_random_index_commands, /* module directives */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 NGX_HTTP_MODULE, /* module type */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 NULL, /* init master */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 NULL, /* init module */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 NULL, /* init process */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 NULL, /* init thread */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 NULL, /* exit thread */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 NULL, /* exit process */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 NULL, /* exit master */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 NGX_MODULE_V1_PADDING
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 static ngx_int_t
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 ngx_http_random_index_handler(ngx_http_request_t *r)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 u_char *last, *filename;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 size_t len, allocated, root;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 ngx_err_t err;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 ngx_int_t rc;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 ngx_str_t path, uri, *name;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 ngx_dir_t dir;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 ngx_uint_t n, level;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 ngx_array_t names;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 ngx_http_random_index_loc_conf_t *rlcf;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 if (r->uri.data[r->uri.len - 1] != '/') {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 return NGX_DECLINED;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 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
91 return NGX_DECLINED;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 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
95
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 if (!rlcf->enable) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 return NGX_DECLINED;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 #if (NGX_HAVE_D_TYPE)
7433
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6477
diff changeset
101 len = 0;
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 #else
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 len = NGX_HTTP_RANDOM_INDEX_PREALLOCATE;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 #endif
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 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
107 if (last == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 return NGX_HTTP_INTERNAL_SERVER_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 allocated = path.len;
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 path.len = last - path.data - 1;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 path.data[path.len] = '\0';
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 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
117 "http random index: \"%s\"", path.data);
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 if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 err = ngx_errno;
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 (err == NGX_ENOENT
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 || err == NGX_ENOTDIR
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 || err == NGX_ENAMETOOLONG)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 level = NGX_LOG_ERR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 rc = NGX_HTTP_NOT_FOUND;
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 } else if (err == NGX_EACCES) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 level = NGX_LOG_ERR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 rc = NGX_HTTP_FORBIDDEN;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 } else {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 level = NGX_LOG_CRIT;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 ngx_log_error(level, r->connection->log, err,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 ngx_open_dir_n " \"%s\" failed", path.data);
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 return rc;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 }
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 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
145 return ngx_http_random_index_error(r, &dir, &path);
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 filename = path.data;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 filename[path.len] = '/';
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 for ( ;; ) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 ngx_set_errno(0);
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 if (ngx_read_dir(&dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 err = ngx_errno;
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 (err != NGX_ENOMOREFILES) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 ngx_read_dir_n " \"%V\" failed", &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 break;
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 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
167 "http random index file: \"%s\"", ngx_de_name(&dir));
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 if (ngx_de_name(&dir)[0] == '.') {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 continue;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 len = ngx_de_namelen(&dir);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174
3203
a56cccd588e6 update r3201: ngx_http_random_index_module should behave consistently
Igor Sysoev <igor@sysoev.ru>
parents: 3200
diff changeset
175 if (dir.type == 0 || ngx_de_is_link(&dir)) {
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 /* 1 byte for '/' and 1 byte for terminating '\0' */
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 if (path.len + 1 + len + 1 > allocated) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 allocated = path.len + 1 + len + 1
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 + NGX_HTTP_RANDOM_INDEX_PREALLOCATE;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 filename = ngx_pnalloc(r->pool, allocated);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 if (filename == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 last = ngx_cpystrn(filename, path.data, path.len + 1);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 *last++ = '/';
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
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 if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 err = ngx_errno;
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 (err != NGX_ENOENT) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 ngx_de_info_n " \"%s\" failed", filename);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 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
205 ngx_de_link_info_n " \"%s\" failed",
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 filename);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210 }
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 if (!ngx_de_is_file(&dir)) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 continue;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 name = ngx_array_push(&names);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 if (name == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 name->len = len;
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 name->data = ngx_pnalloc(r->pool, len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 if (name->data == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 return ngx_http_random_index_error(r, &dir, &path);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 ngx_memcpy(name->data, ngx_de_name(&dir), len);
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 if (ngx_close_dir(&dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
6477
47daf95d0138 Fixed logging in close error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 4499
diff changeset
233 ngx_close_dir_n " \"%V\" failed", &path);
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 n = names.nelts;
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 if (n == 0) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 return NGX_DECLINED;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 name = names.elts;
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 n = (ngx_uint_t) (((uint64_t) ngx_random() * n) / 0x80000000);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 uri.len = r->uri.len + name[n].len;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 uri.data = ngx_pnalloc(r->pool, uri.len);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 if (uri.data == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 return NGX_HTTP_INTERNAL_SERVER_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 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
254 ngx_memcpy(last, name[n].data, name[n].len);
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 return ngx_http_internal_redirect(r, &uri, &r->args);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 }
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 static ngx_int_t
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 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
262 ngx_str_t *name)
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 if (ngx_close_dir(dir) == NGX_ERROR) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 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
266 ngx_close_dir_n " \"%V\" failed", name);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 static void *
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 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
275 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 ngx_http_random_index_loc_conf_t *conf;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 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
279 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
280 return NULL;
2235
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 conf->enable = NGX_CONF_UNSET;
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 return conf;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 }
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 static char *
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 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
291 {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 ngx_http_random_index_loc_conf_t *prev = parent;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 ngx_http_random_index_loc_conf_t *conf = 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_conf_merge_value(conf->enable, prev->enable, 0);
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 return NGX_CONF_OK;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 }
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
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 static ngx_int_t
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 ngx_http_random_index_init(ngx_conf_t *cf)
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 ngx_http_handler_pt *h;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 ngx_http_core_main_conf_t *cmcf;
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 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
308
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 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
310 if (h == NULL) {
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 return NGX_ERROR;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 }
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 *h = ngx_http_random_index_handler;
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 return NGX_OK;
03180d4e5af2 ngx_http_random_index_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 }