Mercurial > hg > nginx-ranges
comparison src/http/ngx_http_parse.c @ 38:2879cd3a40cb NGINX_0_1_19
nginx 0.1.19
*) Bugfix: now, if request contains the zero, then the 404 error is
returned for the local requests.
*) Bugfix: nginx could not be built on NetBSD 2.0.
*) Bugfix: the timeout may occur while reading of the the client
request body via SSL connections.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 16 Feb 2005 00:00:00 +0300 |
parents | aab2ea7c0458 |
children | 72eb30262aac |
comparison
equal
deleted
inserted
replaced
37:3376a7dea5d6 | 38:2879cd3a40cb |
---|---|
107 } | 107 } |
108 break; | 108 break; |
109 | 109 |
110 /* space* before URI */ | 110 /* space* before URI */ |
111 case sw_spaces_before_uri: | 111 case sw_spaces_before_uri: |
112 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { | |
113 r->schema_start = p; | |
114 state = sw_schema; | |
115 break; | |
116 } | |
117 | |
112 switch (ch) { | 118 switch (ch) { |
113 case '/': | 119 case '/': |
114 r->uri_start = p; | 120 r->uri_start = p; |
115 state = sw_after_slash_in_uri; | 121 state = sw_after_slash_in_uri; |
116 break; | 122 break; |
117 case ' ': | 123 case ' ': |
118 break; | 124 break; |
119 default: | 125 default: |
120 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { | |
121 r->schema_start = p; | |
122 state = sw_schema; | |
123 break; | |
124 } | |
125 return NGX_HTTP_PARSE_INVALID_REQUEST; | 126 return NGX_HTTP_PARSE_INVALID_REQUEST; |
126 } | 127 } |
127 break; | 128 break; |
128 | 129 |
129 case sw_schema: | 130 case sw_schema: |
131 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { | |
132 break; | |
133 } | |
134 | |
130 switch (ch) { | 135 switch (ch) { |
131 case ':': | 136 case ':': |
132 r->schema_end = p; | 137 r->schema_end = p; |
133 state = sw_schema_slash; | 138 state = sw_schema_slash; |
134 break; | 139 break; |
135 default: | 140 default: |
136 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { | |
137 break; | |
138 } | |
139 return NGX_HTTP_PARSE_INVALID_REQUEST; | 141 return NGX_HTTP_PARSE_INVALID_REQUEST; |
140 } | 142 } |
141 break; | 143 break; |
142 | 144 |
143 case sw_schema_slash: | 145 case sw_schema_slash: |
160 return NGX_HTTP_PARSE_INVALID_REQUEST; | 162 return NGX_HTTP_PARSE_INVALID_REQUEST; |
161 } | 163 } |
162 break; | 164 break; |
163 | 165 |
164 case sw_host: | 166 case sw_host: |
167 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') | |
168 || (ch >= '0' && ch <= '9') || ch == '.' || ch == '-') | |
169 { | |
170 break; | |
171 } | |
172 | |
165 switch (ch) { | 173 switch (ch) { |
166 case ':': | 174 case ':': |
167 r->host_end = p; | 175 r->host_end = p; |
168 state = sw_port; | 176 state = sw_port; |
169 break; | 177 break; |
171 r->host_end = p; | 179 r->host_end = p; |
172 r->uri_start = p; | 180 r->uri_start = p; |
173 state = sw_after_slash_in_uri; | 181 state = sw_after_slash_in_uri; |
174 break; | 182 break; |
175 default: | 183 default: |
176 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') | |
177 || (ch >= '0' && ch <= '9') || ch == '.' || ch == '-') | |
178 { | |
179 break; | |
180 } | |
181 return NGX_HTTP_PARSE_INVALID_REQUEST; | 184 return NGX_HTTP_PARSE_INVALID_REQUEST; |
182 } | 185 } |
183 break; | 186 break; |
184 | 187 |
185 case sw_port: | 188 case sw_port: |
189 if (ch >= '0' && ch <= '9') { | |
190 break; | |
191 } | |
192 | |
186 switch (ch) { | 193 switch (ch) { |
187 case '/': | 194 case '/': |
188 r->port_end = p; | 195 r->port_end = p; |
189 r->uri_start = p; | 196 r->uri_start = p; |
190 state = sw_after_slash_in_uri; | 197 state = sw_after_slash_in_uri; |
191 break; | 198 break; |
192 default: | 199 default: |
193 if (ch < '0' && ch > '9') { | 200 return NGX_HTTP_PARSE_INVALID_REQUEST; |
194 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
195 } | |
196 break; | |
197 } | 201 } |
198 break; | 202 break; |
199 | 203 |
200 /* check "/.", "//", "%", and "\" (Win32) in URI */ | 204 /* check "/.", "//", "%", and "\" (Win32) in URI */ |
201 case sw_after_slash_in_uri: | 205 case sw_after_slash_in_uri: |
202 switch (ch) { | 206 |
207 if ((ch >= 'a' && ch <= 'z') | |
208 || (ch >= 'A' && ch <= 'Z') | |
209 || (ch >= '0' && ch <= '9')) | |
210 { | |
211 state = sw_check_uri; | |
212 break; | |
213 } | |
214 | |
215 switch (ch) { | |
216 case ' ': | |
217 r->uri_end = p; | |
218 state = sw_http_09; | |
219 break; | |
203 case CR: | 220 case CR: |
204 r->uri_end = p; | 221 r->uri_end = p; |
205 r->http_minor = 9; | 222 r->http_minor = 9; |
206 state = sw_almost_done; | 223 state = sw_almost_done; |
207 break; | 224 break; |
208 case LF: | 225 case LF: |
209 r->uri_end = p; | 226 r->uri_end = p; |
210 r->http_minor = 9; | 227 r->http_minor = 9; |
211 goto done; | 228 goto done; |
229 case '.': | |
230 r->complex_uri = 1; | |
231 state = sw_uri; | |
232 break; | |
233 case '%': | |
234 r->quoted_uri = 1; | |
235 state = sw_uri; | |
236 break; | |
237 case '/': | |
238 r->complex_uri = 1; | |
239 state = sw_uri; | |
240 break; | |
241 #if (NGX_WIN32) | |
242 case '\\': | |
243 r->complex_uri = 1; | |
244 state = sw_uri; | |
245 break; | |
246 #endif | |
247 case '?': | |
248 r->args_start = p + 1; | |
249 state = sw_uri; | |
250 break; | |
251 case '+': | |
252 r->plus_in_uri = 1; | |
253 break; | |
254 case '\0': | |
255 r->zero_in_uri = 1; | |
256 break; | |
257 default: | |
258 state = sw_check_uri; | |
259 break; | |
260 } | |
261 break; | |
262 | |
263 /* check "/", "%" and "\" (Win32) in URI */ | |
264 case sw_check_uri: | |
265 | |
266 if ((ch >= 'a' && ch <= 'z') | |
267 || (ch >= 'A' && ch <= 'Z') | |
268 || (ch >= '0' && ch <= '9')) | |
269 { | |
270 break; | |
271 } | |
272 | |
273 switch (ch) { | |
274 case '/': | |
275 r->uri_ext = NULL; | |
276 state = sw_after_slash_in_uri; | |
277 break; | |
278 case '.': | |
279 r->uri_ext = p + 1; | |
280 break; | |
212 case ' ': | 281 case ' ': |
213 r->uri_end = p; | 282 r->uri_end = p; |
214 state = sw_http_09; | 283 state = sw_http_09; |
215 break; | 284 break; |
216 case '.': | |
217 r->complex_uri = 1; | |
218 state = sw_uri; | |
219 break; | |
220 case '%': | |
221 r->quoted_uri = 1; | |
222 state = sw_uri; | |
223 break; | |
224 #if (NGX_WIN32) | |
225 case '\\': | |
226 r->complex_uri = 1; | |
227 break; | |
228 #endif | |
229 case '/': | |
230 r->complex_uri = 1; | |
231 break; | |
232 case '+': | |
233 r->plus_in_uri = 1; | |
234 break; | |
235 case '?': | |
236 r->args_start = p + 1; | |
237 state = sw_uri; | |
238 break; | |
239 default: | |
240 state = sw_check_uri; | |
241 break; | |
242 } | |
243 break; | |
244 | |
245 /* check "/", "%" and "\" (Win32) in URI */ | |
246 case sw_check_uri: | |
247 switch (ch) { | |
248 case CR: | 285 case CR: |
249 r->uri_end = p; | 286 r->uri_end = p; |
250 r->http_minor = 9; | 287 r->http_minor = 9; |
251 state = sw_almost_done; | 288 state = sw_almost_done; |
252 break; | 289 break; |
253 case LF: | 290 case LF: |
254 r->uri_end = p; | 291 r->uri_end = p; |
255 r->http_minor = 9; | 292 r->http_minor = 9; |
256 goto done; | 293 goto done; |
257 case ' ': | |
258 r->uri_end = p; | |
259 state = sw_http_09; | |
260 break; | |
261 case '.': | |
262 r->uri_ext = p + 1; | |
263 break; | |
264 #if (NGX_WIN32) | 294 #if (NGX_WIN32) |
265 case '\\': | 295 case '\\': |
266 r->complex_uri = 1; | 296 r->complex_uri = 1; |
267 state = sw_after_slash_in_uri; | 297 state = sw_after_slash_in_uri; |
268 break; | 298 break; |
269 #endif | 299 #endif |
270 case '/': | |
271 r->uri_ext = NULL; | |
272 state = sw_after_slash_in_uri; | |
273 break; | |
274 case '+': | |
275 r->plus_in_uri = 1; | |
276 break; | |
277 case '%': | 300 case '%': |
278 r->quoted_uri = 1; | 301 r->quoted_uri = 1; |
279 state = sw_uri; | 302 state = sw_uri; |
280 break; | 303 break; |
304 case '+': | |
305 r->plus_in_uri = 1; | |
306 break; | |
281 case '?': | 307 case '?': |
282 r->args_start = p + 1; | 308 r->args_start = p + 1; |
283 state = sw_uri; | 309 state = sw_uri; |
284 break; | 310 break; |
311 case '\0': | |
312 r->zero_in_uri = 1; | |
313 break; | |
285 } | 314 } |
286 break; | 315 break; |
287 | 316 |
288 /* URI */ | 317 /* URI */ |
289 case sw_uri: | 318 case sw_uri: |
290 switch (ch) { | 319 switch (ch) { |
320 case ' ': | |
321 r->uri_end = p; | |
322 state = sw_http_09; | |
323 break; | |
291 case CR: | 324 case CR: |
292 r->uri_end = p; | 325 r->uri_end = p; |
293 r->http_minor = 9; | 326 r->http_minor = 9; |
294 state = sw_almost_done; | 327 state = sw_almost_done; |
295 break; | 328 break; |
298 r->http_minor = 9; | 331 r->http_minor = 9; |
299 goto done; | 332 goto done; |
300 case '+': | 333 case '+': |
301 r->plus_in_uri = 1; | 334 r->plus_in_uri = 1; |
302 break; | 335 break; |
303 case ' ': | 336 case '\0': |
304 r->uri_end = p; | 337 r->zero_in_uri = 1; |
305 state = sw_http_09; | |
306 break; | 338 break; |
307 } | 339 } |
308 break; | 340 break; |
309 | 341 |
310 /* space+ after URI */ | 342 /* space+ after URI */ |
944 return NGX_HTTP_PARSE_INVALID_REQUEST; | 976 return NGX_HTTP_PARSE_INVALID_REQUEST; |
945 | 977 |
946 case sw_quoted_second: | 978 case sw_quoted_second: |
947 if (ch >= '0' && ch <= '9') { | 979 if (ch >= '0' && ch <= '9') { |
948 ch = (u_char) ((decoded << 4) + ch - '0'); | 980 ch = (u_char) ((decoded << 4) + ch - '0'); |
981 | |
949 if (ch == '%') { | 982 if (ch == '%') { |
950 state = sw_usual; | 983 state = sw_usual; |
951 *u++ = ch; | 984 *u++ = ch; |
952 ch = *p++; | 985 ch = *p++; |
953 break; | 986 break; |
954 } | 987 } |
988 | |
989 if (ch == '\0') { | |
990 r->zero_in_uri = 1; | |
991 *u++ = ch; | |
992 ch = *p++; | |
993 } | |
994 | |
955 state = quoted_state; | 995 state = quoted_state; |
956 break; | 996 break; |
957 } | 997 } |
958 | 998 |
959 c = (u_char) (ch | 0x20); | 999 c = (u_char) (ch | 0x20); |