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 26ff8d6b618d
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;