Skip to content

Commit 2d5d156

Browse files
Emilgardissyphar
authored andcommitted
code review
1 parent c9b0816 commit 2d5d156

File tree

2 files changed

+46
-39
lines changed

2 files changed

+46
-39
lines changed

src/web/releases.rs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -584,24 +584,22 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
584584
return redirect_to_random_crate(req, &mut conn);
585585
}
586586

587-
let (krate, mut query) = match query.split_once("::") {
588-
Some((krate, query)) => (krate.to_string(), format!("?search={query}")),
589-
None => (query.clone(), "".to_string()),
590-
};
587+
let mut queries = std::collections::BTreeMap::new();
591588

592-
for (k, v) in params
593-
.iter()
594-
.filter(|(k, _)| !matches!(k.as_ref(), "i-am-feeling-lucky" | "query"))
595-
{
596-
if query.is_empty() {
597-
query.push('?');
598-
} else {
599-
query.push('&')
589+
let krate = match query.split_once("::") {
590+
Some((krate, query)) => {
591+
queries.insert("search", query);
592+
krate.to_string()
600593
}
601-
query.push_str(k);
602-
query.push('=');
603-
query.push_str(v);
604-
}
594+
None => query.clone(),
595+
};
596+
597+
queries.extend(
598+
params
599+
.iter()
600+
.filter(|(k, _)| !matches!(k.as_ref(), "i-am-feeling-lucky" | "query"))
601+
.map(|(k, v)| (k.as_ref(), v.as_ref())),
602+
);
605603

606604
// since we never pass a version into `match_version` here, we'll never get
607605
// `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
@@ -613,10 +611,18 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
613611
let base = redirect_base(req);
614612
let url = if matchver.rustdoc_status {
615613
let target_name = matchver.target_name;
616-
ctry!(
617-
req,
618-
Url::parse(&format!("{base}/{krate}/{version}/{target_name}/{query}"))
619-
)
614+
let path = format!("{base}/{krate}/{version}/{target_name}/");
615+
if queries.is_empty() {
616+
ctry!(req, Url::parse(&path))
617+
} else {
618+
ctry!(
619+
req,
620+
Url::from_generic_url(ctry!(
621+
req,
622+
iron::url::Url::parse_with_params(&path, queries)
623+
))
624+
)
625+
}
620626
} else {
621627
ctry!(req, Url::parse(&format!("{base}/crate/{krate}/{version}")))
622628
};
@@ -914,7 +920,7 @@ mod tests {
914920
)?;
915921
assert_redirect(
916922
"/releases/search?query=some_random_crate::some::path",
917-
"/some_random_crate/1.0.0/some_random_crate/?search=some::path",
923+
"/some_random_crate/1.0.0/some_random_crate/?search=some%3A%3Apath",
918924
web,
919925
)?;
920926
Ok(())
@@ -929,7 +935,7 @@ mod tests {
929935

930936
assert_redirect(
931937
"/releases/search?query=some_random_crate::somepath&go_to_first=true",
932-
"/some_random_crate/1.0.0/some_random_crate/?search=somepath&go_to_first=true",
938+
"/some_random_crate/1.0.0/some_random_crate/?go_to_first=true&search=somepath",
933939
web,
934940
)?;
935941
Ok(())

src/web/rustdoc.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,30 +42,31 @@ static DOC_RUST_LANG_ORG_REDIRECTS: Lazy<HashMap<&str, &str>> = Lazy::new(|| {
4242
pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
4343
fn redirect_to_doc(
4444
req: &Request,
45-
mut url_str: String,
45+
url_str: String,
4646
permanent: bool,
4747
path_in_crate: Option<&str>,
4848
) -> IronResult<Response> {
49-
let mut question_mark = false;
49+
let mut queries: std::collections::BTreeMap<
50+
std::borrow::Cow<'_, str>,
51+
std::borrow::Cow<'_, str>,
52+
> = std::collections::BTreeMap::new();
5053
if let Some(path) = path_in_crate {
51-
url_str.push_str("?search=");
52-
url_str.push_str(path);
53-
question_mark = true;
54+
queries.insert("search".into(), path.into());
5455
}
55-
if let Some(query) = req.url.query() {
56-
if !question_mark {
57-
url_str.push('?');
58-
} else {
59-
url_str.push('&');
60-
}
61-
url_str.push_str(query);
62-
}
63-
let url = ctry!(req, Url::parse(&url_str));
56+
let url: iron::url::Url = req.url.clone().into();
57+
let query_pairs = url.query_pairs();
58+
queries.extend(query_pairs);
59+
let url = if queries.is_empty() {
60+
ctry!(req, iron::url::Url::parse(&url_str))
61+
} else {
62+
ctry!(req, iron::url::Url::parse_with_params(&url_str, queries))
63+
};
6464
let (status_code, max_age) = if permanent {
6565
(status::MovedPermanently, 86400)
6666
} else {
6767
(status::Found, 0)
6868
};
69+
let url = ctry!(req, Url::from_generic_url(url));
6970
let mut resp = Response::with((status_code, Redirect(url)));
7071
resp.headers
7172
.set(CacheControl(vec![CacheDirective::MaxAge(max_age)]));
@@ -1780,18 +1781,18 @@ mod test {
17801781
)?;
17811782
assert_redirect(
17821783
"/some_random_crate::some::path",
1783-
"/some_random_crate/latest/some_random_crate/?search=some::path",
1784+
"/some_random_crate/latest/some_random_crate/?search=some%3A%3Apath",
17841785
web,
17851786
)?;
17861787
assert_redirect(
17871788
"/some_random_crate::some::path?go_to_first=true",
1788-
"/some_random_crate/latest/some_random_crate/?search=some::path&go_to_first=true",
1789+
"/some_random_crate/latest/some_random_crate/?go_to_first=true&search=some%3A%3Apath",
17891790
web,
17901791
)?;
17911792

17921793
assert_redirect(
17931794
"/std::some::path",
1794-
"https://doc.rust-lang.org/stable/std/?search=some::path",
1795+
"https://doc.rust-lang.org/stable/std/?search=some%3A%3Apath",
17951796
web,
17961797
)?;
17971798

0 commit comments

Comments
 (0)