| 2366 | } |
| 2367 | |
| 2368 | int |
| 2369 | http_parser_parse_url(const char *buf, size_t buflen, int is_connect, |
| 2370 | struct http_parser_url *u) |
| 2371 | { |
| 2372 | enum state s; |
| 2373 | const char *p; |
| 2374 | enum http_parser_url_fields uf, old_uf; |
| 2375 | int found_at = 0; |
| 2376 | |
| 2377 | u->port = u->field_set = 0; |
| 2378 | s = is_connect ? s_req_server_start : s_req_spaces_before_url; |
| 2379 | old_uf = UF_MAX; |
| 2380 | |
| 2381 | for (p = buf; p < buf + buflen; p++) { |
| 2382 | s = parse_url_char(s, *p); |
| 2383 | |
| 2384 | /* Figure out the next field that we're operating on */ |
| 2385 | switch (s) { |
| 2386 | case s_dead: |
| 2387 | return 1; |
| 2388 | |
| 2389 | /* Skip delimeters */ |
| 2390 | case s_req_schema_slash: |
| 2391 | case s_req_schema_slash_slash: |
| 2392 | case s_req_server_start: |
| 2393 | case s_req_query_string_start: |
| 2394 | case s_req_fragment_start: |
| 2395 | continue; |
| 2396 | |
| 2397 | case s_req_schema: |
| 2398 | uf = UF_SCHEMA; |
| 2399 | break; |
| 2400 | |
| 2401 | case s_req_server_with_at: |
| 2402 | found_at = 1; |
| 2403 | |
| 2404 | /* fallthrough */ |
| 2405 | case s_req_server: |
| 2406 | uf = UF_HOST; |
| 2407 | break; |
| 2408 | |
| 2409 | case s_req_path: |
| 2410 | uf = UF_PATH; |
| 2411 | break; |
| 2412 | |
| 2413 | case s_req_query_string: |
| 2414 | uf = UF_QUERY; |
| 2415 | break; |
| 2416 | |
| 2417 | case s_req_fragment: |
| 2418 | uf = UF_FRAGMENT; |
| 2419 | break; |
| 2420 | |
| 2421 | default: |
| 2422 | assert(!"Unexpected state"); |
| 2423 | return 1; |
| 2424 | } |
| 2425 |
no test coverage detected