annotate src/http/ngx_http_parse.c @ 256:2e9c57a5e50a NGINX_0_4_13

nginx 0.4.13 *) Feature: the "proxy_pass" directive may be used inside the "limit_except" block. *) Feature: the "limit_except" directive supports all WebDAV methods. *) Bugfix: if the "add_before_body" directive was used without the "add_after_body" directive, then an response did not transferred complete. *) Bugfix: a large request body did not receive if the epoll method and the deferred accept() were used. *) Bugfix: a charset could not be set for ngx_http_autoindex_module responses; bug appeared in 0.3.50. *) Bugfix: the "[alert] zero size buf" error when FastCGI server was used; *) Bugfix: the --group= configuration parameter was ignored. Thanks to Thomas Moschny. *) Bugfix: the 50th subrequest in SSI response did not work; bug appeared in 0.3.50.
author Igor Sysoev <http://sysoev.ru>
date Wed, 15 Nov 2006 00:00:00 +0300
parents f3ec44f4a53b
children 6ae1357b7b7c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
12 static uint32_t usual[] = {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
13 0xffffdbfe, /* 1111 1111 1111 1111 1101 1011 1111 1110 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
14
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
15 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
16 0x7fff37d6, /* 0111 1111 1111 1111 0011 0111 1101 0110 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
17
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
18 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
19 #if (NGX_WIN32)
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
20 0xefffffff, /* 1110 1111 1111 1111 1111 1111 1111 1111 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
21 #else
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
22 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
23 #endif
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
24
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
25 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
26 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
27
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
28 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
29 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
30 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
31 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
32 };
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
33
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
34
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
35 /* gcc, icc, msvc and others compile these switches as an jump table */
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
36
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
37 ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
38 ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 {
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
40 u_char c, ch, *p, *m;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 enum {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 sw_start = 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 sw_method,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 sw_spaces_before_uri,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 sw_schema,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 sw_schema_slash,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 sw_schema_slash_slash,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 sw_host,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 sw_port,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 sw_after_slash_in_uri,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 sw_check_uri,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 sw_uri,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 sw_http_09,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 sw_http_H,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 sw_http_HT,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 sw_http_HTT,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 sw_http_HTTP,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 sw_first_major_digit,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 sw_major_digit,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 sw_first_minor_digit,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 sw_minor_digit,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
62 sw_almost_done
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 } state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 state = r->state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
67 for (p = b->pos; p < b->last; p++) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
68 ch = *p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 switch (state) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 /* HTTP methods: GET, HEAD, POST */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 case sw_start:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
74 r->request_start = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 if (ch == CR || ch == LF) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 if (ch < 'A' || ch > 'Z') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 return NGX_HTTP_PARSE_INVALID_METHOD;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 state = sw_method;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 case sw_method:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 if (ch == ' ') {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
89 r->method_end = p - 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 m = r->request_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
92 switch (p - m) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
94 case 3:
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 if (m[0] == 'G' && m[1] == 'E' && m[2] == 'T') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 r->method = NGX_HTTP_GET;
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
97 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
98 }
182
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
99
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
100 if (m[0] == 'P' && m[1] == 'U' && m[2] == 'T') {
182
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
101 r->method = NGX_HTTP_PUT;
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
102 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 }
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
104
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
105 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
107 case 4:
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
108 if (m[1] == 'O') {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
109
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
110 if (m[0] == 'P' && m[2] == 'S' && m[3] == 'T') {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
111 r->method = NGX_HTTP_POST;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
112 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
113 }
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
114
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
115 if (m[0] == 'C' && m[2] == 'P' && m[3] == 'Y') {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
116 r->method = NGX_HTTP_COPY;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
117 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
118 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
120 if (m[0] == 'M' && m[2] == 'V' && m[3] == 'E') {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
121 r->method = NGX_HTTP_MOVE;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
122 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
123 }
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
124
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
125 if (m[0] == 'L' && m[2] == 'C' && m[3] == 'K') {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
126 r->method = NGX_HTTP_LOCK;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
127 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
128 }
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
129
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
130 } else {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
131
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
132 if (m[0] == 'H' && m[1] == 'E'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
133 && m[2] == 'A' && m[3] == 'D')
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
134 {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
135 r->method = NGX_HTTP_HEAD;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
136 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
137 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 }
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
139
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
140 break;
182
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
141
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
142 case 5:
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
143 if (m[0] == 'M' && m[1] == 'K'
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
144 && m[2] == 'C' && m[3] == 'O' && m[4] == 'L')
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
145 {
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
146 r->method = NGX_HTTP_MKCOL;
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
147 }
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
148
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
149 break;
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
150
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
151 case 6:
182
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
152 if (m[0] == 'D' && m[1] == 'E' && m[2] == 'L'
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
153 && m[3] == 'E' && m[4] == 'T' && m[5] == 'E')
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
154 {
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
155 r->method = NGX_HTTP_DELETE;
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
156 break;
182
13710a1813ad nginx 0.3.38
Igor Sysoev <http://sysoev.ru>
parents: 174
diff changeset
157 }
256
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
158
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
159 if (m[0] == 'U' && m[1] == 'N' && m[2] == 'L'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
160 && m[3] == 'O' && m[4] == 'C' && m[5] == 'K')
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
161 {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
162 r->method = NGX_HTTP_UNLOCK;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
163 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
164 }
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
165
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
166 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
167
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
168 case 7:
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
169 if (m[0] == 'O' && m[1] == 'P'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
170 && m[2] == 'T' && m[3] == 'I'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
171 && m[4] == 'O' && m[5] == 'N' && m[6] == 'S')
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
172 {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
173 r->method = NGX_HTTP_OPTIONS;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
174 }
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
175
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
176 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
177
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
178 case 8:
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
179 if (m[0] == 'P' && m[1] == 'R'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
180 && m[2] == 'O' && m[3] == 'P' && m[4] == 'F'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
181 && m[5] == 'I' && m[6] == 'N' && m[7] == 'D')
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
182 {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
183 r->method = NGX_HTTP_PROPFIND;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
184 }
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
185
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
186 break;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
187
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
188 case 9:
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
189 if (m[0] == 'P' && m[1] == 'R' && m[2] == 'O'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
190 && m[3] == 'P' && m[4] == 'P' && m[5] == 'A'
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
191 && m[6] == 'T' && m[7] == 'C' && m[8] == 'H')
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
192 {
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
193 r->method = NGX_HTTP_PROPPATCH;
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
194 }
2e9c57a5e50a nginx 0.4.13
Igor Sysoev <http://sysoev.ru>
parents: 254
diff changeset
195
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
196 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 state = sw_spaces_before_uri;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 if (ch < 'A' || ch > 'Z') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 return NGX_HTTP_PARSE_INVALID_METHOD;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 /* space* before URI */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 case sw_spaces_before_uri:
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
211
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
212 if (ch == '/' ){
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
213 r->uri_start = p;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
214 state = sw_after_slash_in_uri;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
215 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
216 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
217
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
218 c = (u_char) (ch | 0x20);
70
8ad297c88dcb nginx 0.1.35
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
219 if (c >= 'a' && c <= 'z') {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
220 r->schema_start = p;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
221 state = sw_schema;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
222 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
223 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
224
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 case ' ':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 case sw_schema:
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
234
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
235 c = (u_char) (ch | 0x20);
70
8ad297c88dcb nginx 0.1.35
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
236 if (c >= 'a' && c <= 'z') {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
237 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
238 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
239
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 case ':':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
242 r->schema_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 state = sw_schema_slash;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 case sw_schema_slash:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 case '/':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 state = sw_schema_slash_slash;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 case sw_schema_slash_slash:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 case '/':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
263 r->host_start = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 state = sw_host;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 case sw_host:
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
272
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
273 c = (u_char) (ch | 0x20);
70
8ad297c88dcb nginx 0.1.35
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
274 if (c >= 'a' && c <= 'z') {
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
275 break;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
276 }
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
277
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
278 if ((ch >= '0' && ch <= '9') || ch == '.' || ch == '-') {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
279 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
280 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
281
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 case ':':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
284 r->host_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 state = sw_port;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 case '/':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
288 r->host_end = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
289 r->uri_start = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290 state = sw_after_slash_in_uri;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 case sw_port:
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
298 if (ch >= '0' && ch <= '9') {
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
299 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
300 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
301
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 case '/':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
304 r->port_end = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
305 r->uri_start = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306 state = sw_after_slash_in_uri;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 default:
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
309 return NGX_HTTP_PARSE_INVALID_REQUEST;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
313 /* check "/.", "//", "%", and "\" (Win32) in URI */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 case sw_after_slash_in_uri:
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
315
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
316 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
317 state = sw_check_uri;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
318 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
319 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
320
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 switch (ch) {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
322 case ' ':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
323 r->uri_end = p;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
324 state = sw_http_09;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
325 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326 case CR:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
327 r->uri_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328 r->http_minor = 9;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
332 r->uri_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 r->http_minor = 9;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
334 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 case '.':
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
336 r->complex_uri = 1;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
337 state = sw_uri;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
338 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 case '%':
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
340 r->quoted_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341 state = sw_uri;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 break;
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
343 case '/':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
344 r->complex_uri = 1;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
345 state = sw_uri;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
346 break;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
347 #if (NGX_WIN32)
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
348 case '\\':
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
349 r->complex_uri = 1;
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
350 state = sw_uri;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
351 break;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
352 #endif
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
353 case '?':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
354 r->args_start = p + 1;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
355 state = sw_uri;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 break;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
357 case '#':
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
358 r->complex_uri = 1;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
359 state = sw_uri;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
360 break;
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
361 case '+':
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
362 r->plus_in_uri = 1;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
363 break;
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
364 case '\0':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
365 r->zero_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 state = sw_check_uri;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
373 /* check "/", "%" and "\" (Win32) in URI */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 case sw_check_uri:
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
375
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
376 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
377 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
378 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
379
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 switch (ch) {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
381 case '/':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
382 r->uri_ext = NULL;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
383 state = sw_after_slash_in_uri;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
384 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
385 case '.':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
386 r->uri_ext = p + 1;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
387 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
388 case ' ':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
389 r->uri_end = p;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
390 state = sw_http_09;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
391 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 case CR:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
393 r->uri_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 r->http_minor = 9;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
398 r->uri_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399 r->http_minor = 9;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
400 goto done;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
401 #if (NGX_WIN32)
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
402 case '\\':
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
403 r->complex_uri = 1;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
404 state = sw_after_slash_in_uri;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
405 break;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
406 #endif
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
407 case '%':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
408 r->quoted_uri = 1;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
409 state = sw_uri;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 case '?':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
412 r->args_start = p + 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 state = sw_uri;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 break;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
415 case '#':
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
416 r->complex_uri = 1;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
417 state = sw_uri;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
418 break;
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
419 case '+':
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
420 r->plus_in_uri = 1;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
421 break;
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
422 case '\0':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
423 r->zero_in_uri = 1;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
424 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428 /* URI */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 case sw_uri:
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
430
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
431 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
432 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
433 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
434
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435 switch (ch) {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
436 case ' ':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
437 r->uri_end = p;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
438 state = sw_http_09;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
439 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440 case CR:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
441 r->uri_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442 r->http_minor = 9;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
446 r->uri_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 r->http_minor = 9;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
448 goto done;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
449 case '#':
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
450 r->complex_uri = 1;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
451 break;
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
452 case '\0':
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
453 r->zero_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 /* space+ after URI */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459 case sw_http_09:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461 case ' ':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 case CR:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464 r->http_minor = 9;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 case LF:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 r->http_minor = 9;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
469 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470 case 'H':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
471 r->http_protocol.data = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 state = sw_http_H;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
477 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
478
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
479 case sw_http_H:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481 case 'T':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482 state = sw_http_HT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
483 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
484 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 case sw_http_HT:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 case 'T':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492 state = sw_http_HTT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499 case sw_http_HTT:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
500 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
501 case 'P':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
502 state = sw_http_HTTP;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
503 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
504 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
505 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
506 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
509 case sw_http_HTTP:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
510 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
511 case '/':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
512 state = sw_first_major_digit;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
513 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
514 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
515 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 /* first digit of major HTTP version */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
520 case sw_first_major_digit:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
521 if (ch < '1' || ch > '9') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
523 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
524
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
525 r->http_major = ch - '0';
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
526 state = sw_major_digit;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
527 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
528
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
529 /* major HTTP version or dot */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
530 case sw_major_digit:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
531 if (ch == '.') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
532 state = sw_first_minor_digit;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
533 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
534 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
535
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
536 if (ch < '0' || ch > '9') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
537 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
538 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
539
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 r->http_major = r->http_major * 10 + ch - '0';
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543 /* first digit of minor HTTP version */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544 case sw_first_minor_digit:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545 if (ch < '0' || ch > '9') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
549 r->http_minor = ch - '0';
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
550 state = sw_minor_digit;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
552
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
553 /* minor HTTP version or end of request line */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
554 case sw_minor_digit:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
555 if (ch == CR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
556 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
557 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
558 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560 if (ch == LF) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
561 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
562 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
563
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564 if (ch < '0' || ch > '9') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
566 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
567
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
568 r->http_minor = r->http_minor * 10 + ch - '0';
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
569 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
571 /* end of request line */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
572 case sw_almost_done:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
573 r->request_end = p - 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
574 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
575 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
576 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
577 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
578 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
579 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
580 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
583 b->pos = p;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
584 r->state = state;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
585
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
586 return NGX_AGAIN;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
587
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
588 done:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
589
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
590 b->pos = p + 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
591
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
592 if (r->request_end == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
593 r->request_end = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
594 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
595
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
596 r->http_version = r->http_major * 1000 + r->http_minor;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
597 r->state = sw_start;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
598
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
599 if (r->http_version == 9 && r->method != NGX_HTTP_GET) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
600 return NGX_HTTP_PARSE_INVALID_09_METHOD;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
602
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
603 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
604 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
605
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
606
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
607 ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
608 ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
609 {
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
610 u_char c, ch, *p;
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
611 ngx_uint_t hash, i;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
612 enum {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
613 sw_start = 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
614 sw_name,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615 sw_space_before_value,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
616 sw_value,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
617 sw_space_after_value,
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
618 sw_ignore_line,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
619 sw_almost_done,
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
620 sw_header_almost_done
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
621 } state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622
250
fbf2b2f66c9f nginx 0.4.10
Igor Sysoev <http://sysoev.ru>
parents: 216
diff changeset
623 /* the last '\0' is not needed because string is zero terminated */
fbf2b2f66c9f nginx 0.4.10
Igor Sysoev <http://sysoev.ru>
parents: 216
diff changeset
624
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
625 static u_char lowcase[] =
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
626 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
627 "\0\0\0\0\0\0\0\0\0\0\0\0\0-\0\0" "0123456789\0\0\0\0\0\0"
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
628 "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
629 "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
630 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
631 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
632 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
633 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
634
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
635 state = r->state;
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
636 hash = r->header_hash;
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
637 i = r->lowcase_index;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
638
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
639 for (p = b->pos; p < b->last; p++) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
640 ch = *p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
641
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
642 switch (state) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
643
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
644 /* first char */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
645 case sw_start:
60
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
646 r->invalid_header = 0;
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
647
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
648 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
649 case CR:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
650 r->header_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
651 state = sw_header_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
652 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
653 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
654 r->header_end = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
655 goto header_done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
656 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
657 state = sw_name;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
658 r->header_name_start = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
659
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
660 c = lowcase[ch];
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
661
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
662 if (c) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
663 hash = ngx_hash(0, c);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
664 r->lowcase_header[0] = c;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
665 i = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
666 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
667 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
668
60
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
669 r->invalid_header = 1;
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
670
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
671 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
672
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
673 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
674 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
675
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
676 /* header name */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
677 case sw_name:
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
678 c = lowcase[ch];
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
679
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
680 if (c) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
681 hash = ngx_hash(hash, c);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
682 r->lowcase_header[i++] = c;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
683 i &= ~NGX_HTTP_LC_HEADER_LEN;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
684 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
685 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
686
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
687 if (ch == ':') {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
688 r->header_name_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
689 state = sw_space_before_value;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
690 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
691 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
692
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
693 if (ch == CR) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
694 r->header_name_end = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
695 r->header_start = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
696 r->header_end = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
697 state = sw_almost_done;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
698 break;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
699 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
700
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
701 if (ch == LF) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
702 r->header_name_end = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
703 r->header_start = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
704 r->header_end = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
705 goto done;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
706 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
707
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
708 /* IIS may send the duplicate "HTTP/1.1 ..." lines */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
709 if (ch == '/'
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
710 && r->upstream
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
711 && p - r->header_name_start == 4
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
712 && ngx_strncmp(r->header_name_start, "HTTP", 4) == 0)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
713 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
714 state = sw_ignore_line;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
715 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
716 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
717
60
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
718 r->invalid_header = 1;
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
719
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
720 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
721
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
722 /* space* before header value */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
723 case sw_space_before_value:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
724 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
725 case ' ':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
726 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
727 case CR:
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
728 r->header_start = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
729 r->header_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
730 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
731 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
732 case LF:
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
733 r->header_start = p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
734 r->header_end = p;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
735 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
736 default:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
737 r->header_start = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
738 state = sw_value;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
739 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
740 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
741 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
742
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
743 /* header value */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
744 case sw_value:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
745 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
746 case ' ':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
747 r->header_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
748 state = sw_space_after_value;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
749 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
750 case CR:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
751 r->header_end = p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
752 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
753 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
754 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
755 r->header_end = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
756 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
757 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
758 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
759
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
760 /* space* before end of header line */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
761 case sw_space_after_value:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
762 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
763 case ' ':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
764 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
765 case CR:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
766 state = sw_almost_done;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
767 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
768 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
769 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
770 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
771 state = sw_value;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
772 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
773 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
774 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
775
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
776 /* ignore header line */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
777 case sw_ignore_line:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
778 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
779 case LF:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
780 state = sw_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
781 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
782 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
783 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
784 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
785 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
786
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
787 /* end of header line */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
788 case sw_almost_done:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
789 switch (ch) {
172
1b490fc19afa nginx 0.3.33
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
790 case CR:
1b490fc19afa nginx 0.3.33
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
791 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
792 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
793 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
794 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
795 return NGX_HTTP_PARSE_INVALID_HEADER;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
796 }
174
3080c5392b89 nginx 0.3.34
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
797 break;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
798
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
799 /* end of header */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
800 case sw_header_almost_done:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
801 switch (ch) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
802 case LF:
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
803 goto header_done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
804 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
805 return NGX_HTTP_PARSE_INVALID_HEADER;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
806 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
807 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
808 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
809
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
810 b->pos = p;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
811 r->state = state;
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
812 r->header_hash = hash;
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
813 r->lowcase_index = i;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
814
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
815 return NGX_AGAIN;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
816
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
817 done:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
818
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
819 b->pos = p + 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
820 r->state = sw_start;
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
821 r->header_hash = hash;
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
822 r->lowcase_index = i;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
823
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
824 return NGX_OK;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
825
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
826 header_done:
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
827
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
828 b->pos = p + 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
829 r->state = sw_start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
830
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
831 return NGX_HTTP_PARSE_HEADER_DONE;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
832 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
833
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
834
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
835 ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
836 ngx_http_parse_complex_uri(ngx_http_request_t *r)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
837 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
838 u_char c, ch, decoded, *p, *u;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
839 enum {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
840 sw_usual = 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
841 sw_slash,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
842 sw_dot,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
843 sw_dot_dot,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
844 #if (NGX_WIN32)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
845 sw_dot_dot_dot,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
846 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
847 sw_quoted,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
848 sw_quoted_second
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
849 } state, quoted_state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
850
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
851 #if (NGX_SUPPRESS_WARN)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
852 decoded = '\0';
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
853 quoted_state = sw_usual;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
854 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
855
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
856 state = sw_usual;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
857 p = r->uri_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
858 u = r->uri.data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
859 r->uri_ext = NULL;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
860 r->args_start = NULL;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
861
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
862 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
863
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
864 while (p <= r->uri_end) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
865
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
866 /*
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
867 * we use "ch = *p++" inside the cycle, but this operation is safe,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
868 * because after the URI there is always at least one charcter:
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
869 * the line feed
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
870 */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
871
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
872 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
873 "s:%d in:'%Xd:%c', out:'%c'", state, ch, ch, *u);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
874
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
875 switch (state) {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
876
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
877 case sw_usual:
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
878
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
879 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
880 *u++ = ch;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
881 ch = *p++;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
882 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
883 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
884
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
885 switch(ch) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
886 #if (NGX_WIN32)
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
887 case '\\':
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
888 r->uri_ext = NULL;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
889
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
890 if (p == r->uri_start + r->uri.len) {
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
891
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
892 /*
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
893 * we omit the last "\" to cause redirect because
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
894 * the browsers do not treat "\" as "/" in relative URL path
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
895 */
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
896
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
897 break;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
898 }
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
899
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
900 state = sw_slash;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
901 *u++ = '/';
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
902 break;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
903 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
904 case '/':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
905 r->uri_ext = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
906 state = sw_slash;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
907 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
908 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
909 case '%':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
910 quoted_state = state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
911 state = sw_quoted;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
912 break;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
913 case '?':
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
914 r->args_start = p;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
915 goto args;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
916 case '#':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
917 goto done;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
918 case '.':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
919 r->uri_ext = u + 1;
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 20
diff changeset
920 *u++ = ch;
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 20
diff changeset
921 break;
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
922 case '+':
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
923 r->plus_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
924 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
925 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
926 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
927 }
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
928
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
929 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
930 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
931
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
932 case sw_slash:
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
933
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
934 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
935 state = sw_usual;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
936 *u++ = ch;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
937 ch = *p++;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
938 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
939 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
940
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
941 switch(ch) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
942 #if (NGX_WIN32)
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
943 case '\\':
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
944 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
945 case '/':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
946 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
947 case '.':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
948 state = sw_dot;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
949 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
950 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
951 case '%':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
952 quoted_state = state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
953 state = sw_quoted;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
954 break;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
955 case '?':
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
956 r->args_start = p;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
957 goto args;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
958 case '#':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
959 goto done;
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
960 case '+':
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
961 r->plus_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
962 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
963 state = sw_usual;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
964 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
965 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
966 }
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
967
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
968 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
969 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
970
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
971 case sw_dot:
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
972
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
973 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
974 state = sw_usual;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
975 *u++ = ch;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
976 ch = *p++;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
977 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
978 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
979
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
980 switch(ch) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
981 #if (NGX_WIN32)
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
982 case '\\':
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
983 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
984 case '/':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
985 state = sw_slash;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
986 u--;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
987 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
988 case '.':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
989 state = sw_dot_dot;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
990 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
991 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
992 case '%':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
993 quoted_state = state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
994 state = sw_quoted;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
995 break;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
996 case '?':
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
997 r->args_start = p;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
998 goto args;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
999 case '#':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1000 goto done;
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1001 case '+':
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1002 r->plus_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1003 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1004 state = sw_usual;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1005 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1006 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1007 }
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1008
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1009 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1010 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1011
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1012 case sw_dot_dot:
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1013
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1014 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1015 state = sw_usual;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1016 *u++ = ch;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1017 ch = *p++;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1018 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1019 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1020
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1021 switch(ch) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1022 #if (NGX_WIN32)
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1023 case '\\':
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1024 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1025 case '/':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1026 state = sw_slash;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1027 u -= 4;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1028 if (u < r->uri.data) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1029 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1030 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1031 while (*(u - 1) != '/') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1032 u--;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1033 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1034 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1035 case '%':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1036 quoted_state = state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1037 state = sw_quoted;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1038 break;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1039 case '?':
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1040 r->args_start = p;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1041 goto args;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1042 case '#':
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1043 goto done;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1044 #if (NGX_WIN32)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1045 case '.':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1046 state = sw_dot_dot_dot;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1047 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1048 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1049 #endif
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1050 case '+':
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1051 r->plus_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1052 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1053 state = sw_usual;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1054 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1055 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1056 }
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1057
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1058 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1059 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1060
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1061 #if (NGX_WIN32)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1062 case sw_dot_dot_dot:
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1063
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1064 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1065 state = sw_usual;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1066 *u++ = ch;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1067 ch = *p++;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1068 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1069 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1070
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1071 switch(ch) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1072 case '\\':
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1073 case '/':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1074 state = sw_slash;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1075 u -= 5;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1076 if (u < r->uri.data) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1077 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1078 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1079 while (*u != '/') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1080 u--;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1081 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1082 if (u < r->uri.data) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1083 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1084 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1085 while (*(u - 1) != '/') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1086 u--;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1087 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1088 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1089 case '%':
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1090 quoted_state = state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1091 state = sw_quoted;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1092 break;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1093 case '?':
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1094 r->args_start = p;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1095 goto args;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1096 case '#':
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1097 goto done;
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1098 case '+':
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1099 r->plus_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1100 default:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1101 state = sw_usual;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1102 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1103 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1104 }
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1105
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1106 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1107 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1108 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1109
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1110 case sw_quoted:
216
fa32d59d9a15 nginx 0.3.55
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
1111 r->quoted_uri = 1;
fa32d59d9a15 nginx 0.3.55
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
1112
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1113 if (ch >= '0' && ch <= '9') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1114 decoded = (u_char) (ch - '0');
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1115 state = sw_quoted_second;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1116 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1117 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1118 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1119
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1120 c = (u_char) (ch | 0x20);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1121 if (c >= 'a' && c <= 'f') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1122 decoded = (u_char) (c - 'a' + 10);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1123 state = sw_quoted_second;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1124 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1125 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1126 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1127
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1128 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1129
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1130 case sw_quoted_second:
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1131 if (ch >= '0' && ch <= '9') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1132 ch = (u_char) ((decoded << 4) + ch - '0');
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1133
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1134 if (ch == '%') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1135 state = sw_usual;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1136 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1137 ch = *p++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1138 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1139 }
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1140
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1141 if (ch == '#') {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1142 *u++ = ch;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1143 ch = *p++;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1144
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1145 } else if (ch == '\0') {
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1146 r->zero_in_uri = 1;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1147 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1148
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1149 state = quoted_state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1150 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1151 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1152
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1153 c = (u_char) (ch | 0x20);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1154 if (c >= 'a' && c <= 'f') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1155 ch = (u_char) ((decoded << 4) + c - 'a' + 10);
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1156
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1157 if (ch == '?') {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1158 *u++ = ch;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1159 ch = *p++;
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1160
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1161 } else if (ch == '+') {
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1162 r->plus_in_uri = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1163 }
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1164
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1165 state = quoted_state;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1166 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1167 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1168
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1169 return NGX_HTTP_PARSE_INVALID_REQUEST;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1170 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1171 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1172
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1173 done:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1174
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1175 r->uri.len = u - r->uri.data;
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1176
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1177 if (r->uri_ext) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1178 r->exten.len = u - r->uri_ext;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1179 r->exten.data = r->uri_ext;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1180 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1181
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1182 r->uri_ext = NULL;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1183
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1184 return NGX_OK;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1185
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1186 args:
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1187
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1188 while (p < r->uri_end) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1189 if (*p++ != '#') {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1190 continue;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1191 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1192
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1193 r->args.len = p - 1 - r->args_start;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1194 r->args.data = r->args_start;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1195 r->args_start = NULL;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1196
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1197 break;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1198 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1199
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1200 r->uri.len = u - r->uri.data;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1201
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1202 if (r->uri_ext) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1203 r->exten.len = u - r->uri_ext;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1204 r->exten.data = r->uri_ext;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1205 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1206
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1207 r->uri_ext = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1208
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1209 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1210 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1211
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1212
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1213 ngx_int_t
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1214 ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1215 ngx_str_t *args, ngx_uint_t *flags)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1216 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1217 u_char ch, *p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1218 size_t len;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1219
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1220 len = uri->len;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1221 p = uri->data;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1222
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1223 if (len == 0 || p[0] == '?') {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1224 goto unsafe;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1225 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1226
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1227 if (p[0] == '.' && len == 3 && p[1] == '.' && (p[2] == '/'
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1228 #if (NGX_WIN32)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1229 || p[2] == '\\'
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1230 #endif
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1231 ))
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1232 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1233 goto unsafe;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1234 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1235
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1236 for ( /* void */ ; len; len--) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1237
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1238 ch = *p++;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1239
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1240 if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1241 continue;
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1242 }
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1243
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1244 if (ch == '?') {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1245 args->len = len - 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1246 args->data = p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1247 uri->len -= len;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1248
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1249 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1250 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1251
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1252 if (ch == '\0') {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1253 *flags |= NGX_HTTP_ZERO_IN_URI;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1254 continue;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1255 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1256
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1257 if ((ch == '/'
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1258 #if (NGX_WIN32)
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1259 || ch == '\\'
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1260 #endif
254
f3ec44f4a53b nginx 0.4.12
Igor Sysoev <http://sysoev.ru>
parents: 250
diff changeset
1261 ) && len > 2)
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1262 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1263 /* detect "/../" */
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1264
124
12acc273e340 nginx 0.3.9
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1265 if (p[0] == '.' && p[1] == '.' && p[2] == '/') {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1266 goto unsafe;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1267 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1268
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1269 #if (NGX_WIN32)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1270
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1271 if (p[2] == '\\') {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1272 goto unsafe;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1273 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1274
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1275 if (len > 3) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1276
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1277 /* detect "/.../" */
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1278
124
12acc273e340 nginx 0.3.9
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1279 if (p[0] == '.' && p[1] == '.' && p[2] == '.'
12acc273e340 nginx 0.3.9
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1280 && (p[3] == '/' || p[3] == '\\'))
12acc273e340 nginx 0.3.9
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1281 {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1282 goto unsafe;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1283 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1284 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1285 #endif
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1286 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1287 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1288
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1289 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1290
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1291 unsafe:
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1292
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1293 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1294 "unsafe URI \"%V\" was detected", uri);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1295
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1296 return NGX_ERROR;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1297 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1298
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1299
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1300 ngx_int_t
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1301 ngx_http_parse_multi_header_lines(ngx_array_t *headers, ngx_str_t *name,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1302 ngx_str_t *value)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1303 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1304 ngx_uint_t i;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1305 u_char *start, *last, *end, ch;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1306 ngx_table_elt_t **h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1307
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1308 h = headers->elts;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1309
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1310 for (i = 0; i < headers->nelts; i++) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1311
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1312 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, headers->pool->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1313 "parse header: \"%V: %V\"", &h[i]->key, &h[i]->value);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1314
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1315 if (name->len > h[i]->value.len) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1316 continue;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1317 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 124
diff changeset
1318
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1319 start = h[i]->value.data;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1320 end = h[i]->value.data + h[i]->value.len;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1321
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1322 while (start < end) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1323
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1324 if (ngx_strncasecmp(start, name->data, name->len) != 0) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1325 goto skip;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1326 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1327
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1328 for (start += name->len; start < end && *start == ' '; start++) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1329 /* void */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1330 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1331
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1332 if (value == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1333 if (start == end || *start == ',') {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1334 return i;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1335 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1336
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1337 goto skip;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1338 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1339
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1340 if (start == end || *start++ != '=') {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1341 /* the invalid header value */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1342 goto skip;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1343 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1344
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1345 while (start < end && *start == ' ') { start++; }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1346
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1347 for (last = start; last < end && *last != ';'; last++) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1348 /* void */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1349 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1350
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1351 value->len = last - start;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1352 value->data = start;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1353
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1354 return i;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1355
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1356 skip:
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1357
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1358 while (start < end) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1359 ch = *start++;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1360 if (ch == ';' || ch == ',') {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1361 break;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1362 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1363 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1364
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1365 while (start < end && *start == ' ') { start++; }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1366 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1367 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1368
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1369 return NGX_DECLINED;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1370 }