Mercurial > hg > nginx
annotate src/http/modules/ngx_http_static_module.c @ 4583:a1d5842064f7
Fixed buffer overflow when long URI is processed by "try_files" in
regex location with "alias" (fixes ticket #135).
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Thu, 12 Apr 2012 09:19:14 +0000 |
parents | 13e09cf11d4e |
children | 192f54280a7a |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
4412 | 4 * Copyright (C) Nginx, Inc. |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
5 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
6 |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_config.h> |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
74
diff
changeset
|
9 #include <ngx_core.h> |
3
34a521b1a148
nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
1
diff
changeset
|
10 #include <ngx_http.h> |
34a521b1a148
nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
1
diff
changeset
|
11 |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
12 |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
13 static ngx_int_t ngx_http_static_handler(ngx_http_request_t *r); |
681 | 14 static ngx_int_t ngx_http_static_init(ngx_conf_t *cf); |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
15 |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
16 |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
17 ngx_http_module_t ngx_http_static_module_ctx = { |
509 | 18 NULL, /* preconfiguration */ |
681 | 19 ngx_http_static_init, /* postconfiguration */ |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
176
diff
changeset
|
20 |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
21 NULL, /* create main configuration */ |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
22 NULL, /* init main configuration */ |
577 | 23 |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
24 NULL, /* create server configuration */ |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
25 NULL, /* merge server configuration */ |
577 | 26 |
1454 | 27 NULL, /* create location configuration */ |
28 NULL /* merge location configuration */ | |
577 | 29 }; |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
30 |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
31 |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
32 ngx_module_t ngx_http_static_module = { |
509 | 33 NGX_MODULE_V1, |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
34 &ngx_http_static_module_ctx, /* module context */ |
1454 | 35 NULL, /* module directives */ |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
36 NGX_HTTP_MODULE, /* module type */ |
541 | 37 NULL, /* init master */ |
681 | 38 NULL, /* init module */ |
541 | 39 NULL, /* init process */ |
40 NULL, /* init thread */ | |
41 NULL, /* exit thread */ | |
42 NULL, /* exit process */ | |
43 NULL, /* exit master */ | |
44 NGX_MODULE_V1_PADDING | |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
45 }; |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
46 |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
47 |
509 | 48 static ngx_int_t |
49 ngx_http_static_handler(ngx_http_request_t *r) | |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
50 { |
557 | 51 u_char *last, *location; |
2038
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
52 size_t root, len; |
1454 | 53 ngx_str_t path; |
557 | 54 ngx_int_t rc; |
55 ngx_uint_t level; | |
56 ngx_log_t *log; | |
57 ngx_buf_t *b; | |
58 ngx_chain_t out; | |
1454 | 59 ngx_open_file_info_t of; |
557 | 60 ngx_http_core_loc_conf_t *clcf; |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
61 |
2182
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
62 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) { |
639 | 63 return NGX_HTTP_NOT_ALLOWED; |
64 } | |
65 | |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
66 if (r->uri.data[r->uri.len - 1] == '/') { |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
67 return NGX_DECLINED; |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
68 } |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
69 |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
70 log = r->connection->log; |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
71 |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
72 /* |
557 | 73 * ngx_http_map_uri_to_path() allocates memory for terminating '\0' |
74 * so we do not need to reserve memory for '/' for possible redirect | |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
75 */ |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
76 |
773 | 77 last = ngx_http_map_uri_to_path(r, &path, &root, 0); |
557 | 78 if (last == NULL) { |
79 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
400
69e851f83522
nginx-0.0.8-2004-07-26-20:21:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
80 } |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
81 |
1454 | 82 path.len = last - path.data; |
83 | |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
84 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, |
557 | 85 "http filename: \"%s\"", path.data); |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
86 |
1454 | 87 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
563 | 88 |
2068
75a8d34459c5
ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents:
2063
diff
changeset
|
89 ngx_memzero(&of, sizeof(ngx_open_file_info_t)); |
75a8d34459c5
ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents:
2063
diff
changeset
|
90 |
3178 | 91 of.read_ahead = clcf->read_ahead; |
2129 | 92 of.directio = clcf->directio; |
1767
c42431762903
open_file_cache_retest > open_file_cache_valid
Igor Sysoev <igor@sysoev.ru>
parents:
1696
diff
changeset
|
93 of.valid = clcf->open_file_cache_valid; |
1772 | 94 of.min_uses = clcf->open_file_cache_min_uses; |
1454 | 95 of.errors = clcf->open_file_cache_errors; |
1457 | 96 of.events = clcf->open_file_cache_events; |
4494
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
97 |
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
98 if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) { |
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
99 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
100 } |
1454 | 101 |
1799 | 102 if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) |
103 != NGX_OK) | |
104 { | |
1454 | 105 switch (of.err) { |
106 | |
107 case 0: | |
108 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
109 |
1454 | 110 case NGX_ENOENT: |
111 case NGX_ENOTDIR: | |
112 case NGX_ENAMETOOLONG: | |
113 | |
170
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
114 level = NGX_LOG_ERR; |
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
115 rc = NGX_HTTP_NOT_FOUND; |
1454 | 116 break; |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
117 |
1454 | 118 case NGX_EACCES: |
4478
08713bac87fc
Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents:
4412
diff
changeset
|
119 #if (NGX_HAVE_OPENAT) |
08713bac87fc
Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents:
4412
diff
changeset
|
120 case NGX_EMLINK: |
08713bac87fc
Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents:
4412
diff
changeset
|
121 case NGX_ELOOP: |
08713bac87fc
Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents:
4412
diff
changeset
|
122 #endif |
1454 | 123 |
170
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
124 level = NGX_LOG_ERR; |
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
125 rc = NGX_HTTP_FORBIDDEN; |
1454 | 126 break; |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
127 |
1454 | 128 default: |
129 | |
170
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
130 level = NGX_LOG_CRIT; |
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
131 rc = NGX_HTTP_INTERNAL_SERVER_ERROR; |
1454 | 132 break; |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
133 } |
170
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
134 |
527 | 135 if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) { |
1454 | 136 ngx_log_error(level, log, of.err, |
2756
09cab3f8d92e
*) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents:
2721
diff
changeset
|
137 "%s \"%s\" failed", of.failed, path.data); |
527 | 138 } |
170
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
139 |
c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
165
diff
changeset
|
140 return rc; |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
141 } |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
142 |
2444
aee735f41627
set r->root_tested for non-error_page response only
Igor Sysoev <igor@sysoev.ru>
parents:
2403
diff
changeset
|
143 r->root_tested = !r->error_page; |
2087
c8039b26a949
always test root existence for access_log with variables
Igor Sysoev <igor@sysoev.ru>
parents:
2068
diff
changeset
|
144 |
1696 | 145 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "http static fd: %d", of.fd); |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
146 |
1454 | 147 if (of.is_dir) { |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
148 |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
149 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir"); |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
150 |
4206
1a94a56a4e5d
Clear old Location header (if any) while adding a new one.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3527
diff
changeset
|
151 ngx_http_clear_location(r); |
1a94a56a4e5d
Clear old Location header (if any) while adding a new one.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3527
diff
changeset
|
152 |
509 | 153 r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t)); |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
154 if (r->headers_out.location == NULL) { |
165
894a01c6aea3
nginx-0.0.1-2003-10-29-20:39:05 import
Igor Sysoev <igor@sysoev.ru>
parents:
160
diff
changeset
|
155 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
894a01c6aea3
nginx-0.0.1-2003-10-29-20:39:05 import
Igor Sysoev <igor@sysoev.ru>
parents:
160
diff
changeset
|
156 } |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
157 |
2038
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
158 len = r->uri.len + 1; |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
159 |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
160 if (!clcf->alias && clcf->root_lengths == NULL && r->args.len == 0) { |
557 | 161 location = path.data + clcf->root.len; |
162 | |
2038
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
163 *last = '/'; |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
164 |
557 | 165 } else { |
2038
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
166 if (r->args.len) { |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
167 len += r->args.len + 1; |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
168 } |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
169 |
2049 | 170 location = ngx_pnalloc(r->pool, len); |
557 | 171 if (location == NULL) { |
172 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
173 } | |
174 | |
573 | 175 last = ngx_copy(location, r->uri.data, r->uri.len); |
2038
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
176 |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
177 *last = '/'; |
557 | 178 |
2038
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
179 if (r->args.len) { |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
180 *++last = '?'; |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
181 ngx_memcpy(++last, r->args.data, r->args.len); |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
182 } |
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
183 } |
557 | 184 |
509 | 185 /* |
186 * we do not need to set the r->headers_out.location->hash and | |
187 * r->headers_out.location->key fields | |
188 */ | |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
189 |
2038
93a0d80fdce6
add args in redirect to a directory
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
190 r->headers_out.location->value.len = len; |
557 | 191 r->headers_out.location->value.data = location; |
287
35a6a9df2d25
nginx-0.0.2-2004-03-12-19:57:08 import
Igor Sysoev <igor@sysoev.ru>
parents:
257
diff
changeset
|
192 |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
193 return NGX_HTTP_MOVED_PERMANENTLY; |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
194 } |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
195 |
461 | 196 #if !(NGX_WIN32) /* the not regular files are probably Unix specific */ |
176
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
170
diff
changeset
|
197 |
1454 | 198 if (!of.is_file) { |
3498
9f20a6e758c3
do not log misleading errno in "not a regular file" error
Igor Sysoev <igor@sysoev.ru>
parents:
3178
diff
changeset
|
199 ngx_log_error(NGX_LOG_CRIT, log, 0, |
557 | 200 "\"%s\" is not a regular file", path.data); |
176
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
170
diff
changeset
|
201 |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
170
diff
changeset
|
202 return NGX_HTTP_NOT_FOUND; |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
170
diff
changeset
|
203 } |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
170
diff
changeset
|
204 |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
170
diff
changeset
|
205 #endif |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
170
diff
changeset
|
206 |
2182
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
207 if (r->method & NGX_HTTP_POST) { |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
208 return NGX_HTTP_NOT_ALLOWED; |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
209 } |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
210 |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
211 rc = ngx_http_discard_request_body(r); |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
212 |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
213 if (rc != NGX_OK) { |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
214 return rc; |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
215 } |
23309bcd9937
allow file existence test for POST requests in static module
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
216 |
509 | 217 log->action = "sending response to client"; |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
218 |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
219 r->headers_out.status = NGX_HTTP_OK; |
1454 | 220 r->headers_out.content_length_n = of.size; |
221 r->headers_out.last_modified_time = of.mtime; | |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
222 |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
223 if (ngx_http_set_content_type(r) != NGX_OK) { |
200
abeaebe0a33c
nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
199
diff
changeset
|
224 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
abeaebe0a33c
nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
199
diff
changeset
|
225 } |
abeaebe0a33c
nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
199
diff
changeset
|
226 |
2403
5e5caa72f61e
fix zero length static response, the bug was introduced in r2378
Igor Sysoev <igor@sysoev.ru>
parents:
2377
diff
changeset
|
227 if (r != r->main && of.size == 0) { |
583 | 228 return ngx_http_send_header(r); |
229 } | |
230 | |
587 | 231 r->allow_ranges = 1; |
232 | |
577 | 233 /* we need to allocate all before the header would be sent */ |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
234 |
577 | 235 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); |
236 if (b == NULL) { | |
237 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
238 } | |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
239 |
577 | 240 b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t)); |
241 if (b->file == NULL) { | |
242 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
243 } | |
403
ea3113b181d1
nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
400
diff
changeset
|
244 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
245 rc = ngx_http_send_header(r); |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
246 |
585 | 247 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
248 return rc; |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
249 } |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
250 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
334
diff
changeset
|
251 b->file_pos = 0; |
1454 | 252 b->file_last = of.size; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
253 |
577 | 254 b->in_file = b->file_last ? 1: 0; |
597 | 255 b->last_buf = (r == r->main) ? 1: 0; |
577 | 256 b->last_in_chain = 1; |
257 | |
1696 | 258 b->file->fd = of.fd; |
557 | 259 b->file->name = path; |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
334
diff
changeset
|
260 b->file->log = log; |
2231
8564129d49b6
*) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents:
2182
diff
changeset
|
261 b->file->directio = of.is_directio; |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
334
diff
changeset
|
262 |
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
334
diff
changeset
|
263 out.buf = b; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
148
diff
changeset
|
264 out.next = NULL; |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
148
diff
changeset
|
265 |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
148
diff
changeset
|
266 return ngx_http_output_filter(r, &out); |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
267 } |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
268 |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
269 |
509 | 270 static ngx_int_t |
681 | 271 ngx_http_static_init(ngx_conf_t *cf) |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
272 { |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
273 ngx_http_handler_pt *h; |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
274 ngx_http_core_main_conf_t *cmcf; |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
346
diff
changeset
|
275 |
681 | 276 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); |
577 | 277 |
501 | 278 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
279 if (h == NULL) { |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
280 return NGX_ERROR; |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
281 } |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
282 |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
283 *h = ngx_http_static_handler; |
148
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
284 |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
285 return NGX_OK; |
5afee0074707
nginx-0.0.1-2003-10-17-00:19:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
286 } |