Mercurial > hg > nginx
comparison src/http/ngx_http_parse.c @ 5121:c0f7b94e88ba
Preliminary experimental support for SPDY draft 2.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Wed, 20 Mar 2013 10:36:57 +0000 |
parents | 1c9d8b6523c0 |
children | cef7b42d50b3 |
comparison
equal
deleted
inserted
replaced
5120:7956af6b6a02 | 5121:c0f7b94e88ba |
---|---|
1073 return NGX_HTTP_PARSE_HEADER_DONE; | 1073 return NGX_HTTP_PARSE_HEADER_DONE; |
1074 } | 1074 } |
1075 | 1075 |
1076 | 1076 |
1077 ngx_int_t | 1077 ngx_int_t |
1078 ngx_http_parse_uri(ngx_http_request_t *r) | |
1079 { | |
1080 u_char *p, ch; | |
1081 enum { | |
1082 sw_start = 0, | |
1083 sw_after_slash_in_uri, | |
1084 sw_check_uri, | |
1085 sw_uri | |
1086 } state; | |
1087 | |
1088 state = sw_start; | |
1089 | |
1090 for (p = r->uri_start; p != r->uri_end; p++) { | |
1091 | |
1092 ch = *p; | |
1093 | |
1094 switch (state) { | |
1095 | |
1096 case sw_start: | |
1097 | |
1098 if (ch != '/') { | |
1099 return NGX_ERROR; | |
1100 } | |
1101 | |
1102 state = sw_after_slash_in_uri; | |
1103 break; | |
1104 | |
1105 /* check "/.", "//", "%", and "\" (Win32) in URI */ | |
1106 case sw_after_slash_in_uri: | |
1107 | |
1108 if (usual[ch >> 5] & (1 << (ch & 0x1f))) { | |
1109 state = sw_check_uri; | |
1110 break; | |
1111 } | |
1112 | |
1113 switch (ch) { | |
1114 case ' ': | |
1115 r->space_in_uri = 1; | |
1116 state = sw_check_uri; | |
1117 break; | |
1118 case '.': | |
1119 r->complex_uri = 1; | |
1120 state = sw_uri; | |
1121 break; | |
1122 case '%': | |
1123 r->quoted_uri = 1; | |
1124 state = sw_uri; | |
1125 break; | |
1126 case '/': | |
1127 r->complex_uri = 1; | |
1128 state = sw_uri; | |
1129 break; | |
1130 #if (NGX_WIN32) | |
1131 case '\\': | |
1132 r->complex_uri = 1; | |
1133 state = sw_uri; | |
1134 break; | |
1135 #endif | |
1136 case '?': | |
1137 r->args_start = p + 1; | |
1138 state = sw_uri; | |
1139 break; | |
1140 case '#': | |
1141 r->complex_uri = 1; | |
1142 state = sw_uri; | |
1143 break; | |
1144 case '+': | |
1145 r->plus_in_uri = 1; | |
1146 break; | |
1147 default: | |
1148 state = sw_check_uri; | |
1149 break; | |
1150 } | |
1151 break; | |
1152 | |
1153 /* check "/", "%" and "\" (Win32) in URI */ | |
1154 case sw_check_uri: | |
1155 | |
1156 if (usual[ch >> 5] & (1 << (ch & 0x1f))) { | |
1157 break; | |
1158 } | |
1159 | |
1160 switch (ch) { | |
1161 case '/': | |
1162 #if (NGX_WIN32) | |
1163 if (r->uri_ext == p) { | |
1164 r->complex_uri = 1; | |
1165 state = sw_uri; | |
1166 break; | |
1167 } | |
1168 #endif | |
1169 r->uri_ext = NULL; | |
1170 state = sw_after_slash_in_uri; | |
1171 break; | |
1172 case '.': | |
1173 r->uri_ext = p + 1; | |
1174 break; | |
1175 case ' ': | |
1176 r->space_in_uri = 1; | |
1177 break; | |
1178 #if (NGX_WIN32) | |
1179 case '\\': | |
1180 r->complex_uri = 1; | |
1181 state = sw_after_slash_in_uri; | |
1182 break; | |
1183 #endif | |
1184 case '%': | |
1185 r->quoted_uri = 1; | |
1186 state = sw_uri; | |
1187 break; | |
1188 case '?': | |
1189 r->args_start = p + 1; | |
1190 state = sw_uri; | |
1191 break; | |
1192 case '#': | |
1193 r->complex_uri = 1; | |
1194 state = sw_uri; | |
1195 break; | |
1196 case '+': | |
1197 r->plus_in_uri = 1; | |
1198 break; | |
1199 } | |
1200 break; | |
1201 | |
1202 /* URI */ | |
1203 case sw_uri: | |
1204 | |
1205 if (usual[ch >> 5] & (1 << (ch & 0x1f))) { | |
1206 break; | |
1207 } | |
1208 | |
1209 switch (ch) { | |
1210 case ' ': | |
1211 r->space_in_uri = 1; | |
1212 break; | |
1213 case '#': | |
1214 r->complex_uri = 1; | |
1215 break; | |
1216 } | |
1217 break; | |
1218 } | |
1219 } | |
1220 | |
1221 return NGX_OK; | |
1222 } | |
1223 | |
1224 | |
1225 ngx_int_t | |
1078 ngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes) | 1226 ngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes) |
1079 { | 1227 { |
1080 u_char c, ch, decoded, *p, *u; | 1228 u_char c, ch, decoded, *p, *u; |
1081 enum { | 1229 enum { |
1082 sw_usual = 0, | 1230 sw_usual = 0, |