Mercurial > hg > nginx
comparison src/http/ngx_http_parse.c @ 314:d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 14 Apr 2004 05:57:36 +0000 |
parents | 117ccc7c4055 |
children | ba876b26b76d |
comparison
equal
deleted
inserted
replaced
313:98f1a8028067 | 314:d71c87d11b16 |
---|---|
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 #include <ngx_http.h> | 4 #include <ngx_http.h> |
5 | 5 |
6 ngx_int_t ngx_http_parse_request_line(ngx_http_request_t *r) | 6 ngx_int_t ngx_http_parse_request_line(ngx_http_request_t *r) |
7 { | 7 { |
8 u_char ch, *p; | 8 u_char ch, *p, *m; |
9 enum { | 9 enum { |
10 sw_start = 0, | 10 sw_start = 0, |
11 sw_G, | 11 sw_method, |
12 sw_GE, | |
13 sw_H, | |
14 sw_HE, | |
15 sw_HEA, | |
16 sw_P, | |
17 sw_PO, | |
18 sw_POS, | |
19 sw_space_after_method, | 12 sw_space_after_method, |
20 sw_spaces_before_uri, | 13 sw_spaces_before_uri, |
14 sw_schema, | |
15 sw_schema_slash, | |
16 sw_schema_slash_slash, | |
17 sw_host, | |
18 sw_port, | |
21 sw_after_slash_in_uri, | 19 sw_after_slash_in_uri, |
22 sw_check_uri, | 20 sw_check_uri, |
23 sw_uri, | 21 sw_uri, |
24 sw_http_09, | 22 sw_http_09, |
25 sw_http_H, | 23 sw_http_H, |
46 | 44 |
47 /* HTTP methods: GET, HEAD, POST */ | 45 /* HTTP methods: GET, HEAD, POST */ |
48 case sw_start: | 46 case sw_start: |
49 r->request_start = p - 1; | 47 r->request_start = p - 1; |
50 | 48 |
51 switch (ch) { | 49 if (ch < 'A' || ch > 'Z') { |
52 case 'G': | |
53 state = sw_G; | |
54 break; | |
55 case 'H': | |
56 state = sw_H; | |
57 break; | |
58 case 'P': | |
59 state = sw_P; | |
60 break; | |
61 default: | |
62 return NGX_HTTP_PARSE_INVALID_METHOD; | 50 return NGX_HTTP_PARSE_INVALID_METHOD; |
63 } | 51 } |
64 break; | 52 |
65 | 53 state = sw_method; |
66 case sw_G: | 54 break; |
67 switch (ch) { | 55 |
68 case 'E': | 56 case sw_method: |
69 state = sw_GE; | 57 if (ch == ' ') { |
70 break; | 58 r->method_end = p - 1; |
71 default: | 59 m = r->request_start; |
60 | |
61 if (r->method_end - m == 3) { | |
62 | |
63 if (*m == 'G' && *(m + 1) == 'E' && *(m + 2) == 'T') { | |
64 r->method = NGX_HTTP_GET; | |
65 } | |
66 | |
67 } else if (r->method_end - m == 4) { | |
68 | |
69 if (*m == 'P' && *(m + 1) == 'O' | |
70 && *(m + 2) == 'T' && *(m + 3) == 'T') | |
71 { | |
72 r->method = NGX_HTTP_POST; | |
73 | |
74 } else if (*m == 'H' && *(m + 1) == 'E' | |
75 && *(m + 2) == 'A' && *(m + 3) == 'D') | |
76 { | |
77 r->method = NGX_HTTP_HEAD; | |
78 } | |
79 } | |
80 | |
81 state = sw_spaces_before_uri; | |
82 break; | |
83 } | |
84 | |
85 if (ch < 'A' || ch > 'Z') { | |
72 return NGX_HTTP_PARSE_INVALID_METHOD; | 86 return NGX_HTTP_PARSE_INVALID_METHOD; |
73 } | 87 } |
74 break; | 88 |
75 | |
76 case sw_GE: | |
77 switch (ch) { | |
78 case 'T': | |
79 r->method = NGX_HTTP_GET; | |
80 state = sw_space_after_method; | |
81 break; | |
82 default: | |
83 return NGX_HTTP_PARSE_INVALID_METHOD; | |
84 } | |
85 break; | |
86 | |
87 case sw_H: | |
88 switch (ch) { | |
89 case 'E': | |
90 state = sw_HE; | |
91 break; | |
92 default: | |
93 return NGX_HTTP_PARSE_INVALID_METHOD; | |
94 } | |
95 break; | |
96 | |
97 case sw_HE: | |
98 switch (ch) { | |
99 case 'A': | |
100 state = sw_HEA; | |
101 break; | |
102 default: | |
103 return NGX_HTTP_PARSE_INVALID_METHOD; | |
104 } | |
105 break; | |
106 | |
107 case sw_HEA: | |
108 switch (ch) { | |
109 case 'D': | |
110 r->method = NGX_HTTP_HEAD; | |
111 state = sw_space_after_method; | |
112 break; | |
113 default: | |
114 return NGX_HTTP_PARSE_INVALID_METHOD; | |
115 } | |
116 break; | |
117 | |
118 case sw_P: | |
119 switch (ch) { | |
120 case 'O': | |
121 state = sw_PO; | |
122 break; | |
123 default: | |
124 return NGX_HTTP_PARSE_INVALID_METHOD; | |
125 } | |
126 break; | |
127 | |
128 case sw_PO: | |
129 switch (ch) { | |
130 case 'S': | |
131 state = sw_POS; | |
132 break; | |
133 default: | |
134 return NGX_HTTP_PARSE_INVALID_METHOD; | |
135 } | |
136 break; | |
137 | |
138 case sw_POS: | |
139 switch (ch) { | |
140 case 'T': | |
141 r->method = NGX_HTTP_POST; | |
142 state = sw_space_after_method; | |
143 break; | |
144 default: | |
145 return NGX_HTTP_PARSE_INVALID_METHOD; | |
146 } | |
147 break; | 89 break; |
148 | 90 |
149 /* single space after method */ | 91 /* single space after method */ |
150 case sw_space_after_method: | 92 case sw_space_after_method: |
151 switch (ch) { | 93 switch (ch) { |
165 state = sw_after_slash_in_uri; | 107 state = sw_after_slash_in_uri; |
166 break; | 108 break; |
167 case ' ': | 109 case ' ': |
168 break; | 110 break; |
169 default: | 111 default: |
170 r->unusual_uri = 1; | 112 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { |
113 r->schema_start = p - 1; | |
114 state = sw_schema; | |
115 break; | |
116 } | |
117 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
118 } | |
119 break; | |
120 | |
121 case sw_schema: | |
122 switch (ch) { | |
123 case ':': | |
124 r->schema_end = p - 1; | |
125 state = sw_schema_slash; | |
126 break; | |
127 default: | |
128 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { | |
129 break; | |
130 } | |
131 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
132 } | |
133 break; | |
134 | |
135 case sw_schema_slash: | |
136 switch (ch) { | |
137 case '/': | |
138 state = sw_schema_slash_slash; | |
139 break; | |
140 default: | |
141 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
142 } | |
143 break; | |
144 | |
145 case sw_schema_slash_slash: | |
146 switch (ch) { | |
147 case '/': | |
148 r->host_start = p - 1; | |
149 state = sw_host; | |
150 break; | |
151 default: | |
152 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
153 } | |
154 break; | |
155 | |
156 case sw_host: | |
157 switch (ch) { | |
158 case ':': | |
159 r->host_end = p - 1; | |
160 state = sw_port; | |
161 break; | |
162 case '/': | |
163 r->host_end = p - 1; | |
171 r->uri_start = p - 1; | 164 r->uri_start = p - 1; |
172 state = sw_uri; | 165 state = sw_after_slash_in_uri; |
166 break; | |
167 default: | |
168 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') | |
169 || (ch >= '0' && ch <= '9') || ch == '.' || ch == '-') | |
170 { | |
171 break; | |
172 } | |
173 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
174 } | |
175 break; | |
176 | |
177 case sw_port: | |
178 switch (ch) { | |
179 case '/': | |
180 r->port_end = p - 1; | |
181 r->uri_start = p - 1; | |
182 state = sw_after_slash_in_uri; | |
183 break; | |
184 default: | |
185 if (ch < '0' && ch > '9') { | |
186 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
187 } | |
173 break; | 188 break; |
174 } | 189 } |
175 break; | 190 break; |
176 | 191 |
177 /* check "/.", "//", and "%" in URI */ | 192 /* check "/.", "//", and "%" in URI */ |