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,