annotate src/http/modules/ngx_http_try_files_module.c @ 7676:d225b70d38b6

Proxy: detection of data after final chunk. Previously, additional data after final chunk was either ignored (in the same buffer, or during unbuffered proxying) or sent to the client (in the next buffer already if it was already read from the socket). Now additional data are properly detected and ignored in all cases. Additionally, a warning is now logged and keepalive is disabled in the connection.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 06 Jul 2020 18:36:20 +0300
parents cce6936ed2f4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7071
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 typedef struct {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
14 ngx_array_t *lengths;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15 ngx_array_t *values;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16 ngx_str_t name;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
18 unsigned code:10;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
19 unsigned test_dir:1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
20 } ngx_http_try_file_t;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
21
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23 typedef struct {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24 ngx_http_try_file_t *try_files;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25 } ngx_http_try_files_loc_conf_t;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
28 static ngx_int_t ngx_http_try_files_handler(ngx_http_request_t *r);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
29 static char *ngx_http_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
30 static void *ngx_http_try_files_create_loc_conf(ngx_conf_t *cf);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31 static ngx_int_t ngx_http_try_files_init(ngx_conf_t *cf);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34 static ngx_command_t ngx_http_try_files_commands[] = {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36 { ngx_string("try_files"),
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
37 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
38 ngx_http_try_files,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39 NGX_HTTP_LOC_CONF_OFFSET,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
40 0,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41 NULL },
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 ngx_null_command
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44 };
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 static ngx_http_module_t ngx_http_try_files_module_ctx = {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 NULL, /* preconfiguration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49 ngx_http_try_files_init, /* postconfiguration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51 NULL, /* create main configuration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52 NULL, /* init main configuration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54 NULL, /* create server configuration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
55 NULL, /* merge server configuration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 ngx_http_try_files_create_loc_conf, /* create location configuration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 NULL /* merge location configuration */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 };
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 ngx_module_t ngx_http_try_files_module = {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 NGX_MODULE_V1,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 &ngx_http_try_files_module_ctx, /* module context */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 ngx_http_try_files_commands, /* module directives */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 NGX_HTTP_MODULE, /* module type */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67 NULL, /* init master */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 NULL, /* init module */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 NULL, /* init process */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70 NULL, /* init thread */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 NULL, /* exit thread */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 NULL, /* exit process */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 NULL, /* exit master */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74 NGX_MODULE_V1_PADDING
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75 };
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78 static ngx_int_t
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 ngx_http_try_files_handler(ngx_http_request_t *r)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 size_t len, root, alias, reserve, allocated;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82 u_char *p, *name;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83 ngx_str_t path, args;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 ngx_uint_t test_dir;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85 ngx_http_try_file_t *tf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 ngx_open_file_info_t of;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 ngx_http_script_code_pt code;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 ngx_http_script_engine_t e;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 ngx_http_core_loc_conf_t *clcf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90 ngx_http_script_len_code_pt lcode;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91 ngx_http_try_files_loc_conf_t *tlcf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93 tlcf = ngx_http_get_module_loc_conf(r, ngx_http_try_files_module);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95 if (tlcf->try_files == NULL) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 return NGX_DECLINED;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 "try files handler");
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 allocated = 0;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 root = 0;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 name = NULL;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 /* suppress MSVC warning */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106 path.data = NULL;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108 tf = tlcf->try_files;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 alias = clcf->alias;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114 for ( ;; ) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 if (tf->lengths) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117 ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119 e.ip = tf->lengths->elts;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 e.request = r;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122 /* 1 is for terminating '\0' as in static names */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 len = 1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125 while (*(uintptr_t *) e.ip) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 lcode = *(ngx_http_script_len_code_pt *) e.ip;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 len += lcode(&e);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 } else {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 len = tf->name.len;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134 if (!alias) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 reserve = len > r->uri.len ? len - r->uri.len : 0;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137 } else if (alias == NGX_MAX_SIZE_T_VALUE) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 reserve = len;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 } else {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141 reserve = len > r->uri.len - alias ? len - (r->uri.len - alias) : 0;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144 if (reserve > allocated || !allocated) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146 /* 16 bytes are preallocation */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147 allocated = reserve + 16;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
149 if (ngx_http_map_uri_to_path(r, &path, &root, allocated) == NULL) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
150 return NGX_HTTP_INTERNAL_SERVER_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
152
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
153 name = path.data + root;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
154 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
156 if (tf->values == NULL) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
158 /* tf->name.len includes the terminating '\0' */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
160 ngx_memcpy(name, tf->name.data, tf->name.len);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 path.len = (name + tf->name.len - 1) - path.data;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
164 } else {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165 e.ip = tf->values->elts;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
166 e.pos = name;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167 e.flushed = 1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169 while (*(uintptr_t *) e.ip) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170 code = *(ngx_http_script_code_pt *) e.ip;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171 code((ngx_http_script_engine_t *) &e);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174 path.len = e.pos - path.data;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176 *e.pos = '\0';
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 if (alias && alias != NGX_MAX_SIZE_T_VALUE
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179 && ngx_strncmp(name, r->uri.data, alias) == 0)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 ngx_memmove(name, name + alias, len - alias);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 path.len -= alias;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186 test_dir = tf->test_dir;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 tf++;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191 "trying to use %s: \"%s\" \"%s\"",
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 test_dir ? "dir" : "file", name, path.data);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 if (tf->lengths == NULL && tf->name.len == 0) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 if (tf->code) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 return tf->code;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200 path.len -= root;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 path.data += root;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203 if (path.data[0] == '@') {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204 (void) ngx_http_named_location(r, &path);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 } else {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207 ngx_http_split_args(r, &path, &args);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209 (void) ngx_http_internal_redirect(r, &path, &args);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 ngx_http_finalize_request(r, NGX_DONE);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 return NGX_DONE;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216 ngx_memzero(&of, sizeof(ngx_open_file_info_t));
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218 of.read_ahead = clcf->read_ahead;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
219 of.directio = clcf->directio;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
220 of.valid = clcf->open_file_cache_valid;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221 of.min_uses = clcf->open_file_cache_min_uses;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222 of.test_only = 1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223 of.errors = clcf->open_file_cache_errors;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224 of.events = clcf->open_file_cache_events;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
225
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
226 if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
227 return NGX_HTTP_INTERNAL_SERVER_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
228 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
229
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
230 if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
231 != NGX_OK)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
232 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233 if (of.err == 0) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
234 return NGX_HTTP_INTERNAL_SERVER_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
235 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
236
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237 if (of.err != NGX_ENOENT
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238 && of.err != NGX_ENOTDIR
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239 && of.err != NGX_ENAMETOOLONG)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
241 ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
242 "%s \"%s\" failed", of.failed, path.data);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
243 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
244
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
245 continue;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
246 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
247
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
248 if (of.is_dir != test_dir) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
249 continue;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
250 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252 path.len -= root;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253 path.data += root;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
254
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
255 if (!alias) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
256 r->uri = path;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
257
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
258 } else if (alias == NGX_MAX_SIZE_T_VALUE) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
259 if (!test_dir) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
260 r->uri = path;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
261 r->add_uri_to_alias = 1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
262 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
263
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
264 } else {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
265 name = r->uri.data;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
266
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
267 r->uri.len = alias + path.len;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
268 r->uri.data = ngx_pnalloc(r->pool, r->uri.len);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
269 if (r->uri.data == NULL) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
270 r->uri.len = 0;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271 return NGX_HTTP_INTERNAL_SERVER_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
272 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
273
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274 p = ngx_copy(r->uri.data, name, alias);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
275 ngx_memcpy(p, path.data, path.len);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
276 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
277
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
278 ngx_http_set_exten(r);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
281 "try file uri: \"%V\"", &r->uri);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
282
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283 return NGX_DECLINED;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
285
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 /* not reached */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290 static char *
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291 ngx_http_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293 ngx_http_try_files_loc_conf_t *tlcf = conf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 ngx_str_t *value;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296 ngx_int_t code;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297 ngx_uint_t i, n;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298 ngx_http_try_file_t *tf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299 ngx_http_script_compile_t sc;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301 if (tlcf->try_files) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 return "is duplicate";
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 tf = ngx_pcalloc(cf->pool, cf->args->nelts * sizeof(ngx_http_try_file_t));
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306 if (tf == NULL) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307 return NGX_CONF_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310 tlcf->try_files = tf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312 value = cf->args->elts;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 for (i = 0; i < cf->args->nelts - 1; i++) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
316 tf[i].name = value[i + 1];
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318 if (tf[i].name.len > 0
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319 && tf[i].name.data[tf[i].name.len - 1] == '/'
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320 && i + 2 < cf->args->nelts)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
321 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
322 tf[i].test_dir = 1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
323 tf[i].name.len--;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324 tf[i].name.data[tf[i].name.len] = '\0';
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
327 n = ngx_http_script_variables_count(&tf[i].name);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329 if (n) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332 sc.cf = cf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 sc.source = &tf[i].name;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334 sc.lengths = &tf[i].lengths;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335 sc.values = &tf[i].values;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336 sc.variables = n;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 sc.complete_lengths = 1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 sc.complete_values = 1;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
340 if (ngx_http_script_compile(&sc) != NGX_OK) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341 return NGX_CONF_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344 } else {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 /* add trailing '\0' to length */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346 tf[i].name.len++;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350 if (tf[i - 1].name.data[0] == '=') {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352 code = ngx_atoi(tf[i - 1].name.data + 1, tf[i - 1].name.len - 2);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 if (code == NGX_ERROR || code > 999) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356 "invalid code \"%*s\"",
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357 tf[i - 1].name.len - 1, tf[i - 1].name.data);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358 return NGX_CONF_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 tf[i].code = code;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364 return NGX_CONF_OK;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368 static void *
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369 ngx_http_try_files_create_loc_conf(ngx_conf_t *cf)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371 ngx_http_try_files_loc_conf_t *tlcf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373 tlcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_try_files_loc_conf_t));
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374 if (tlcf == NULL) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 return NULL;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 /*
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379 * set by ngx_pcalloc():
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380 *
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381 * tlcf->try_files = NULL;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382 */
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 return tlcf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 static ngx_int_t
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389 ngx_http_try_files_init(ngx_conf_t *cf)
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391 ngx_http_handler_pt *h;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
392 ngx_http_core_main_conf_t *cmcf;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396 h = ngx_array_push(&cmcf->phases[NGX_HTTP_PRECONTENT_PHASE].handlers);
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397 if (h == NULL) {
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398 return NGX_ERROR;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 }
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401 *h = ngx_http_try_files_handler;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 return NGX_OK;
cce6936ed2f4 Precontent phase.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404 }