Mercurial > hg > nginx-vendor-0-7
comparison src/http/ngx_http_parse.c @ 300:cba14c1e2a4b NGINX_0_5_20
nginx 0.5.20
*) Feature: the "sendfile_max_chunk" directive.
*) Feature: the "$http_...", "$sent_http_...", and "$upstream_http_..."
variables may be changed using the "set" directive.
*) Bugfix: a segmentation fault might occur in worker process if the
SSI command 'if expr="$var = /"' was used.
*) Bugfix: trailing boundary of multipart range response was
transferred incorrectly.
Thanks to Evan Miller.
*) Bugfix: nginx did not work on Solaris/sparc64 if it was built by Sun
Studio.
Thanks to Andrei Nigmatulin.
*) Bugfix: the ngx_http_perl_module could not built by Solaris make.
Thanks to Andrei Nigmatulin.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 07 May 2007 00:00:00 +0400 |
parents | 27d9d1f26b38 |
children | 4276c2f1f434 |
comparison
equal
deleted
inserted
replaced
299:7d0d14dc5fd7 | 300:cba14c1e2a4b |
---|---|
28 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ | 28 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ |
29 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ | 29 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ |
30 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ | 30 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ |
31 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ | 31 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ |
32 }; | 32 }; |
33 | |
34 | |
35 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) | |
36 | |
37 #define ngx_str3_cmp(m, c0, c1, c2, c3) \ | |
38 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) | |
39 | |
40 #define ngx_str3Ocmp(m, c0, c1, c2, c3) \ | |
41 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) | |
42 | |
43 #define ngx_str4cmp(m, c0, c1, c2, c3) \ | |
44 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) | |
45 | |
46 #define ngx_str5cmp(m, c0, c1, c2, c3, c4) \ | |
47 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \ | |
48 && m[4] == c4 | |
49 | |
50 #define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5) \ | |
51 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \ | |
52 && (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4) | |
53 | |
54 #define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \ | |
55 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \ | |
56 && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4) | |
57 | |
58 #define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \ | |
59 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \ | |
60 && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4) | |
61 | |
62 #define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \ | |
63 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \ | |
64 && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4) \ | |
65 && m[8] == c8 | |
66 | |
67 #else /* !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) */ | |
68 | |
69 #define ngx_str3_cmp(m, c0, c1, c2, c3) \ | |
70 m[0] == c0 && m[1] == c1 && m[2] == c2 | |
71 | |
72 #define ngx_str3Ocmp(m, c0, c1, c2, c3) \ | |
73 m[0] == c0 && m[2] == c2 && m[3] == c3 | |
74 | |
75 #define ngx_str4cmp(m, c0, c1, c2, c3) \ | |
76 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 | |
77 | |
78 #define ngx_str5cmp(m, c0, c1, c2, c3, c4) \ | |
79 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4 | |
80 | |
81 #define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5) \ | |
82 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \ | |
83 && m[4] == c4 && m[5] == c5 | |
84 | |
85 #define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \ | |
86 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \ | |
87 && m[4] == c4 && m[5] == c5 && m[6] == c6 | |
88 | |
89 #define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \ | |
90 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \ | |
91 && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 | |
92 | |
93 #define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \ | |
94 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \ | |
95 && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 && m[8] == c8 | |
96 | |
97 #endif | |
33 | 98 |
34 | 99 |
35 /* gcc, icc, msvc and others compile these switches as an jump table */ | 100 /* gcc, icc, msvc and others compile these switches as an jump table */ |
36 | 101 |
37 ngx_int_t | 102 ngx_int_t |
90 m = r->request_start; | 155 m = r->request_start; |
91 | 156 |
92 switch (p - m) { | 157 switch (p - m) { |
93 | 158 |
94 case 3: | 159 case 3: |
95 if (m[0] == 'G' && m[1] == 'E' && m[2] == 'T') { | 160 if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) { |
96 r->method = NGX_HTTP_GET; | 161 r->method = NGX_HTTP_GET; |
97 break; | 162 break; |
98 } | 163 } |
99 | 164 |
100 if (m[0] == 'P' && m[1] == 'U' && m[2] == 'T') { | 165 if (ngx_str3_cmp(m, 'P', 'U', 'T', ' ')) { |
101 r->method = NGX_HTTP_PUT; | 166 r->method = NGX_HTTP_PUT; |
102 break; | 167 break; |
103 } | 168 } |
104 | 169 |
105 break; | 170 break; |
106 | 171 |
107 case 4: | 172 case 4: |
108 if (m[1] == 'O') { | 173 if (m[1] == 'O') { |
109 | 174 |
110 if (m[0] == 'P' && m[2] == 'S' && m[3] == 'T') { | 175 if (ngx_str3Ocmp(m, 'P', 'O', 'S', 'T')) { |
111 r->method = NGX_HTTP_POST; | 176 r->method = NGX_HTTP_POST; |
112 break; | 177 break; |
113 } | 178 } |
114 | 179 |
115 if (m[0] == 'C' && m[2] == 'P' && m[3] == 'Y') { | 180 if (ngx_str3Ocmp(m, 'C', 'O', 'P', 'Y')) { |
116 r->method = NGX_HTTP_COPY; | 181 r->method = NGX_HTTP_COPY; |
117 break; | 182 break; |
118 } | 183 } |
119 | 184 |
120 if (m[0] == 'M' && m[2] == 'V' && m[3] == 'E') { | 185 if (ngx_str3Ocmp(m, 'M', 'O', 'V', 'E')) { |
121 r->method = NGX_HTTP_MOVE; | 186 r->method = NGX_HTTP_MOVE; |
122 break; | 187 break; |
123 } | 188 } |
124 | 189 |
125 if (m[0] == 'L' && m[2] == 'C' && m[3] == 'K') { | 190 if (ngx_str3Ocmp(m, 'L', 'O', 'C', 'K')) { |
126 r->method = NGX_HTTP_LOCK; | 191 r->method = NGX_HTTP_LOCK; |
127 break; | 192 break; |
128 } | 193 } |
129 | 194 |
130 } else { | 195 } else { |
131 | 196 |
132 if (m[0] == 'H' && m[1] == 'E' | 197 if (ngx_str4cmp(m, 'H', 'E', 'A', 'D')) { |
133 && m[2] == 'A' && m[3] == 'D') | |
134 { | |
135 r->method = NGX_HTTP_HEAD; | 198 r->method = NGX_HTTP_HEAD; |
136 break; | 199 break; |
137 } | 200 } |
138 } | 201 } |
139 | 202 |
140 break; | 203 break; |
141 | 204 |
142 case 5: | 205 case 5: |
143 if (m[0] == 'M' && m[1] == 'K' | 206 if (ngx_str5cmp(m, 'M', 'K', 'C', 'O', 'L')) { |
144 && m[2] == 'C' && m[3] == 'O' && m[4] == 'L') | |
145 { | |
146 r->method = NGX_HTTP_MKCOL; | 207 r->method = NGX_HTTP_MKCOL; |
147 } | 208 } |
148 | 209 |
149 if (m[0] == 'T' && m[1] == 'R' | 210 if (ngx_str5cmp(m, 'T', 'R', 'A', 'C', 'E')) { |
150 && m[2] == 'A' && m[3] == 'C' && m[4] == 'E') | |
151 { | |
152 r->method = NGX_HTTP_TRACE; | 211 r->method = NGX_HTTP_TRACE; |
153 } | 212 } |
154 | 213 |
155 break; | 214 break; |
156 | 215 |
157 case 6: | 216 case 6: |
158 if (m[0] == 'D' && m[1] == 'E' && m[2] == 'L' | 217 if (ngx_str6cmp(m, 'D', 'E', 'L', 'E', 'T', 'E')) { |
159 && m[3] == 'E' && m[4] == 'T' && m[5] == 'E') | |
160 { | |
161 r->method = NGX_HTTP_DELETE; | 218 r->method = NGX_HTTP_DELETE; |
162 break; | 219 break; |
163 } | 220 } |
164 | 221 |
165 if (m[0] == 'U' && m[1] == 'N' && m[2] == 'L' | 222 if (ngx_str6cmp(m, 'U', 'N', 'L', 'O', 'C', 'K')) { |
166 && m[3] == 'O' && m[4] == 'C' && m[5] == 'K') | |
167 { | |
168 r->method = NGX_HTTP_UNLOCK; | 223 r->method = NGX_HTTP_UNLOCK; |
169 break; | 224 break; |
170 } | 225 } |
171 | 226 |
172 break; | 227 break; |
173 | 228 |
174 case 7: | 229 case 7: |
175 if (m[0] == 'O' && m[1] == 'P' | 230 if (ngx_str7_cmp(m, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' ')) |
176 && m[2] == 'T' && m[3] == 'I' | |
177 && m[4] == 'O' && m[5] == 'N' && m[6] == 'S') | |
178 { | 231 { |
179 r->method = NGX_HTTP_OPTIONS; | 232 r->method = NGX_HTTP_OPTIONS; |
180 } | 233 } |
181 | 234 |
182 break; | 235 break; |
183 | 236 |
184 case 8: | 237 case 8: |
185 if (m[0] == 'P' && m[1] == 'R' | 238 if (ngx_str8cmp(m, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D')) |
186 && m[2] == 'O' && m[3] == 'P' && m[4] == 'F' | |
187 && m[5] == 'I' && m[6] == 'N' && m[7] == 'D') | |
188 { | 239 { |
189 r->method = NGX_HTTP_PROPFIND; | 240 r->method = NGX_HTTP_PROPFIND; |
190 } | 241 } |
191 | 242 |
192 break; | 243 break; |
193 | 244 |
194 case 9: | 245 case 9: |
195 if (m[0] == 'P' && m[1] == 'R' && m[2] == 'O' | 246 if (ngx_str9cmp(m, |
196 && m[3] == 'P' && m[4] == 'P' && m[5] == 'A' | 247 'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H')) |
197 && m[6] == 'T' && m[7] == 'C' && m[8] == 'H') | |
198 { | 248 { |
199 r->method = NGX_HTTP_PROPPATCH; | 249 r->method = NGX_HTTP_PROPPATCH; |
200 } | 250 } |
201 | 251 |
202 break; | 252 break; |