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);