(
line: &str,
resolver: &SecretResolver,
)
| 695 | // output) are intentionally distinct nouns; renaming would obscure intent. |
| 696 | #[allow(clippy::similar_names)] |
| 697 | fn rewrite_request_line( |
| 698 | line: &str, |
| 699 | resolver: &SecretResolver, |
| 700 | ) -> Result<RewriteLineResult, UnresolvedPlaceholderError> { |
| 701 | // Request line format: METHOD SP REQUEST-URI SP HTTP-VERSION |
| 702 | let mut parts = line.splitn(3, ' '); |
| 703 | let unchanged = || { |
| 704 | Ok(RewriteLineResult { |
| 705 | line: line.to_string(), |
| 706 | redacted_target: None, |
| 707 | }) |
| 708 | }; |
| 709 | let Some(method) = parts.next() else { |
| 710 | return unchanged(); |
| 711 | }; |
| 712 | let Some(uri) = parts.next() else { |
| 713 | return unchanged(); |
| 714 | }; |
| 715 | let Some(version) = parts.next() else { |
| 716 | return unchanged(); |
| 717 | }; |
| 718 | |
| 719 | // Only rewrite if the URI contains a placeholder or a provider-shaped |
| 720 | // credential alias, including percent-encoded canonical placeholders. |
| 721 | if !contains_reserved_credential_marker(uri) { |
| 722 | return unchanged(); |
| 723 | } |
| 724 | |
| 725 | // Split URI into path and query |
| 726 | let (path, query) = match uri.split_once('?') { |
| 727 | Some((p, q)) => (p, Some(q)), |
| 728 | None => (uri, None), |
| 729 | }; |
| 730 | |
| 731 | // Rewrite path segments |
| 732 | let (resolved_path, redacted_path) = match rewrite_uri_path(path, resolver)? { |
| 733 | Some((resolved, redacted)) => (resolved, redacted), |
| 734 | None => (path.to_string(), path.to_string()), |
| 735 | }; |
| 736 | |
| 737 | // Rewrite query params |
| 738 | let (resolved_query, redacted_query) = match query { |
| 739 | Some(q) => match rewrite_uri_query_params(q, resolver)? { |
| 740 | Some((resolved, redacted)) => (Some(resolved), Some(redacted)), |
| 741 | None => (Some(q.to_string()), Some(q.to_string())), |
| 742 | }, |
| 743 | None => (None, None), |
| 744 | }; |
| 745 | |
| 746 | // Reassemble |
| 747 | let resolved_uri = if let Some(q) = resolved_query.as_ref() { |
| 748 | format!("{resolved_path}?{q}") |
| 749 | } else { |
| 750 | resolved_path |
| 751 | }; |
| 752 | let redacted_uri = match &redacted_query { |
| 753 | Some(q) => format!("{redacted_path}?{q}"), |
| 754 | None => redacted_path, |
no test coverage detected