| 2304 | } |
| 2305 | |
| 2306 | int |
| 2307 | http_parser_parse_url(const char *buf, size_t buflen, int is_connect, |
| 2308 | struct http_parser_url *u) |
| 2309 | { |
| 2310 | enum state s; |
| 2311 | const char *p; |
| 2312 | enum http_parser_url_fields uf, old_uf; |
| 2313 | int found_at = 0; |
| 2314 | |
| 2315 | u->port = u->field_set = 0; |
| 2316 | s = is_connect ? s_req_server_start : s_req_spaces_before_url; |
| 2317 | old_uf = UF_MAX; |
| 2318 | |
| 2319 | for (p = buf; p < buf + buflen; p++) { |
| 2320 | s = parse_url_char(s, *p); |
| 2321 | |
| 2322 | /* Figure out the next field that we're operating on */ |
| 2323 | switch (s) { |
| 2324 | case s_dead: |
| 2325 | return 1; |
| 2326 | |
| 2327 | /* Skip delimeters */ |
| 2328 | case s_req_schema_slash: |
| 2329 | case s_req_schema_slash_slash: |
| 2330 | case s_req_server_start: |
| 2331 | case s_req_query_string_start: |
| 2332 | case s_req_fragment_start: |
| 2333 | continue; |
| 2334 | |
| 2335 | case s_req_schema: |
| 2336 | uf = UF_SCHEMA; |
| 2337 | break; |
| 2338 | |
| 2339 | case s_req_server_with_at: |
| 2340 | found_at = 1; |
| 2341 | |
| 2342 | /* FALLTHROUGH */ |
| 2343 | case s_req_server: |
| 2344 | uf = UF_HOST; |
| 2345 | break; |
| 2346 | |
| 2347 | case s_req_path: |
| 2348 | uf = UF_PATH; |
| 2349 | break; |
| 2350 | |
| 2351 | case s_req_query_string: |
| 2352 | uf = UF_QUERY; |
| 2353 | break; |
| 2354 | |
| 2355 | case s_req_fragment: |
| 2356 | uf = UF_FRAGMENT; |
| 2357 | break; |
| 2358 | |
| 2359 | default: |
| 2360 | assert(!"Unexpected state"); |
| 2361 | return 1; |
| 2362 | } |
| 2363 | |