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 */